機器學習基礎:邏輯回歸
本文旨在通過二元分類問題介紹邏輯回歸演算法,並用tensorflow實現一個簡單的非命題的求解
在生活中,我們經常會碰到這樣的問題:
根據蘋果表皮顏色判斷是青蘋果還是紅蘋果
根據體溫判斷是否發燒
這種答案只有兩種可能的問題(y {0,1}),被稱為二元分類問題
有一組數據:
(x,y) {(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形
可以看出,當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是預測的值, 是實際的值
在此簡單說明一下最大似然法為何有效
先讓我們看一下-log(x)在0-1區間的函數圖像:
假設 =1,y=0.6
此時
假設 =1,y=1,也就是預測完全準確時
假設 =1,y=0,也就是預測完全錯誤時
可以看出,當我們預測得越準確時,cost function的值就越小;當預測錯誤時,cost function就會很大
所以問題就又來到了之前討論過的的最小化cost function上
可以使用前文說過的正規方程法,或者梯度下降法來最小化cost function
讓我們來看一個實例;下面是一個非命題(y=!x)
x=[0,1]
y=[1,0]
讓我們來嘗試這麼一組解: ,
當x=0時
當x=1時
可以看到,這組解十分完美
具體的,如何求解,以下是實現代碼
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 |