線性回歸算法是機器學習、統計分析中重要的算法之一,也是常用的相對簡單的算法。
給定由d個屬性描述的點集X=(x1;x2;...;xd), 線性模型試圖學得一個通過屬性的線性組合來進行預測的函數,即ƒ(x)=w1x1 + w2x2 + ... + wdxd + b,知道w和b後就能确定模型。
我們在高中數學中已經學過隻有一個屬性x求待定系數的算法,即最小二乘法,一系列離散點通過最小二乘法即可确定一條回歸直線ƒ(x)=kx+b,這種隻有一個輸入變量/特征值的問題也叫作單變量線性回歸問題。
不同的k值,也使得預測值與實際值的模組化誤差不同,方差是常用的一種損失函數,也叫代價函數(Cost Function),我們的目标就是找到可以使得方差最小的模型參數。
單變量線性回歸的損失函數通圖形化後常類似于一個抛物線,有一個最小值。

兩個變量/特征的線性回歸損失函數圖形化後類似于一個碗,碗底就是最小值。
更多特征值的情況下,高維空間難以圖形化,損失函數在不同區域有不同的極值,一般較難計算出最小值。
我們通常采用梯度下降算法來求的這個最小值。先随機選擇一個參數組合,計算損失函數,然後找下一個能讓損失函數下降最多的新參數組合并同步更新,繼續這麼做直到找到一個局部最小值。不同的初始參數組合可能會找到不同的局部最小值。
梯度下降算法公式:
其中α是學習率(learning rate),α決定了沿着使得損失函數下降較大的方向邁出的步子有多大,值太小則收斂太慢,值太大則可能越過最小值,導緻無法收斂或者無法找到合理的待定參數組合θ。
α右邊是一個導數項,需要導數、偏導數的基礎知識,簡單來講就是通過目前θ處的切線斜率來決定正确的方向,并配合學習率決定走多遠。
我們現在用TensorFlow實作并體驗下機器學習的思想。
首先通過numpy生成一些模拟資料并有意随機偏移點(xi,yi),把生成的随機點當做資料集,并把資料集按照8:2的比例分成訓練集與測試集,然後通過代碼去讀取訓練集并更新欲求參數k、b,使得k、b越來越接近真實值,使得f(xi)≈yi,進而使得方差最小。
方差對應了歐幾裡得距離,最小二乘法就是試圖找到一條直線,使所有樣本到直線上的歐氏距離之和最小。
學習架構會使用梯度下降法去尋找一個最優解, 使得方差最小。
學習率是個很重要的參數,如果過小,算法收斂耗時很長,如果過大,可能結果不收斂或者直接NAN無法得到結果。
本次試驗用到了numpy及matplot,後續再練習下這兩個庫的使用,加強下印象。
圖形化後有兩張圖,一張表示本次訓練最後拟合直線,一張表示每次訓練損失值的收斂情況,但結果不是唯一的。
可以看出,随着訓練的進行,預測損失整體越來越小,改變學習率或者批量大小則會使訓練損失收斂速度發生顯著變化,甚至無法收斂,總體上批量數值越大效果越好。
除了線性回歸算法,還有其它好幾種回歸算法,後續陸續學習、補充。
最小二乘線性回歸算法是最小化到回歸直線的豎直距離,隻考慮y值,而戴明回歸算法是最小化到回歸直線垂直距離,同時考慮x值與y值。
具體算法修改下相減的損失函數即可,兩者計算結果基本一緻。
主要是在公式中增加正則項來限制斜率,lasso回歸增加L1正則項,嶺回歸增加L2正則項。
綜合lasso回歸和嶺回歸的一種算法,在損失函數中同時增加L1和L2正則項。
将線性回歸轉換成一個二值分類器,通過sigmoid函數将線性回歸的輸出縮放到0、1之間,判斷目标是否屬于某一類。
<a href="http://qianhk.com/2018/02/%E5%AE%A2%E6%88%B7%E7%AB%AF%E7%A0%81%E5%86%9C%E5%AD%A6%E4%B9%A0ML-%E7%94%A8TensorFlow%E5%AE%9E%E7%8E%B0%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92%E7%AE%97%E6%B3%95/">http://qianhk.com/2018/02/用戶端碼農學習ML-用TensorFlow實作線性回歸算法/</a>
<a href="http://studentdeng.github.io/blog/2014/07/28/machine-learning-tutorial/">http://studentdeng.github.io/blog/2014/07/28/machine-learning-tutorial/</a>