機器學習基礎:邏輯回歸

本文旨在通過二元分類問題介紹邏輯回歸演算法,並用tensorflow實現一個簡單的非命題的求解

在生活中,我們經常會碰到這樣的問題:

根據蘋果表皮顏色判斷是青蘋果還是紅蘋果

根據體溫判斷是否發燒

這種答案只有兩種可能的問題(y in {0,1}),被稱為二元分類問題

有一組數據:

(x,y) in {(1,0), (2,0), (3,0), (4,0), (5,0),

(6,1), (7,1), (8,1), (9,1), (10,1) }

這組數據在二維平面表現如下:

現在我們想找到一個函數來擬合以上數據

可能我們想用一個躍階函數來表達

函數圖差不多這樣

但是躍階函數有個致命的問題:不連續

這會導致在之後最小化cost function,也就是對cost function求導的時候出現問題

為了解決此問題,引入sigmoid函數

函數圖是一個漂亮的S形

圖片來自wiki

可以看出,當z(x)>0的時候,h(x)>0.5,由此判斷y=1

當z(x)<0的時候,h(x)<0.5,則判斷y=0

實際使用中,更多的把h(x)看做是y=1的概率,1-h(x)看做是y=0的概率

例如h(x)=0.6,意味著y=1的概率為60%,y=0的概率為40%

由此把二元分類問題轉化成了概率問題

那麼怎麼判斷我們預測的是否準確,換句話說該怎樣定義cost function呢

引入最大似然法

公式如下

其中 y是預測的值, y^{} 是實際的值

在此簡單說明一下最大似然法為何有效

先讓我們看一下-log(x)在0-1區間的函數圖像:

假設 y^{}=1,y=0.6

此時 J(theta)=0times log(0.4)+1times log(0.6)approx 0.22

假設 y^{}=1,y=1,也就是預測完全準確時

J(theta)=0times log(0)+1times log(1)=0

假設 y^{}=1,y=0,也就是預測完全錯誤時

J(theta)=0times log(1)+1times log(0)= +infty

可以看出,當我們預測得越準確時,cost function的值就越小;當預測錯誤時,cost function就會很大

所以問題就又來到了之前討論過的的最小化cost function上

可以使用前文說過的正規方程法,或者梯度下降法來最小化cost function

讓我們來看一個實例;下面是一個非命題(y=!x)

x=[0,1]

y=[1,0]

讓我們來嘗試這麼一組解: theta_{0}=10 , theta_{1}=-20

當x=0時

z(x)=theta_{0}+theta_{1}x=10+(-20*0)=10

h(x)=frac{1}{1+e^{-z(x)}}=frac{1}{1+e^{-10}}approx1

當x=1時

z(x)=theta_{0}+theta_{1}x=10+(-20*1)=-10

h(x)=frac{1}{1+e^{-z(x)}}=frac{1}{1+e^{10}}approx0

可以看到,這組解十分完美

具體的,如何求解,以下是實現代碼

import tensorflow as tfnntrain_X = [0.0, 1.0]ntrain_Y = [1.0, 0.0]nnn_samples = len(train_X) nlearning_rate = 0.1ntraining_epoch = 30000ndisplay_step = 100nnX = tf.placeholder("float")nY = tf.placeholder("float")nnW = tf.Variable(0.0)nb = tf.Variable(0.0)nnpred = tf.sigmoid(tf.multiply(W, X) + b)nncost_1 = tf.add(Y * tf.log(pred), (1 - Y) * tf.log(1 - pred)) ncost = tf.negative(tf.reduce_sum(cost_1))/ (2 * n_samples)noptimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)nninit = tf.global_variables_initializer()nnwith tf.Session() as sess:n sess.run(init)nn for epoch in range(training_epoch):n for (x, y) in zip(train_X, train_Y):n sess.run(optimizer, feed_dict={X: x, Y: y})n if epoch % display_step == 0:n print("W:", sess.run(W), ";b:", sess.run(b))n

可以看到輸出的W與b在循環多次之後依然反覆更新,這主要是因為sigmoid函數的特性決定的:sigmoid只是趨近於0和1,並不是等於,所以cost的值永遠不會是0

不過這並不妨礙我們在實際項目工程中使用sigmoid


推薦閱讀:

這個AI,能預知自己的未來。
李宏毅機器學習2016 第九講 卷積神經網路
直播預告 · Machine Learning Security & Taint Style Vulnerability Research - Week 17
Probably Approximately Correct

TAG:机器学习 | TensorFlow |