Android 線性迴歸
阿新 • • 發佈:2019-01-12
對於一次線性迴歸,就是求w 和 b 的值,針對預測值 y(x) = w*x + b, 真實值 y ,使其滿足min(k) = (y^i - y(x^i))^2 ,其中 i 為第i個數,即 x^1為 x1,y^1為y1;若序列集合為 x:[x1,x2,…], y:[y1,y2,….]
如圖所示,如果直接將 b 設定為 0,那麼相當於 求 y(x) = w*x 中的 w,那麼可以直接手動得到關於 w的方程式
k = 30* (w^2 - 2*w + 1)
這個是拋物線方程,對其求導可以得到 k’ = 2*w - 2,我的理解,當我們使用梯度下降時,就是類似
w(j+1) = w(j) - a*k';
其中 k’ 就是圖中的 三角形y,我們w值越逼近 1,三角形y的值越小,這個當w初始值幅值為4後,通過上面的公式,下一個w值 w(j+1)就是 w(j) 減去一個增量,這個增量在不斷的減小,進而w值將慢慢的向1 靠近
注(該方法可能存在的問題-自己的理解):
1.如果手動自己演算下該過程也會發現,如果 a的值過大,就會出現震盪的現象(就是兩個值不停的迴圈)
2.如果a的值很小,而訓練中的次數較小,可能 w還沒有到達 值 1 就已經訓練結束了,這個時候得到的最小值不是全域性最小值,僅僅是區域性最小值
下面是tensflow線性迴歸程式碼(也可以稱為線性擬合)
#!/user/bin/env python
import tensorflow as tf
#W 和 b 賦予初值
W = tf.Variable([.3], dtype=tf.float32)
b = tf.Variable([-.3], dtype=tf.float32)
# Model input and output
x = tf.placeholder(tf.float32)
#1.建立執行緒方程
linear_model = W*x + b
y = tf.placeholder(tf.float32)
# 2.平方損失-最小二乘法 loss
loss = tf.reduce_sum(tf.square(linear_model - y )) # sum of the squares
# optimizer 建立梯度下降法,a的值為 0.01
optimizer = tf.train.GradientDescentOptimizer(0.01)
#損失函式值最小
train = optimizer.minimize(loss)
# training data
x_train = [1, 2, 3, 4]
y_train = [0, -1, -2, -3]
# training loop
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init) # reset values to wrong
#訓練了 1000 次
for i in range(1000):
sess.run(train, {x: x_train, y: y_train})
# evaluate training accuracy
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))