1. 程式人生 > >Android 線性迴歸

Android 線性迴歸

對於一次線性迴歸,就是求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))

推薦博文:
http://www.cnblogs.com/ooon/p/4947688.html