線性迴歸、梯度下降演算法與 tensorflow
阿新 • • 發佈:2019-01-01
舉個栗子
考慮一個二手房交易記錄資料集. 已知房屋面積,臥室數量和交易價格:
根據這個資料集,要求我們估算當前某個給定房屋價格. 我們應該怎麼做?
線性迴歸
迴歸就是根據已知資料來預測另一個數值型資料的目標值. 假設特徵和結果滿足線性關係:
其中 w 為權重. 假設
其中 n 為引數個數. 現在模型的形式已經有了,剩下的就是根據已有資料計算出一個合適的 w.
損失函式
什麼樣的引數 w 才算是合適的呢? 直觀上看,如果有一組 w,使得在 訓練集上預測值和實際值之間的差異最小,則 w 就是最合適的. 我們選擇了差值的平方和作為衡量標準. 為了便於計算前面加常量 1/2.
梯度下降
損失函式 J(w) 是w 的函式,現在需要求使其達到最小值時的 w.
在一元函式
梯度同導數,只不過是在多維空間的導數. 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))