【機(jī)器學(xué)習(xí)】算法原理詳細(xì)推導(dǎo)與實(shí)現(xiàn)(二):邏輯回歸
在上一篇算法中,線性回歸實(shí)際上是 連續(xù)型 的結(jié)果炕泳,即 ,而邏輯回歸的
是離散型物赶,只能取兩個(gè)值
橡庞,這可以用來處理一些分類的問題较坛。
logistic函數(shù)
我們可能會(huì)遇到一些分類問題,例如想要?jiǎng)澐?鳶尾花 的種類扒最,嘗試基于一些特征來判斷鳶尾花的品種丑勤,或者判斷上一篇文章中的房子,在6個(gè)月之后能否被賣掉吧趣,答案是 是 或者 否法竞,或者一封郵件是否是垃圾郵件耙厚。所以這里是 ,這里是
在一個(gè)分類問題中岔霸,
只能取兩個(gè)值0和1薛躬,這就是一個(gè)二元分類的問題,如下所示:
可以使用線性回歸對(duì)以上數(shù)值進(jìn)行劃分呆细,可以擬合出如下那么一條線型宝,用 作為臨界點(diǎn),如果
在這個(gè)臨界點(diǎn)的右側(cè)絮爷,那么
的值就是1趴酣,如果在臨界點(diǎn)的左側(cè),那么
的值就是0略水,所以確實(shí)會(huì)有一些人會(huì)這么做价卤,用線性回歸解決分類問題:
線性回歸解決分類問題,有時(shí)候它的效果很好渊涝,但是通常用線性回歸解決像這樣的分類問題會(huì)是一個(gè)很糟糕的主意慎璧,加入存在一個(gè)額外的訓(xùn)練樣本 ,如果現(xiàn)在對(duì)這個(gè)訓(xùn)練集合做線性擬合跨释,那么可能擬合出來那么一條直線:
這時(shí)候的臨界點(diǎn)估計(jì)已經(jīng)不太合適了胸私,可以知道線性回歸對(duì)于分類問題來說,不是一個(gè)很好的方法鳖谈。
假設(shè) 岁疼,當(dāng)如果已知
,那么至少應(yīng)該讓假設(shè)
預(yù)測(cè)出來的值不會(huì)比1大太多缆娃,也不會(huì)比0小太多捷绒,所以一般不會(huì)選擇線性函數(shù)作為假設(shè),而是會(huì)選擇一些稍微不同的函數(shù)圖像:
被稱為
sigmoid函數(shù)
贯要,也通常被稱為 logistic函數(shù)
暖侨,它的函數(shù)圖像是:
當(dāng) 變得非常小的時(shí)候,
會(huì)趨向于0崇渗,當(dāng)
變得非常大的時(shí)候字逗,
會(huì)趨向于1,它和縱軸相較于0.5宅广。
邏輯回歸
那么我們的假設(shè) 要嘗試估計(jì)
的概率葫掉,即:
以上可以把兩個(gè)公式合并簡寫為(如果那么公式為
;如果
那么公式為
):
如果對(duì)《概率論和數(shù)理統(tǒng)計(jì)》學(xué)得好的人不難看出跟狱,以上函數(shù)其實(shí)就是 伯努利分布 的函數(shù)俭厚。
對(duì)于每一個(gè)假設(shè)值,為了使每一次假設(shè)值更準(zhǔn)確驶臊,即當(dāng)
時(shí)估計(jì)函數(shù)
趨向于1套腹,當(dāng)
時(shí)估計(jì)函數(shù)
趨向于0绪抛。則對(duì)于每一個(gè)
,參數(shù)
的似然估計(jì)
為:
如果每一個(gè)都準(zhǔn)確电禀,即
趨向于1幢码,則應(yīng)該使似然估計(jì)
最大化,也就是轉(zhuǎn)化成熟悉的問題:求解
的極大似然估計(jì)尖飞。
為了調(diào)整參數(shù) 使似然估計(jì)
最大化症副,推導(dǎo)如下(取
是為了去掉疊乘方便計(jì)算):
為了使這個(gè)函數(shù)最大,同樣可以使用前面學(xué)習(xí)過的梯度下降算法使對(duì)數(shù)似然估計(jì)最大化贞铣。之前學(xué)習(xí)的是要使誤差和 最小化沮明,所以梯度下降的公式為:
而本次為了求解似然估計(jì)最大化辕坝,使用的是梯度上升:
對(duì)數(shù)似然性是和 有關(guān),同樣的為了計(jì)算 梯度上升 最快的方向荐健,要對(duì)上述公式求偏導(dǎo)得到極值酱畅,即是上升最快的方向:
則對(duì)于 m 個(gè)樣本,則有:
所以總結(jié)來說:
邏輯回歸假設(shè)數(shù)據(jù)服從伯努利分布江场,通過極大化似然函數(shù)的方法纺酸,運(yùn)用梯度下降來求解參數(shù)址否,來達(dá)到將數(shù)據(jù)二分類的目的。
邏輯回歸是分類為什么叫做回歸
簡單來回答佑附,其實(shí)logistic regression
是一種廣義線性模型樊诺,但是這個(gè)得到的輸出不在范圍[0,1](為什么需要是[0,1],因?yàn)槿绻龆诸惖脑挘?code>label是服從伯努利分布的)音同,為了使其輸出的結(jié)果在范圍[0,1]所以增加了
sigmoid
激活函數(shù)缸夹,對(duì)輸出值進(jìn)行再次激活痪寻。
從公式推理來說螺句,原始的回歸函數(shù)是:
其中
為了使其線性函數(shù)達(dá)到分類的效果,對(duì)其結(jié)果進(jìn)行類似一種“歸一化”的操作橡类,即增加激活函數(shù)
sigmoid
:
上面這個(gè)函數(shù)倒推回來就可以變化成:
看作樣本
為正例的可能性蛇尚,相應(yīng)的
就是樣本
為反例的可能性,兩者的比值
叫做幾率(odds)顾画,取對(duì)數(shù)
后叫做對(duì)數(shù)幾率(logistic odds)取劫,對(duì)數(shù)幾率與
是線性關(guān)系匆笤,所以可以稱作“回歸”。
鳶尾花分類
為了劃分 鳶尾花 的種類谱邪,嘗試基于一些特征來判斷鳶尾花的品種炮捧,選取100條鳶尾花數(shù)據(jù)集如下所示:
花萼長度(單位cm) | 花萼寬度(單位cm) | 種類 |
---|---|---|
5.1 | 3.5 | 0 |
4.9 | 3.0 | 0 |
4.7 | 3.2 | 0 |
7.0 | 3.2 | 1 |
6.4 | 3.2 | 1 |
... | ... | ... |
其中:
種類 | 含義 |
---|---|
0 | 山鳶尾(setosa) |
1 | 變色鳶尾(versicolor) |
2 | 維吉尼亞鳶尾(virginica) |
數(shù)據(jù)集的圖像分布為:
計(jì)算損失函數(shù):
# 損失函數(shù)
def computeCost(theta, X, y):
theta = np.matrix(theta)
X = np.matrix(X)
y = np.matrix(y)
first = np.multiply(-y, np.log(sigmoid(X * theta.T)))
second = np.multiply((1 - y), np.log(1 - sigmoid(X * theta.T)))
return np.sum(first - second) / (len(X))
梯度下降函數(shù)為:
# 梯度下降
def gradient(theta, X, y):
theta = np.matrix(theta)
X = np.matrix(X)
y = np.matrix(y)
parameters = int(theta.ravel().shape[1])
grad = np.zeros(parameters)
error = sigmoid(X * theta.T) - y
for i in range(parameters):
term = np.multiply(error, X[:, i])
grad[i] = np.sum(term) / len(X)
return grad
最終預(yù)測(cè)準(zhǔn)確率為:
accuracy = 99%
結(jié)果分類的圖像為:
數(shù)據(jù)和代碼下載請(qǐng)關(guān)注公眾號(hào)【 機(jī)器學(xué)習(xí)和大數(shù)據(jù)挖掘 】,后臺(tái)回復(fù)【 機(jī)器學(xué)習(xí) 】即可獲鹊胍: