Logistic Regression Classifier逻辑回归
Logistic Regression Classifier邏輯回歸主要思想就是用最大似然概率方法構建出方程,為最大化方程,利用牛頓梯度上升求解方程參數。
- 優點:計算代價不高,易于理解和實現。
- 缺點:容易欠擬合,分類精度可能不高。
- 使用數據類型:數值型和標稱型數據。
介紹邏輯回歸之前,我們先看一問題,有個黑箱,里面有白球和黑球,如何判斷它們的比例。
我們從里面抓3個球,2個黑球,1個白球。這時候,有人就直接得出了黑球67%,白球占比33%。這個時候,其實這個人使用了最大似然概率的思想,通俗來講,當黑球是67%的占比的時候,我們抓3個球,出現2黑1白的概率最大。我們直接用公式來說明。
假設黑球占比為P,白球為1-P。于是我們要求解MAX(P*P*(1-P)),顯而易見P=67%(求解方法:對方程求導,使導數為0的P值即為最優解)
我們看邏輯回歸,解決的是二分類問題,是不是和上面黑球白球問題很像,是的,邏輯回歸也是最大似然概率來求解。
假設我們有n個獨立的訓練樣本{(x1, y1) ,(x2, y2),…, (xn, yn)},y={0, 1}。那每一個觀察到的樣本(xi, yi)出現的概率是:?
?
上面為什么是這樣呢?當y=1的時候,后面那一項是不是沒有了,那就只剩下x屬于1類的概率,當y=0的時候,第一項是不是沒有了,那就只剩下后面那個x屬于0的概率(1減去x屬于1的概率)。所以不管y是0還是1,上面得到的數,都是(x, y)出現的概率。那我們的整個樣本集,也就是n個獨立的樣本出現的似然函數為(因為每個樣本都是獨立的,所以n個樣本出現的概率就是他們各自出現的概率相乘):?
這里我們稍微變換下L(θ):取自然對數,然后化簡(不要看到一堆公式就害怕哦,很簡單的哦,只需要耐心一點點,自己動手推推就知道了。注:有xi的時候,表示它是第i個樣本,下面沒有做區分了,相信你的眼睛是雪亮的),得到:
?
其中第三步到第四步使用了下面替換。?
?
這時候為求最大值,對L(θ)對θ求導,得到:?
?
然后我們令該導數為0,即可求出最優解。但是這個方程是無法解析求解(這里就不證明了)。?
最后問題變成了,求解參數使方程L最大化,求解參數的方法梯度上升法(原理這里不解釋了,看詳細的代碼的計算方式應該更容易理解些)。?
根據這個轉換公式?
?
我們代入參數和特征,求P,也就是發生1的概率。?
?
上面這個也就是常提及的sigmoid函數,俗稱激活函數,最后用于分類(若P(y=1|x;Θ?)大于0.5,則判定為1)。
下面是詳細的邏輯回歸代碼,代碼比較簡單,主要是要理解上面的算法思想。個人建議,可以結合代碼看一步一步怎么算的,然后對比上面推導公式,可以讓人更加容易理解,并加深印象。
from numpy import * filename='...\\testSet.txt' #文件目錄 def loadDataSet(): #讀取數據(這里只有兩個特征)dataMat = []labelMat = []fr = open(filename)for line in fr.readlines():lineArr = line.strip().split()dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #前面的1,表示方程的常量。比如兩個特征X1,X2,共需要三個參數,W1+W2*X1+W3*X2labelMat.append(int(lineArr[2]))return dataMat,labelMatdef sigmoid(inX): #sigmoid函數return 1.0/(1+exp(-inX))def gradAscent(dataMat, labelMat): #梯度上升求最優參數dataMatrix=mat(dataMat) #將讀取的數據轉換為矩陣classLabels=mat(labelMat).transpose() #將讀取的數據轉換為矩陣m,n = shape(dataMatrix)alpha = 0.001 #設置梯度的閥值,該值越大梯度上升幅度越大maxCycles = 500 #設置迭代的次數,一般看實際數據進行設定,有些可能200次就夠了weights = ones((n,1)) #設置初始的參數,并都賦默認值為1。注意這里權重以矩陣形式表示三個參數。for k in range(maxCycles):h = sigmoid(dataMatrix*weights)error = (classLabels - h) #求導后差值weights = weights + alpha * dataMatrix.transpose()* error #迭代更新權重return weightsdef stocGradAscent0(dataMat, labelMat): #隨機梯度上升,當數據量比較大時,每次迭代都選擇全量數據進行計算,計算量會非常大。所以采用每次迭代中一次只選擇其中的一行數據進行更新權重。dataMatrix=mat(dataMat)classLabels=labelMatm,n=shape(dataMatrix)alpha=0.01maxCycles = 500weights=ones((n,1))for k in range(maxCycles):for i in range(m): #遍歷計算每一行h = sigmoid(sum(dataMatrix[i] * weights))error = classLabels[i] - hweights = weights + alpha * error * dataMatrix[i].transpose()return weightsdef stocGradAscent1(dataMat, labelMat): #改進版隨機梯度上升,在每次迭代中隨機選擇樣本來更新權重,并且隨迭代次數增加,權重變化越小。dataMatrix=mat(dataMat)classLabels=labelMatm,n=shape(dataMatrix)weights=ones((n,1))maxCycles=500for j in range(maxCycles): #迭代dataIndex=[i for i in range(m)]for i in range(m): #隨機遍歷每一行alpha=4/(1+j+i)+0.0001 #隨迭代次數增加,權重變化越小。randIndex=int(random.uniform(0,len(dataIndex))) #隨機抽樣h=sigmoid(sum(dataMatrix[randIndex]*weights))error=classLabels[randIndex]-hweights=weights+alpha*error*dataMatrix[randIndex].transpose()del(dataIndex[randIndex]) #去除已經抽取的樣本return weightsdef plotBestFit(weights): #畫出最終分類的圖import matplotlib.pyplot as pltdataMat,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 main():dataMat, labelMat = loadDataSet()weights=gradAscent(dataMat, labelMat).getA()plotBestFit(weights)if __name__=='__main__':main()- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
跑完代碼結果:?
當然,還可以換隨機梯度上升和改進的隨機梯度上升算法試試,效果都還不錯。?
下面是代碼使用的數據,可以直接復制本地text里面,跑上面代碼。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
參考:?
-?http://blog.csdn.net/zouxy09/article/details/20319673?
- Machine Learning in Action?
- 統計學習方法
總結
以上是生活随笔為你收集整理的Logistic Regression Classifier逻辑回归的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 逻辑回归(Logistic Regres
- 下一篇: 逻辑回归的通俗解释 逻辑回归的定位