機器學習筆記——初識邏輯回歸、兩種方法推導梯度公式

? ???作者:奶糖貓
? ? ?來源:奶糖貓
一、算法概述
邏輯回歸(Logistic)雖帶有回歸二字,但它卻是一個經(jīng)典的二分類算法,它適合處理一些二分類任務,例如疾病檢測、垃圾郵件檢測、用戶點擊率以及上文所涉及的正負情感分析等等。首先了解一下何為回歸?假設現(xiàn)在有一些數(shù)據(jù)點,我們利用一條直線對這些點進行擬合(該線稱為最佳擬合直線),這個擬合的過程就稱作回歸。利用邏輯回歸進行分類的主要思想是:根據(jù)現(xiàn)有數(shù)據(jù)對分類邊界線建立回歸公式,以此進行分類。線性回歸算法后面的筆記會介紹,這里簡單對比一下兩者,邏輯回歸和線性回歸的本質相同,都意在擬合一條直線,但線性回歸的目的是擬合輸入變量的分布,盡可能讓所有樣本到該條直線的距離最短;而邏輯回歸的目的是擬合決策邊界,使數(shù)據(jù)集中不同的樣本盡可能分開,所以兩個算法的目的是不同的,處理的問題也不同。二、Sigmoid函數(shù)與相關推導
我們想要的函數(shù)應該是,能接受所有的輸入并且預測出類別,比如二分類中的0或者1、正或者負,這種性質的函數(shù)被稱為海維賽德階躍函數(shù),圖像如下:



它表示將這兩個數(shù)值向量對應元素相乘然后全部相加起來得到z值,其中向量x是分類器的輸入數(shù)據(jù),向量w就是我們要找到的能使分類器盡可能準確的最佳參數(shù)。
由上述公式就可得:


為了運算便捷,我們將其整合為一個公式,如下:

可以看出當y=1時,加號后面式子的值為0;當y=0時,加號前面式子的值為0,這與上文分類式子達到的效果是一樣的。L(w)稱為似然函數(shù),l(w)稱為對數(shù)似然函數(shù),是依據(jù)最大似然函數(shù)推導而成。此時的應用是梯度上升求最大值,如果梯度下降求最小值,可在公式之前乘以。為了學習嘛,這里再介紹一下另一種方式,利用損失函數(shù)推導應用于梯度下降的公式;損失函數(shù)是衡量真實值與預測值之間差距的函數(shù),所以損失函數(shù)值越小,對應模型的效果也越好,損失函數(shù)公式如下:



三、梯度
3.1梯度上升
上面已經(jīng)列出了一大堆的公式,難道這又要開始一連串的大公式?






3.2梯度下降
如果利用將對數(shù)似然函數(shù)換成損失函數(shù),則得到的是有關計算梯度下降的公式,如下:


四、算法應用
4.1數(shù)據(jù)概覽
有這樣一份數(shù)據(jù)集,共100個樣本、兩個特征(X1與X2)以及一個分類標簽,部分數(shù)據(jù)和所繪制圖像如下:| X1 | X2 | 類別 |
|---|---|---|
| 0.197445 | 9.744638 | 0 |
| 0.078557 | 0.059736 | 1 |
| -1.099458 | 1.688274 | 1 |
| 1.319944 | 2.171228 | 1 |
| -0.783277 | 11.009725 | 0 |

每個回歸系數(shù)初始化為1
重復R次:
計算整個數(shù)據(jù)集的梯度
使用alpha*gradient更新回歸系數(shù)的向量
返回回歸系數(shù)
4.2加載數(shù)據(jù)集
def loadDataSet():
dataMat = [] # 創(chuàng)建數(shù)據(jù)列表
labelMat = [] # 創(chuàng)建標簽列表
fr = open('LRData.txt','r',encoding='utf-8')
#逐行讀取全部數(shù)據(jù)
for line in fr.readlines():
#將數(shù)據(jù)分割、存入列表
lineArr = line.strip().split()
#數(shù)據(jù)存入數(shù)據(jù)列表
dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])
#標簽存入標簽列表
labelMat.append(int(lineArr[2]))
fr.close()
return dataMat, labelMat
loadDataSet函數(shù)的作用是打開存儲數(shù)據(jù)的文本文件并逐行讀取。每行的前兩個值分別對應X1和X2,第三個值是數(shù)據(jù)對應的類別標簽。為了方便計算,函數(shù)還在X1和X2之前添加了一個值為1.0的X1,X1可以理解為偏置,即下圖中的x0。
4.3訓練算法
#sigmoid函數(shù)
def sigmoid(inX):
return 1.0 / (1 + np.exp(-inX))
sigmoid函數(shù)就是傳入一個參數(shù)(這里是一個100x1的向量),通過公式計算并返回值。def gradAscent(dataMatIn, classLabels):
# 將列表轉換成numpy的matrix(矩陣)
dataMatrix = np.mat(dataMatIn)
# 將列表轉換成numpy的mat,并進行轉置
labelMat = np.mat(classLabels).T
# 獲取dataMatrix的行數(shù)和列數(shù)。
m, n = np.shape(dataMatrix)
# 設置每次移動的步長
alpha = 0.001
# 設置最大迭代次數(shù)
maxCycles = 500
# 創(chuàng)建一個n行1列都為1的矩陣
weights = np.ones((n,1))
for k in range(maxCycles):
# 公式中hΘ(x)
h = sigmoid(dataMatrix * weights)
# 誤差,即公式中y-hΘ(x)
error = labelMat - h
# 套入整體公式
weights = weights + alpha * dataMatrix.T * error
return weights
最后weights返回的是一個3x1的矩陣,運行截圖如下:



4.4繪制決策邊界
def plotDataSet(weight):
#獲取權重數(shù)組
weight = weight.getA()
# 加載數(shù)據(jù)和標簽
dataMat, labelMat = loadDataSet()
# 將列表轉換成numpy的array數(shù)組
dataArr = np.array(dataMat)
#獲取樣本個數(shù)
n = np.shape(dataMat)[0]
#創(chuàng)建4個空列表,1代表正樣本、0代表負樣本
xcord1 = []; ycord1 = []
xcord0 = []; ycord0 = []
# 遍歷標簽列表,根據(jù)數(shù)據(jù)的標簽進行分類
for i in range(n):
if int(labelMat[i]) == 1:
# 如果標簽為1,將數(shù)據(jù)填入xcord1和ycord1
xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])
else:
# 如果標簽為0,將數(shù)據(jù)填入xcord0和ycord0
xcord0.append(dataArr[i,1]); ycord0.append(dataArr[i,2])
#繪制圖像
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = '*',label = 'Class1')
ax.scatter(xcord0, ycord0, s = 20, c = 'green',marker = 's',label = 'Class2')
#繪制直線,sigmoid設置為0
x = np.arange(-3.0, 3.0, 0.1)
y = (-weight[0] - weight[1] * x) / weight[2]
ax.plot(x, y)
#標題、x標簽、y標簽
plt.title('LRData')
plt.legend(loc='upper left')
plt.xlabel('X1'); plt.ylabel('X2')
plt.savefig("E:\machine_learning\LR03.jpg")
plt.show()
這部分代碼唯一需要注意的是,將sigmoid的值設置為0,可以回憶一下文章剛開始時的Sigmoid函數(shù)圖像,0是兩個分類的分界處。因此,我們設定,的值為1,所以已知回歸系數(shù),就可求得和的關系式,從而畫出決策邊界。
五、文末總結
本文所講的梯度上升公式,屬于批量梯度上升,此外還有隨機梯度上升、小批量梯度上升,而批量梯度上升每次計算都要計算所有的樣本,所以程序計算過程是十分復雜的,并且容易收斂到局部最優(yōu),而隨機梯度上升將會對算法進行調優(yōu),下一篇文章將會介紹隨機梯度上升,并分析兩者之間的區(qū)別。◆?◆?◆ ?◆?◆
長按二維碼關注我們
數(shù)據(jù)森麟公眾號的交流群已經(jīng)建立,許多小伙伴已經(jīng)加入其中,感謝大家的支持。大家可以在群里交流關于數(shù)據(jù)分析&數(shù)據(jù)挖掘的相關內容,還沒有加入的小伙伴可以掃描下方管理員二維碼,進群前一定要關注公眾號奧,關注后讓管理員幫忙拉進群,期待大家的加入。
管理員二維碼:
評論
圖片
表情
