1. 程式人生 > >【機器學習實戰】Logistic迴歸 總結與思考

【機器學習實戰】Logistic迴歸 總結與思考

【機器學習實戰】Logistic迴歸

全部程式均是依照《機器學習實戰》書寫,然後進行了一些修改(順便鞏固python)

Logistic原理簡單解釋

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

根據現有資料對分類邊界線建立迴歸公式,以此進行分類

--《機器學習實戰》P73

這本書對於理論的東西介紹的實在不算多,讀到現在感覺作者想保持的狀態時在不影響程式設計基礎上儘可能的少,十分照顧我這種數學渣。

簡單的說,所謂Logistic迴歸其實就是

  1. 建立該模型的代價方程Cost function \[ Cost function = f(z) - y \]
  2. 通過對代價方程求導,利用
    \[w = w \pm \alpha \Delta f(w)\]

    求極值來優化引數,使引數更好的反應總體情況

程式抄寫與思考

程式剖析

資料載入

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(檔案地址)
    開始的時候一直不好使,總說找不到,後來直接在VS code 左側框選擇複製地址過來才有效

    for line in fr.readlines()
    • python中主要有三種讀取檔案內容方式:
      • read()
      • readline()
      • readlines()

不進行重複造輪子,直接貼別人寫好的:Python中read()、readline()和readlines()三者間的區別和用法

  • 輸入文書處理
    • strip函式

      簡單的使用方法為

          strip([chars])

      移除字串首尾特定的的字元\(chars\),預設為空格

    • split函式

      簡單使用為:

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

      str:分割符,預設所有分割符

      num:分割次數,預設為-1,即分割所有

Logisitic核心程式

from numpy import *

def sigmoid(inX):       #定義函式f()
    return 1.0/(1+exp(-inX))

def gradAscent(dataMatIn,classLabels):  #這裡採用了梯度上升
                                        #其實無所謂了,主要保證的是取到極值
    dataMatrix = mat(dataMatIn) #轉換為Numpy矩陣
    labelMat = mat(classLabels).transpose() #transpose()進行轉置
    m,n = shape(dataMatrix) #返回矩陣行、列數
    alpha = 0.001   #設定步長
    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}
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}
\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}
label[n] - \theta_{0} * x_{n0} + \theta_{1} * x_{n1} + \theta_{2} *x_{n2}
\end{matrix}
\right]
$$

求引數核心的一行是:

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

回顧上文提到的優化引數方法\(w = w \pm \alpha \Delta f(w)\)

未完待續