【機(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í)就是
- 建立該模型的代價(jià)方程
Cost function - 通過對(duì)代價(jià)方程求導(dǎo),利用
求極值來優(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])移除字符串首尾特定的的字符
,默認(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形式如下:
h形式如下:
則error形式便很好得出:
求參數(shù)核心的一行是:
weights = weights + alpha * dataMatrix.transpose() * error
回顧上文提到的優(yōu)化參數(shù)方法
由可知,
剩余的可見Logistic回歸(二)