1. 程式人生 > >【學習筆記】線性迴歸

【學習筆記】線性迴歸

人們早就知道(並且找到了計算方法),相比涼爽的天氣,在溫度較高的時候,蟋蟀鳴叫更為頻繁。這裡文件給出了我們圖片,我們拿一個直尺很容易就能畫一條線來近似這種關係。

雖然該直線並沒有精確的穿過每個點,但是我們還是能總結出大概的關係:

 y = w*x + b

這裡的 y 指預測標籤(我們預估的值)。

w指x的權重。

b指偏差。

x指特徵。

我們可以畫出無數條直線來預估這個圖片,哪一個效果最好呢?

我們通過loss(這裡用的均方誤差(MSE))函式,來最大限度的減少損失的模型,這一過程稱為  經驗風險最小化。

損失是一個數值,這個數值表示對單個樣本預測的精度,我們訓練模型的目標是一組樣本中平均損失“較小”的權重和偏差。

我們這裡只能找到平均損失較小(傳統神經網路存在區域性最優解的問題)的權重和偏差,至於原因,在以後會給出。

書中這裡給出了MSE的演算法,    (實際結果-預測結果)的平方和 再除以N,

這裡N為樣本總數。

雖然MSE演算法常見於機器學習,但它既不是唯一實用的損失函式,也不是適用於所有情形的最佳損失函式(特殊情況下,我們甚至

需要自己構建損失函式)。

習題答案:

1.均方誤差

對於兩張圖我們可以計算其均方誤差。

MSE(左側) =  (0^2 + 1^2 + 0^2 + 1^2 + 0^2 + 1^2 +0^2 + 1^2 + 0^2 + 0^2)/10 = 2/5 = 0.4

MSE(右側) =  (0^2 + 0^2 + 0^2 + 2^2 + 0^2 + 0^2 + 0^2 + 2^2 + 0^2 + 0^2)/10 = 4/5 = 0.8

如果我們直接看殘差會發現兩者的殘差是相等的,就跟之前的《深入淺出的資料分析》中提到的類似,當時書中是用 RMSE來預估模型精度,我們這裡是用的MSE。

我這裡給出一個一元線性迴歸的例子(基於梯度下降法):

import numpy as np
import tensorflow as tf

x = np.linspace(1, 30, 500)[:, np.newaxis]
np.random.shuffle(x)
y = 3*x + 5 + np.random.standard_normal(500)[:, np.newaxis]

xs = tf.placeholder(tf.float32, [None, 1])
ys = tf.placeholder(tf.float32, [None, 1])
weights = tf.Variable(tf.random_normal([1]))
biases = tf.Variable(tf.zeros(1) + 0.1)

wx_b = xs * weights + biases

loss = tf.reduce_mean(tf.square(wx_b - ys))

train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss)

sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)

for i in range(5000):
    sess.run(train_step, feed_dict={xs: x, ys: y})
    if i % 50 == 0:
        print(sess.run(loss, feed_dict={xs: x, ys: y}), sess.run(weights), sess.run(biases))


這裡的loss我使用的就是MSE,大家在訓練神經網路的時候,記得把資料打亂,這樣可以讓模型學習的更快速。我這裡用的np.random.shuffle 來打亂x的順序,並且給y加入了噪點。最終的執行結果MSE在1.06左右(每個人執行可能有偏差)。

我們可以在這裡匯入matlab模組來讓結果視覺化,這裡就不寫了,感興趣的可以自己動動手。