機(jī)器學(xué)習(xí)經(jīng)典算法-logistic回歸代碼詳解
一、算法簡(jiǎn)要
我們希望有這么一種函數(shù):接受輸入然后預(yù)測(cè)出類別,這樣用于分類。這里,用到了數(shù)學(xué)中的sigmoid函數(shù),sigmoid函數(shù)的具體表達(dá)式和函數(shù)圖象如下:
可以較為清楚的看到,當(dāng)輸入的x小于0時(shí),函數(shù)值<0.5,將分類預(yù)測(cè)為0;當(dāng)輸入的x大于0時(shí),函數(shù)值>0.5,將分類預(yù)測(cè)為1。
1.1 預(yù)測(cè)函數(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則是對(duì)隨機(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回歸代碼詳解的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:
python中實(shí)現(xiàn)k-means聚類算法詳解
Python編程實(shí)現(xiàn)粒子群算法(PSO)詳解
如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
- Python語(yǔ)言描述機(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í)庫(kù)常用匯總
- 給你選擇Python語(yǔ)言實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法的三大理由
- 機(jī)器學(xué)習(xí)python實(shí)戰(zhàn)之手寫數(shù)字識(shí)別
相關(guān)文章
文件上傳服務(wù)器-jupyter 中python解壓及壓縮方式
這篇文章主要介紹了文件上傳服務(wù)器-jupyter 中python解壓及壓縮方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04Keras自動(dòng)下載的數(shù)據(jù)集/模型存放位置介紹
這篇文章主要介紹了Keras自動(dòng)下載的數(shù)據(jù)集/模型存放位置介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-06-06Python設(shè)置默認(rèn)編碼為utf8的方法
這篇文章主要介紹了Python設(shè)置默認(rèn)編碼為utf8的方法,結(jié)合實(shí)例形式分析了Python針對(duì)文件編碼的設(shè)置方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2016-07-07在Linux命令行中運(yùn)行Python腳本的流程步驟
Python是一種高級(jí)編程語(yǔ)言,被廣泛應(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-11Python實(shí)現(xiàn)快速計(jì)算詞頻功能示例
這篇文章主要介紹了Python實(shí)現(xiàn)快速計(jì)算詞頻功能,結(jié)合實(shí)例形式總結(jié)分析了Python使用nltk庫(kù)進(jìn)行詞頻計(jì)算功能的相關(guān)操作技巧,需要的朋友可以參考下2018-06-06python實(shí)現(xiàn)sm2和sm4國(guó)密(國(guó)家商用密碼)算法的示例
這篇文章主要介紹了python實(shí)現(xiàn)sm2和sm4國(guó)密(國(guó)家商用密碼)算法的示例,幫助大家使用python加密文件,感興趣的朋友可以了解下2020-09-09Python針對(duì)給定列表中元素進(jìn)行翻轉(zhuǎn)操作的方法分析
這篇文章主要介紹了Python針對(duì)給定列表中元素進(jìn)行翻轉(zhuǎn)操作的方法,結(jié)合實(shí)例形式分析了Python針對(duì)列表元素基于切片及遍歷輸出兩種翻轉(zhuǎn)操作實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2018-04-04