Classification and logistic regression

分類問題與linear regression問題比較相近,只是我們希望預測的 y 是少量的幾個離散值。本篇我們關注binary classification, yin {0,1} .其中1表示positive class,0表示negative class.


1 Logistic regression

儘管y的值域是少量離散值組成的集合,但我們可以採用線性回歸來解決分類問題,最後取 ar{y} 離0/1更近就取0/1,但是有兩個問題:

  1. 我們可以輕易的構造簡單的數據,使得線性回歸無法很好的擬合;
  2. 當已知 yin {0,1} 的情況下,線性擬合求出y大於1或者小於0是不合理的

邏輯回歸採用不同的hypotheses

h_{	heta}(x)=g(	heta^{T}x)=frac{1}{1+e^{-	heta^{T}x}}

其中 g(z)=frac{1}{1+e^{-z}} 稱為logistic function或者sigmoid function,函數圖像如下所示

2. logistic regression求解

在給出1中的模型之後,我們怎麼來選擇最合適的參數 	heta 使得預測效果最好,為了進行參數求解的推理,我們先給出一些假設如下。

假設

P(y=1|x;	heta)=h_{	heta}

P(y=0|x;	heta)=1-h_{	heta}(x)

則可以表述為 p(y|x;	heta)=(h_{	heta}(x))^{y}(1-h_{	heta}(x))^{1-y}

同時我們假設m個訓練樣本是獨立生成的,我們可以將參數的likelihood寫為

L(	heta)=p(ar{y}|X;	heta)=prod_{i=1}^{m}p(y^{(i)}|x^{(i)};	heta)

=prod_{i=1}^{m}(h_{	heta}(x^{(i)}))^{y^{(i)}}(1-h_{	heta}(x^{(i)}))^{(1-y^{(i)})}

與Probabilistic interpretation of linear regression中做法相同,我們最大化log likelihood,即

l(	heta)=logL(	heta)=sum_{i=1}^{m}{y^{(i)}logh(x^{(i)})+(1-y^{(i)})log(1-h(x^{(i)}))}

同樣使用梯度上升, 	heta_{j}:=	heta_{j}+alphacdotfrac{partial}{partial	heta_{j}}l(	heta)

我們將 l(	heta) 帶入上式即可得到:

即可得到 	heta_{j}:=	heta_{j}+alpha(y^{(i)}-h_{	heta}(x^{(i)}))x_{j}^{(i)}

3. 總結

問題1: 邏輯回歸問題求解與線性回歸問題求解有什麼不同?

回答:

邏輯回歸問題實際上是對樣本屬於某個類的可能性進行了回歸,然後假設在給定參數 	heta 和x下,y的分布是二項分布,然後將樣本 x^{(i)} 屬於類 y^{(i)} 的概率進行了累乘作為likelihood,然後參數 	heta 的取值是為了讓似然估計最大,也就是這組樣本成立的概率最大,採用了最大化對數似然估計的方法,當然也是採用梯度下降的搜索演算法進行求取。

而LMS是針對使 J(	heta)=frac{1}{2}sum_{i=1}^{m}{h_{	heta}(x^{(i)}-y^{(i)})}^{2} 這個損失函數最小來進行優化的,同樣採用了梯度下降的搜索演算法進行求解。

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 |