摘要:由于近期學(xué)業(yè)繁重,所以我就不說廢話了,直接上代碼回歸進(jìn)行分類分類效果回歸預(yù)測(cè)病馬的死亡率預(yù)測(cè)結(jié)果全部代碼使用梯度上升法找到最佳參數(shù)使用梯度上升法找到最佳回歸系數(shù),也就是擬合回歸模型的最佳參數(shù)歸回梯度上升優(yōu)化算法加載文件打開文本文件逐行讀取為
由于近期學(xué)業(yè)繁重QAQ,所以我就不說廢話了,直接上代碼~
Logistic回歸進(jìn)行分類 分類效果from numpy import * import matplotlib.pyplot as plt #使用梯度上升法找到最佳參數(shù) #使用梯度上升法找到最佳回歸系數(shù), #也就是擬合Logistic回歸模型的最佳參數(shù) #Logistic歸回梯度上升優(yōu)化算法 #加載文件 def loadDataSet(): dataMat=[];labelMat=[] #打開文本文件 fr=open("testSet.txt") #逐行讀取 for line in fr.readlines(): lineArr=line.strip().split() #為了方便計(jì)算,將x0設(shè)為1,后面的x1,x2是文本中每行的前兩個(gè)值 dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #文本中每行的第三個(gè)值為數(shù)據(jù)對(duì)應(yīng)的標(biāo)簽 labelMat.append(int(lineArr[2])) return dataMat,labelMat #sigmiod函數(shù) def sigmoid(inX): return 1.0/(1+exp(-inX)) #梯度上升算法 #第一個(gè)參數(shù)是一個(gè)2維的Numpy數(shù)組 #每列表示不同的特征 #每行表示每個(gè)訓(xùn)練樣本 #我們采用100個(gè)樣本,包含兩個(gè)x1,x2特征 #再加上第0維特征x0,所以dataMatIn是一個(gè)100X3的矩陣 #第二個(gè)參數(shù)是類別標(biāo)簽,是一個(gè)1X100的行向量 def gradAscent(dataMatIn,classLabels): dataMatrix=mat(dataMatIn) #將行向量轉(zhuǎn)置為列向量 labelMat=mat(classLabels).transpose() #得到矩陣的大小 m,n=shape(dataMatrix) #向目標(biāo)移動(dòng)的步長 alpha=0.001 #迭代次數(shù) maxCycles=500 weights=ones((n,1)) #在for循環(huán)結(jié)束之后,將返回訓(xùn)練好的回歸系數(shù) for k in range(maxCycles): #注:此處是矩陣相乘 #h是一個(gè)列向量,元素的個(gè)數(shù)等于樣本的個(gè)數(shù) h=sigmoid(dataMatrix*weights) #真實(shí)類別與預(yù)測(cè)類別的差別 error=(labelMat-h) #按照該差別的方向調(diào)整回歸系數(shù) weights=weights+alpha*dataMatrix.transpose()*error #返回回歸系數(shù)——確定了不同類別數(shù)據(jù)之間的分割線 return weights #畫出決策邊界 #畫出數(shù)據(jù)集和Logistic回歸最佳擬合直線的函數(shù) #X1表示一個(gè)特征,X2表示另一個(gè)特征 def plotBestFit(weights): #得到數(shù)據(jù)集與標(biāo)簽 dataMat,labelMat=loadDataSet() dataArr = array(dataMat) n = shape(dataArr)[0] xcord1 = []; ycord1 = [] xcord2 = []; ycord2 = [] #對(duì)數(shù)據(jù)集進(jìn)行分類 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) #根據(jù)gradAscent得到的回歸系數(shù)繪制分割線 y = (-weights[0]-weights[1]*x)/weights[2] #print(x) #print(y) ax.plot(x, y) plt.xlabel("X1"); plt.ylabel("X2"); plt.show() #梯度上升方法在每次更新回歸系數(shù)時(shí)都需要遍歷整個(gè)數(shù)據(jù)集 #改進(jìn)方法:一次僅使用一個(gè)樣本點(diǎn)來更新回歸系數(shù)——隨機(jī)梯度上升算法 #由于可以在新樣本到來時(shí)對(duì)分類器進(jìn)行增量式更新,因此隨機(jī)梯度上升 #算法是一個(gè)在線學(xué)習(xí)算法 #與“在線學(xué)習(xí)”相對(duì)應(yīng),一次數(shù)里所有數(shù)據(jù)被稱作“批處理” #隨機(jī)梯度上升算法 def stocGradAscent0(dataMatrix,classLabels): #得到矩陣的大小 m,n=shape(dataMatrix) #向目標(biāo)移動(dòng)的步長 alpha=0.01 weights=ones(n) for i in range(m): #h為向量 h=sigmoid(sum(dataMatrix[i]*weights)) #error為向量 error=classLabels[i]-h weights=weights+alpha*error*dataMatrix[i] return weights #由于經(jīng)過測(cè)試,多次迭代后,X0,X1收斂速度較小 #且存在一些小的周期性的波動(dòng),因此及逆行改進(jìn) #改進(jìn)隨機(jī)梯度上升算法 #第三個(gè)參數(shù)為迭代次數(shù) def stocGradAscent1(dataMatrix,classLabels,numIter=150): m,n=shape(dataMatrix) weights=ones(n) for j in range(numIter): dataIndex=list(range(m)) for i in range(m): #改進(jìn)1:alpha[向目標(biāo)移動(dòng)的步長]會(huì)隨著迭代的次數(shù)不斷減小 #可以緩解數(shù)據(jù)波動(dòng)或高頻波動(dòng), alpha=4/(1.0+j+i)+0.01 #通過隨機(jī)選取樣本來更新回歸系數(shù) #可以減少周期性的波動(dòng) 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 #Logistic回歸預(yù)測(cè)病馬的死亡率 #對(duì)于缺失數(shù)據(jù),我們選擇用0來替換 #因?yàn)檫@樣不會(huì)影響系數(shù)weights的值 #對(duì)于標(biāo)簽已經(jīng)丟失的,我們將這條數(shù)據(jù)丟棄 #使用Logistic回歸進(jìn)行分類的主要思路: #把測(cè)試集上每個(gè)特征向量乘最優(yōu)方法得到的回歸系數(shù) #再將該乘積結(jié)果求和,最后輸入Sigmoid函數(shù)中即可, #若對(duì)應(yīng)的sigmoid值>0.5預(yù)測(cè)類別標(biāo)簽為1,否則為0 #Logistic回歸分類函數(shù) def classifyVector(inX,weights): #以回歸系數(shù)和特征向量作為輸入來計(jì)算對(duì)應(yīng)的Sigmoid值 prob=sigmoid(sum(inX*weights)) if prob>0.5:return 1.0 else:return 0.0 #打開測(cè)試集和訓(xùn)練集,并對(duì)數(shù)據(jù)進(jìn)行格式化處理 def colicTest(): frTrain=open("horseColicTraining.txt") frTest=open("horseColicTest.txt") trainingSet=[] trainingLabels=[] #遍歷每一行 for line in frTrain.readlines(): currLine=line.strip().split(" ") lineArr=[] #遍歷每一列 for i in range(21): lineArr.append(float(currLine[i])) trainingSet.append(lineArr) #最后一列為類別標(biāo)簽 trainingLabels.append(float(currLine[21])) #計(jì)算回歸系數(shù)向量 trainWeights=stocGradAscent1(array(trainingSet),trainingLabels,500) errorCount=0 numTestVec=0.0 for line in frTest.readlines(): numTestVec+=1.0 currLine=line.strip().split(" ") lineArr=[] for i in range(21): lineArr.append(float(currLine[i])) #對(duì)測(cè)試集進(jìn)行分類,并查看結(jié)果是否正確 if int(classifyVector(array(lineArr),trainWeights))!=int(currLine[21]): errorCount+=1 #計(jì)算錯(cuò)誤率 errorRate=(float(errorCount)/numTestVec) print("the error rate of this test is: %f"%errorRate) return errorRate #調(diào)用colicTest函數(shù)10次,并且結(jié)果的平均值 def multiTest(): numTests=10 errorSum=0.0 for k in range(numTests): errorSum+=colicTest() print("after %d iterations the average error rate is: %f"%(numTests,errorSum/float(numTests))) def main(): #dataArr,labelMat=loadDataSet() #weights=gradAscent(dataArr,labelMat) #print(weights) #plotBestFit(weights.getA()) #weights=stocGradAscent0(array(dataArr),labelMat) #weights=stocGradAscent1(array(dataArr),labelMat) #plotBestFit(weights) multiTest() if __name__=="__main__": main()
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/43467.html
摘要:根據(jù)錯(cuò)誤率決定是否回退到訓(xùn)練階段,通過改變迭代的次數(shù)和步長等參數(shù)來得到更好的回歸系數(shù)。使用回歸方法進(jìn)行分類所需做的是把測(cè)試集上每個(gè)特征向量乘以最優(yōu)化方法得來的回歸系數(shù),再將該乘積結(jié)果求和,最后輸入到函數(shù)即可。 本篇內(nèi)容為《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》第 5 章 Logistic 回歸程序清單。 書中所用代碼為 python2,下面給出的程序清單是在 python3 中實(shí)踐改過的代碼,希望對(duì)你有幫助。...
閱讀 3163·2023-04-25 18:22
閱讀 2398·2021-11-17 09:33
閱讀 3320·2021-10-11 10:59
閱讀 3243·2021-09-22 15:50
閱讀 2816·2021-09-10 10:50
閱讀 866·2019-08-30 15:53
閱讀 455·2019-08-29 11:21
閱讀 2919·2019-08-26 13:58