Classification and logistic regression
分類問題與linear regression問題比較相近,只是我們希望預測的 是少量的幾個離散值。本篇我們關注binary classification, .其中1表示positive class,0表示negative class.
1 Logistic regression
儘管y的值域是少量離散值組成的集合,但我們可以採用線性回歸來解決分類問題,最後取 離0/1更近就取0/1,但是有兩個問題:
- 我們可以輕易的構造簡單的數據,使得線性回歸無法很好的擬合;
- 當已知 的情況下,線性擬合求出y大於1或者小於0是不合理的
邏輯回歸採用不同的hypotheses
其中 稱為logistic function或者sigmoid function,函數圖像如下所示
2. logistic regression求解
在給出1中的模型之後,我們怎麼來選擇最合適的參數 使得預測效果最好,為了進行參數求解的推理,我們先給出一些假設如下。
假設
則可以表述為
同時我們假設m個訓練樣本是獨立生成的,我們可以將參數的likelihood寫為
與Probabilistic interpretation of linear regression中做法相同,我們最大化log likelihood,即
同樣使用梯度上升,
我們將 帶入上式即可得到:
即可得到
3. 總結
問題1: 邏輯回歸問題求解與線性回歸問題求解有什麼不同?
回答:
邏輯回歸問題實際上是對樣本屬於某個類的可能性進行了回歸,然後假設在給定參數 和x下,y的分布是二項分布,然後將樣本 屬於類 的概率進行了累乘作為likelihood,然後參數 的取值是為了讓似然估計最大,也就是這組樣本成立的概率最大,採用了最大化對數似然估計的方法,當然也是採用梯度下降的搜索演算法進行求取。
而LMS是針對使 這個損失函數最小來進行優化的,同樣採用了梯度下降的搜索演算法進行求解。
4. tensorflow實現
#! /usr/local/bin/pythonimport tensorflow as tfW = tf.Variable([.3], dtype = tf.float32)b = tf.Variable([.3], dtype = tf.float32)x = tf.placeholder(tf.float32)y = tf.placeholder(tf.float32)x_train=[1,2,5,6]y_train=[0,0,1,1]linear_model = W * x + bp1 = tf.sigmoid(linear_model)loss = -1*tf.reduce_sum(y*tf.log(p1) + (1-y)* tf.log(1-p1))init = tf.global_variables_initializer()sess = tf.Session()sess.run(init)# optimizeroptimizer = tf.train.GradientDescentOptimizer(0.2)train = optimizer.minimize(loss)for i in range(10000): sess.run(train,{x:x_train,y:y_train}) if 00 in str(i): print sess.run(loss,{x:x_train,y:y_train})
推薦閱讀:
※TF Boys (TensorFlow Boys ) 養成記(二): TensorFlow 數據讀取
※TensorFlow(1)-AlexNet實現
※在UBUNTU 16.04上配置TensorFlow + cuDNN + CUDA深度學習系統(30分鐘傻瓜版)
※驗證碼識別(1) -- 1 個字元,1 個 softmax 層,正確率 92%
TAG:機器學習 | TensorFlow |