1. 程式人生 > >線性迴歸、梯度下降演算法與 tensorflow

線性迴歸、梯度下降演算法與 tensorflow

舉個栗子

考慮一個二手房交易記錄資料集. 已知房屋面積,臥室數量和交易價格:
這裡寫圖片描述
根據這個資料集,要求我們估算當前某個給定房屋價格. 我們應該怎麼做?

線性迴歸

迴歸就是根據已知資料來預測另一個數值型資料的目標值. 假設特徵和結果滿足線性關係:

h(x)=w0+w1x1+w2x2
其中 w 為權重. 假設 x0 為1, 則上面公式也可以寫作:
h(x)=i=0nwixi=wTx
其中 n 為引數個數. 現在模型的形式已經有了,剩下的就是根據已有資料計算出一個合適的 w.

損失函式

什麼樣的引數 w 才算是合適的呢? 直觀上看,如果有一組 w,使得在 訓練集上預測值和實際值之間的差異最小,則 w 就是最合適的. 我們選擇了差值的平方和作為衡量標準. 為了便於計算前面加常量 1/2.

J(w)=12i=1m(hw(x(i))y(i))2

梯度下降

損失函式 J(w) 是w 的函式,現在需要求使其達到最小值時的 w.
在一元函式 f(x) 求最小值問題中,我們可以從某個初始值 x0 開始,求f(x0), 然後向下降方向移動一段距離(走一步)得到 x1=x0f(x0),這樣一步一步走下去,就會距離目標值越來越近.
梯度同導數,只不過是在多維空間的導數. w 的更新可以用梯度下降來進行:

w=wαwJ(w)
梯度下降演算法整體表示如下:

Repeat until convergence {
w=wαwJ(w)
}

可以用圖示表示如下:
這裡寫圖片描述

tensorflow 實現線性迴歸

我們用 tensorflow 實現了線性迴歸. 這裡需要注意,我們使用了 AdamOptimizer,而不是標準的 GradientDescentOptimizer. AdamOptimizer 對梯度下降進行了部分優化. 在我們的例子裡,如果直接使用 GradientDescentOptimizer 返回的結果會得到 ‘nan’. 因此使用 AdamOptimizer 執行梯度下降.

import tensorflow as tf

W = tf.Variable(tf.ones([2,1]), tf.float32)
b = tf.Variable
([5.0], tf.float32) x = tf.placeholder(tf.float32, [None, 2]) y = tf.placeholder(tf.float32) y_ = tf.matmul(x, W) + b loss = tf.reduce_sum(tf.square(y_ - y)) #optimizer = tf.train.GradientDescentOptimizer(0.01) #optimizer = tf.train.AdagradOptimizer(0.01) optimizer = tf.train.AdamOptimizer(0.01) train = optimizer.minimize(loss) x_train = [ [2104, 3], [1600, 3], [2400,3], [1416,2], [3000,4] ] y_train = [400,330,369,232,540] init = tf.global_variables_initializer() sess = tf.Session() sess.run(init) for i in range(40000): curr_W, curr_b, _ = sess.run([W, b, train], {x:x_train, y:y_train}) curr_W, curr_b, curr_loss = sess.run([W, b, loss], {x:x_train, y:y_train}) print("W: %s b: %s loss: %s" % (curr_W, curr_b, curr_loss))