歡迎光臨
我們一直在努力

TensorFlow入門:線性回歸

 

TensorFlow也是很多程序員耳熟能詳的機器學習框架了,於2014年開源並且有著活躍的社區,前幾天TensorFlow開發者大會也宣布了TensorFlow for JS和Swift,藉著這個機會來寫一寫TensorFlow的入門教程 和機器學習入門需要用到的一些知識吧。 這次從最基本的線性回歸開始,這篇文章將會對一個數據集進行線性回歸併且計算出來表達式。

問題描述:線性回歸(Linear regression)

現行回歸的思路並不難,線性回歸的核心思路就是將一堆數據使用線性的解析式來表達,也就是一次函數。 一次函數是每個人初中就學到的,y = k*x + b,其中k是斜率,b是縱截距。 通過這個表達式,給一個x值,都會有一個y值與之對應。 在現實生活中的很多現像也可以使用這個模型表現,在這裡舉一個例子,房屋的大小和價格,假設我們拿到了一組房屋大小和價格的表,並且將它繪製出來。

這時可以發現,價格和房屋大小是存在一個線性的關係,通過擬合一條直線就可以推斷任何房屋大小的價格。

根據給出點的坐標,來擬合出一個直線,得到這個直線的解析式就是線性回歸需要做的。 在這里為了方便理解,我將 y = k*x + b 重新寫成 y = w * x + b,w代表權重(weight),b代表偏差(bias)。 那麼,輸入一系列點,程序算出來weight和bias就是這次的目的。

數據集讀取

首先是數據集的讀取,我預先在excel上生成了一些點,第一列代表橫坐標,第二列代表縱坐標,從繪製的散點圖來看,這一系列點完全程線性分佈, 那我我將會對這些點進行線性回歸。

首先使用numpy讀取這個CSV文件並且將第一列和第二列存到兩個數組裡

import tensorflow as tf
 import numpy as np

 my_data = np.genfromtxt('dataset.csv', delimiter=',', dtype=float)
 x_data = np.array(my_data[:,0])
 y_data = np.array(my_data[:,1])

 print(x_data)
 print(y_data) 

運行程序,x_data和y_data被打印了出來

 

模型搭建

接下來就是搭建模型了,這個問題中當然是線性模型啦, 首先聲明weights變量是一個 -1到 1值,bias變量默認為0, 表達式 y = weights * x_data + biases 就是模型了。

weights = tf.Variable(tf.random_uniform([1], -1,0, 1.0))
 biases = tf.Variable(tf.zeros([1]))

 y = weights*x_data + biases 

 

計算誤差:均方誤差(Mean Square Error)

模型規定之後,開始訓練之後TensorFlow會不斷地生成weight和bias,但是weight和bias千千萬,怎樣能找到與數據集中的點最為匹配的呢? 在下面一組圖中,有三條曲線,每一條曲線都有斜率和截距,從圖中看,第一條曲線是最匹配這些點的。 不過,怎麼用數學方法來表示呢? 這就要引入平方損失了, 損失是一個數值,代表著對糟糕預測的懲罰

在下圖中y點就是原坐標( observation ),y‘是預測出來的點( prediction ),紅色的箭頭就是損失( Loss )

平方損失的公式就是 (y – y’)^ 2

更多的時候,會使用 均方誤差(MSE) 來計算損失,就是算出來所有樣本點的平方誤差再取平均數

在TensorFlow中MSE很好表示

loss = tf.reduce_mean(tf.square(y-y_data)) 

 

誤差傳播:梯度下降法(Gradient Descent)

那麼既然算出來了損失,那麼總得想辦法降低損失吧,在每次迭代的時候,通過傳入的損失來對新預測的weight和bias進行調整。 這個過程聽起來抽象,不過大家都玩過猜價格的遊戲吧,你猜一個東西的價格,我回答,“高了”或者“低了”來對你進行反饋,你通過我的反饋來對新 猜出的價格進行調整,從而猜出正確的價格,這就是梯度下降法的核心思路。

來畫一個損失和權重的關係圖,在所有權重範圍(正無窮到負無窮)中,損失和權重的關係程碗型,在最低點的時候損失最小,在損失最小時候的對應權重即為合適 的權重。 下圖從最左邊的黃點來計算損失,不停地向右推進,每次推進的大小稱之為步長(Step)或者 學習速率 ,直到推進到損失最小的點上。 至於是向左推進還是向右推進,這是通過計算函數的偏導數來判斷的,感興趣的同學可以去學習下大學的高等數學。

TensorFlow代碼實現很容易,下面代碼中聲明了一個GradientDescentOptimizer,學習速率為0.5

optimizer = tf.train.GradientDescentOptimizer(0.5) 

 

訓練

之後就可以開始訓練了,首先調用global_variables_initializer()函數初始化所有的tensor變量,然後新建一個Session,然後運行迭代201次,每20詞迭代輸出一次weight和bias的值。

optimizer = tf.train.GradientDescentOptimizer(0.5)
 train = optimizer.minimize(loss)

 init = tf.global_variables_initializer()

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

 for step in range(201):
     sess.run(train)
     if step % 20 == 0:
         print(step, 'weight: ',sess.run(weights), ' bias: ', sess.run(biases)) 

運行後可以發現結果是收斂的,weight最終結果大概為0.4,bias最終結果為2.999

 

其實這就是我一開始在Excel規定的表達式啦,證明線性回歸起作用了,TensorFlow計算出了正確的W和B的值。

 

本文章首發於Miketech.it,作者周毅剛,請勿私自轉載。

 

 

 

 

打賞

微信掃一掃支付

微信logo 微信掃一掃,打賞作者吧~

未經允許不得轉載:頭條楓林網 » TensorFlow入門:線性回歸