邏輯回歸(2018-11-4)
注:根據(jù)唐宇迪老師視頻總結(jié),如有侵權(quán),請聯(lián)系本人
一炼鞠、邏輯回歸相關(guān)概念
1.1邏輯回歸解決的問題
之前一章分析了線性回歸的解決方法,是通過誤差的高斯分布來推演出的損失函數(shù),但是存在數(shù)據(jù)樣本是否符合分布的問題,在邏輯回歸中.使用了sigmoid函數(shù)將線性問題轉(zhuǎn)化為非線性的二分類任務(wù),這樣的好處是不用考慮誤差分布,直接通過變換進(jìn)行概率求解.
1.2 sigmoid函數(shù)
表達(dá)式:
特點(diǎn):
- 自變量取值為任意實(shí)數(shù),值域[0,1].
- 將任意的輸入映射到[0,1]的區(qū)間,物理上可以解釋為由值到概率的轉(zhuǎn)換.
邏輯回歸實(shí)現(xiàn)思想:
- 定義預(yù)測函數(shù)(將線性函數(shù)代入sigmiod函數(shù)):
其中 .這里面的就是線性回歸問題中的要求得函數(shù).
預(yù)測函數(shù)可以看做將函數(shù)轉(zhuǎn)換到[0,1]區(qū)間上,以概率分布的模式表達(dá)結(jié)果.
所以在分類任務(wù)中,可以假設(shè)以下公式成立:
將(2),(3)式合并后得到:
1.3求解過程示例
根據(jù)(4)式求得似然函數(shù):
再對(5)式求對數(shù)似然,目的是將復(fù)雜度較高的乘法替換為簡單的加法:
- 由于梯度是上升的,若求為最大值,則可以引入轉(zhuǎn)為求梯度下降的任務(wù).自此,就可以通過梯度下降的方法獲得近似解了.
求解過程:
在中對求偏導(dǎo):
下面詳細(xì)對的求導(dǎo)過程做解釋:
- 對于分?jǐn)?shù)類導(dǎo)數(shù),求導(dǎo)公式為:
- 由于
所以對求導(dǎo)的過程如下:
然而
所以,結(jié)合(7),(11),(12)式,得出下式結(jié)論:
其中,
公式化簡后,就可以使用梯度下降的方法對參數(shù)進(jìn)行迭代更新,最終獲得一個(gè)最優(yōu)的
其中 是步長,(13)式的結(jié)論是梯度下降的方向,最后求解的最優(yōu)解.
1.4python實(shí)例
數(shù)據(jù):考試成績,每組兩門課,如果被錄取則標(biāo)記為1,未錄取則為0.
目的:根據(jù)已有數(shù)據(jù)評估新數(shù)據(jù)是否會(huì)被錄取.
思想:在已有數(shù)據(jù)上進(jìn)行邏輯回歸訓(xùn)練,獲得理想的值.
數(shù)據(jù):
成績1 | 成績2 | 是否錄取 |
---|---|---|
34.623660 | 78.024693 | 0 |
30.286711 | 43.894998 | 0 |
35.847409 | 72.902198 | 0 |
60.182599 | 86.308552 | 1 |
79.032736 | 75.344376 | 1 |
簡單起見,只取了代碼中的五組數(shù)據(jù),僅做示范.
step 1 構(gòu)造sigmoid函數(shù)(根據(jù)(0)式)
def sigmoid(z):
return 1 / (1 + np.exp(-z))
step 2 構(gòu)造預(yù)測函數(shù)(根據(jù)(1)式)
def model(X, theta):
return sigmoid(np.dot(X, theta.T))
step 3 構(gòu)造損失函數(shù)(根據(jù)(1)式)
def cost(X, y, theta):
left = np.multiply(-y, np.log(model(X, theta)))
#print(left.shape)
right = np.multiply(1 - y, np.log(1 - model(X, theta)))
#print(right.shape)
return np.sum(left - right) / (len(X))
step 4 求出的梯度方向(根據(jù)(13)式)
def gradient(X, y, theta):
grad = np.zeros(theta.shape)
error = (model(X, theta)- y).ravel()
for j in range(len(theta.ravel())):
term = np.multiply(error, X[:,j])
grad[0, j] = np.sum(term) / len(X)
return grad
step 5 運(yùn)用梯度下降方法求得最優(yōu)解(根據(jù)(14式))
def descent(data, theta,y,thresh,alpha):
#梯度下降求解
i = 0 # 迭代次數(shù)
costs = [cost(data, y, theta)] # 損失值
while True:
grad = gradient(data, y, theta)
theta = theta - alpha*grad # 參數(shù)更新
costs.append(cost(data, y, theta)) # 計(jì)算新的損失
i += 1
if i>thresh: break
return theta, i-1, costs, grad
step6 代入數(shù)據(jù),進(jìn)行運(yùn)算
data=np.array([[1,34.623660,78.024693],[1,30.286711,43.894998],[1,35.847409,72.902198],
[1,60.182599,86.308552],[1,79.032736,75.344376]])
y=np.array([0,0,0,1,1]).reshape(-1,1)
theta=np.array([[0.5,0.5,0]])
theta, iter, costs, grad= descent(data, theta,y, 100, 0.00001)