TensorFlow入門:線性回歸

TensorFlow入門:線性回歸

來自專欄 MikeTech

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 tfimport numpy as npmy_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)

運行程序,xdata和ydata被列印了出來

模型搭建

接下來就是搭建模型了,這個問題中當然是線性模型啦, 首先聲明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)

訓練

之後就可以開始訓練了,首先調用globalvariablesinitializer()函數初始化所有的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的值。

本文首發於我的博客:

TensorFlow入門:線性回歸MikeTech | MikeTech?

miketech.it圖標
推薦閱讀:

最終章 | TensorFlow戰Kaggle「手寫識別達成99%準確率
cs20si:tensorflow for research 學習筆記2
TensorFlow學習筆記之五——源碼分析之最近演算法
從Google離職後,她開發了CastBox再次征服Google獲2017卓越應用獎!

TAG:機器學習 | TensorFlow |