【機(jī)器學(xué)習(xí)實(shí)戰(zhàn)】Logistic回歸(一)

【機(jī)器學(xué)習(xí)實(shí)戰(zhàn)】Logistic回歸


全部程序均是依照《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》書寫,然后進(jìn)行了一些修改(順便鞏固python)


Logistic原理簡單解釋

作者在書中這樣描述Logistic回歸

根據(jù)現(xiàn)有數(shù)據(jù)對(duì)分類邊界線建立回歸公式,以此進(jìn)行分類
--《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》P73

這本書對(duì)于理論的東西介紹的實(shí)在不算多,讀到現(xiàn)在感覺作者想保持的狀態(tài)時(shí)在不影響編程基礎(chǔ)上盡可能的少,十分照顧我這種數(shù)學(xué)渣。

簡單的說,所謂Logistic回歸其實(shí)就是

  1. 建立該模型的代價(jià)方程Cost function J( w ) = \frac{1}{2} (f(z) - y)^2
  2. 通過對(duì)代價(jià)方程求導(dǎo),利用
    w = w \pm \alpha \Delta J(w)
    求極值來優(yōu)化參數(shù),使參數(shù)更好的反應(yīng)總體情況

程序抄寫與思考

程序剖析

數(shù)據(jù)載入

def loadDataSet():
    dataMat = []
    labelMat = []
    fr = open('/Users/macbookair/Documents/python/logRegres/testSet.txt')
    for line in fr.readlines():
        lineArr = line.strip().split()
        dataMat.append([1.0,float(lineArr[0]),float(lineArr[1])])
        labelMat.append(int(lineArr[2]))
    return dataMat,labelMat
  • 文件打開

    open(文件地址)
    

開始的時(shí)候一直不好使,總說找不到,后來直接在VS code 左側(cè)框選擇復(fù)制地址過來才有效

for line in fr.readlines()
- python中主要有三種讀取文件內(nèi)容方式:
    - read()
    - readline()
    - readlines()

不進(jìn)行重復(fù)造輪子,直接貼別人寫好的:
Python中read()、readline()和readlines()三者間的區(qū)別和用法

  • 輸入文字處理
    • strip函數(shù)
      簡單的使用方法為

          strip([chars])
      

      移除字符串首尾特定的的字符chars,默認(rèn)為空格

    • split函數(shù)

      簡單使用為:

           str.split(str="", num=string.count(str))
      

      str:分割符,默認(rèn)所有分割符
      num:分割次數(shù),默認(rèn)為-1,即分割所有

Logisitic核心程序

from numpy import *

def sigmoid(inX):       #?定義函數(shù)f()
    return 1.0/(1+exp(-inX))

def gradAscent(dataMatIn,classLabels):  #這里采用了梯度上升
                                        #其實(shí)無所謂了,主要保證的是取到極值
    dataMatrix = mat(dataMatIn) #轉(zhuǎn)換為Numpy矩陣
    labelMat = mat(classLabels).transpose() #transpose()進(jìn)行轉(zhuǎn)置
    m,n = shape(dataMatrix) #返回矩陣行、列數(shù)
    alpha = 0.001   #設(shè)置步長
    maxCycles = 500 
    weights = ones((n,1))
    for k in range(maxCycles):
        h = sigmoid(dataMatrix*weights)
        error = labelMat - h
        weights = weights + alpha * dataMatrix.transpose() * error  
        #書上沒有提如何得來的,后面猜一猜
    return weights


dataMatrix形式如下:

\left[ \begin{matrix}x_{00} & x_{01} & x_{02}\\x_{10} & x_{11} & x_{12}\\ \vdots&\vdots&\vdots \\x_{n0} & x_{n1} & x_{n2}\end{matrix} \right]

h形式如下:

\left[ \begin{matrix}\theta_{0} * x_{00} + \theta_{1} * x_{01} + \theta_{2} * x_{02}\\ \theta_{0} * x_{10} + \theta_{1} *x_{11} +\theta_{2} *x_{12}\\ \vdots \\\theta_{0} *x_{n0} + \theta_{1} * x_{n1} + \theta_{2} * x_{n2} \end{matrix} \right]

則error形式便很好得出:

\left[ \begin{matrix}label[0] - \theta_{0} *x_{00} - \theta_{1} * x_{01} - \theta_{2} * x_{02}\\label[1] - \theta_{0} * x_{10} - \theta_{1} *x_{11} -\theta_{2} *x_{12}\\ \vdots \\label[n] - \theta_{0} * x_{n0} - \theta_{1} * x_{n1} - \theta_{2} *x_{n2}\end{matrix} \right]

求參數(shù)核心的一行是:

    weights = weights + alpha * dataMatrix.transpose() * error 

回顧上文提到的優(yōu)化參數(shù)方法w = w \pm \alpha \Delta J(w)

J(w) = \frac{1}{2} ( f(z) - y)^2可知,\Delta J(w) = ( f(z) - y ) * z

剩余的可見Logistic回歸(二)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容