機(jī)器學(xué)習(xí)經(jīng)典算法-logistic回歸代碼詳解
一、算法簡要
我們希望有這么一種函數(shù):接受輸入然后預(yù)測出類別,這樣用于分類。這里,用到了數(shù)學(xué)中的sigmoid函數(shù),sigmoid函數(shù)的具體表達(dá)式和函數(shù)圖象如下:

可以較為清楚的看到,當(dāng)輸入的x小于0時(shí),函數(shù)值<0.5,將分類預(yù)測為0;當(dāng)輸入的x大于0時(shí),函數(shù)值>0.5,將分類預(yù)測為1。
1.1 預(yù)測函數(shù)的表示

1.2參數(shù)的求解

二、代碼實(shí)現(xiàn)
函數(shù)sigmoid計(jì)算相應(yīng)的函數(shù)值;gradAscent實(shí)現(xiàn)的batch-梯度上升,意思就是在每次迭代中所有數(shù)據(jù)集都考慮到了;而stoGradAscent0中,則是將數(shù)據(jù)集中的示例都比那里了一遍,復(fù)雜度大大降低;stoGradAscent1則是對隨機(jī)梯度上升的改進(jìn),具體變化是alpha每次變化的頻率是變化的,而且每次更新參數(shù)用到的示例都是隨機(jī)選取的。
from numpy import *
import matplotlib.pyplot as plt
def loadDataSet():
dataMat = []
labelMat = []
fr = open('testSet.txt')
for line in fr.readlines():
lineArr = line.strip('\n').split('\t')
dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])
labelMat.append(int(lineArr[2]))
fr.close()
return dataMat, labelMat
def sigmoid(inX):
return 1.0/(1+exp(-inX))
def gradAscent(dataMatIn, classLabels):
dataMatrix = mat(dataMatIn)
labelMat = mat(classLabels).transpose()
m,n=shape(dataMatrix)
alpha = 0.001
maxCycles = 500
weights = ones((n,1))
errors=[]
for k in range(maxCycles):
h = sigmoid(dataMatrix*weights)
error = labelMat - h
errors.append(sum(error))
weights = weights + alpha*dataMatrix.transpose()*error
return weights, errors
def stoGradAscent0(dataMatIn, classLabels):
m,n=shape(dataMatIn)
alpha = 0.01
weights = ones(n)
for i in range(m):
h = sigmoid(sum(dataMatIn[i]*weights))
error = classLabels[i] - h
weights = weights + alpha*error*dataMatIn[i]
return weights
def stoGradAscent1(dataMatrix, classLabels, numIter = 150):
m,n=shape(dataMatrix)
weights = ones(n)
for j in range(numIter):
dataIndex=range(m)
for i in range(m):
alpha= 4/(1.0+j+i)+0.01
randIndex = int(random.uniform(0,len(dataIndex)))
h = sigmoid(sum(dataMatrix[randIndex]*weights))
error = classLabels[randIndex]-h
weights=weights+alpha*error*dataMatrix[randIndex]
del(dataIndex[randIndex])
return weights
def plotError(errs):
k = len(errs)
x = range(1,k+1)
plt.plot(x,errs,'g--')
plt.show()
def plotBestFit(wei):
weights = wei.getA()
dataMat, labelMat = loadDataSet()
dataArr = array(dataMat)
n = shape(dataArr)[0]
xcord1=[]
ycord1=[]
xcord2=[]
ycord2=[]
for i in range(n):
if int(labelMat[i])==1:
xcord1.append(dataArr[i,1])
ycord1.append(dataArr[i,2])
else:
xcord2.append(dataArr[i,1])
ycord2.append(dataArr[i,2])
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(xcord1, ycord1, s=30, c='red', marker='s')
ax.scatter(xcord2, ycord2, s=30, c='green')
x = arange(-3.0,3.0,0.1)
y=(-weights[0]-weights[1]*x)/weights[2]
ax.plot(x,y)
plt.xlabel('x1')
plt.ylabel('x2')
plt.show()
def classifyVector(inX, weights):
prob = sigmoid(sum(inX*weights))
if prob>0.5:
return 1.0
else:
return 0
def colicTest(ftr, fte, numIter):
frTrain = open(ftr)
frTest = open(fte)
trainingSet=[]
trainingLabels=[]
for line in frTrain.readlines():
currLine = line.strip('\n').split('\t')
lineArr=[]
for i in range(21):
lineArr.append(float(currLine[i]))
trainingSet.append(lineArr)
trainingLabels.append(float(currLine[21]))
frTrain.close()
trainWeights = stoGradAscent1(array(trainingSet),trainingLabels, numIter)
errorCount = 0
numTestVec = 0.0
for line in frTest.readlines():
numTestVec += 1.0
currLine = line.strip('\n').split('\t')
lineArr=[]
for i in range(21):
lineArr.append(float(currLine[i]))
if int(classifyVector(array(lineArr), trainWeights))!=int(currLine[21]):
errorCount += 1
frTest.close()
errorRate = (float(errorCount))/numTestVec
return errorRate
def multiTest(ftr, fte, numT, numIter):
errors=[]
for k in range(numT):
error = colicTest(ftr, fte, numIter)
errors.append(error)
print "There "+str(len(errors))+" test with "+str(numIter)+" interations in all!"
for i in range(numT):
print "The "+str(i+1)+"th"+" testError is:"+str(errors[i])
print "Average testError: ", float(sum(errors))/len(errors)
'''''
data, labels = loadDataSet()
weights0 = stoGradAscent0(array(data), labels)
weights,errors = gradAscent(data, labels)
weights1= stoGradAscent1(array(data), labels, 500)
print weights
plotBestFit(weights)
print weights0
weights00 = []
for w in weights0:
weights00.append([w])
plotBestFit(mat(weights00))
print weights1
weights11=[]
for w in weights1:
weights11.append([w])
plotBestFit(mat(weights11))
'''
multiTest(r"horseColicTraining.txt",r"horseColicTest.txt",10,500)
總結(jié)
以上就是本文關(guān)于機(jī)器學(xué)習(xí)經(jīng)典算法-logistic回歸代碼詳解的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:
python中實(shí)現(xiàn)k-means聚類算法詳解
Python編程實(shí)現(xiàn)粒子群算法(PSO)詳解
如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
- Python語言描述機(jī)器學(xué)習(xí)之Logistic回歸算法
- python機(jī)器學(xué)習(xí)實(shí)戰(zhàn)之樹回歸詳解
- Python最火、R極具潛力 2017機(jī)器學(xué)習(xí)調(diào)查報(bào)告
- 機(jī)器學(xué)習(xí)的框架偏向于Python的13個(gè)原因
- Python機(jī)器學(xué)習(xí)之決策樹算法實(shí)例詳解
- python機(jī)器學(xué)習(xí)庫常用匯總
- 給你選擇Python語言實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法的三大理由
- 機(jī)器學(xué)習(xí)python實(shí)戰(zhàn)之手寫數(shù)字識別
相關(guān)文章
文件上傳服務(wù)器-jupyter 中python解壓及壓縮方式
這篇文章主要介紹了文件上傳服務(wù)器-jupyter 中python解壓及壓縮方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04
Keras自動下載的數(shù)據(jù)集/模型存放位置介紹
這篇文章主要介紹了Keras自動下載的數(shù)據(jù)集/模型存放位置介紹,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06
Python設(shè)置默認(rèn)編碼為utf8的方法
這篇文章主要介紹了Python設(shè)置默認(rèn)編碼為utf8的方法,結(jié)合實(shí)例形式分析了Python針對文件編碼的設(shè)置方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2016-07-07
在Linux命令行中運(yùn)行Python腳本的流程步驟
Python是一種高級編程語言,被廣泛應(yīng)用于數(shù)據(jù)科學(xué)、機(jī)器學(xué)習(xí)、Web 開發(fā)等領(lǐng)域,在Linux操作系統(tǒng)中,Python是一個(gè)默認(rèn)安裝的解釋器,用戶可以通過命令行界面(CLI)來運(yùn)行Python腳本,在本文中,我們將詳細(xì)介紹如何在Linux命令行中運(yùn)行Python腳本,需要的朋友可以參考下2023-11-11
Python實(shí)現(xiàn)快速計(jì)算詞頻功能示例
這篇文章主要介紹了Python實(shí)現(xiàn)快速計(jì)算詞頻功能,結(jié)合實(shí)例形式總結(jié)分析了Python使用nltk庫進(jìn)行詞頻計(jì)算功能的相關(guān)操作技巧,需要的朋友可以參考下2018-06-06
python實(shí)現(xiàn)sm2和sm4國密(國家商用密碼)算法的示例
這篇文章主要介紹了python實(shí)現(xiàn)sm2和sm4國密(國家商用密碼)算法的示例,幫助大家使用python加密文件,感興趣的朋友可以了解下2020-09-09
Python針對給定列表中元素進(jìn)行翻轉(zhuǎn)操作的方法分析
這篇文章主要介紹了Python針對給定列表中元素進(jìn)行翻轉(zhuǎn)操作的方法,結(jié)合實(shí)例形式分析了Python針對列表元素基于切片及遍歷輸出兩種翻轉(zhuǎn)操作實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2018-04-04

