機器學習初探-線性迴歸

題外話

我很早就對人工智能是非常感興趣的。記得我大學的畢業論文,就是使用遺傳算法解決了一個經典的尋路問題。
我一直對人類經典的思想是非常敬畏和崇拜的,比如傳統的計算機數據結構算法問題,例如經典的排序算法或者動態規劃思想,把一些看似
複雜的問題竟然用短短十幾行甚至一個 for 循環就能解決,這令我感受到了一種美學,也同時對人類的偉大思想而讚歎。
但傳統的計算機算法其實還是通過,人來編寫代碼,人來通過完整的、解決問題的思路來解決問題。但如果機器能有自己的思想,如果它自己就能“學習”到解決問題的方法,豈不是非常 cool 的一件事。但以我目前的認知來看,現在的人工智能是更像是一種工具,一種“數學工具”,一種“統計學工具”,
它是從大量數據裏總結出了一種“規律”,用來解決實際問題。它離電腦真正有思想還相距甚遠,甚至以目前來看,二者可能並不是一回事。可能讓機器具有思維,還需要在其他學科上進行突破比如人的認知機制,腦科學進行突破。哈哈扯遠了。

先來介紹自己的一些簡單認識。

線性

  1. 什麼是線性?

有一類幾何對象,比如直線、平面、立方體,看上去都是有棱有角的,都是“直”的,在數學中稱爲線性
avatar

要處理它們相關的問題就非常簡單。比如在高中就學過,兩根直線可以用兩個線性方程來表示,想求它們交點的話:

avator

聯立出兩者的方程組,求出該方程組的解就可以得到交點

  1. 爲什麼要研究線性

(1)我們所處的世界、宇宙太複雜了,很多現象都無法理解,更談不上用數學去描述;

(2)有一些符合特定條件的複雜問題,可以轉化爲簡單的線性問題。線性問題就可以完全被理解,完全可以被數學所描述

迴歸

以我目前的認知來看,機器學習主要的任務有兩類。
第一就是分類任務,比如

  • 判斷一張圖片裏的是貓還是狗 (二分類,因爲我定義目標結論有兩種,即貓或者狗)
  • 判斷一個股票明天是漲還是跌
  • 判斷一個圖片中的數字是幾(多分類。因爲我定義目標結論有 10 種,0 到 9)

avator

也就是說,分類的結果是,人爲預先定義的結果範圍裏的一種

而第二類任務就是迴歸任務,而它得出的結果是一個連續數字的值,而非類別。
例如

  • 預測房屋價格
  • 預測股票價格

什麼是機器學習

這是我目前的淺顯理解。機器學習目前我覺得是一種數學工具。通過餵給機器大量的學習資料,然後機器運行一個機器學習算法,訓練出了一個模型。然後再向機器丟入問題,機器通過這個模型運算得出結果。

avator

線性迴歸的初步感性理解

比如我收集到了有 x, y 的兩組數據(比如年齡和身高),我想要知道這兩組變量是否有線性關係。那麼我先以一個變量爲 x 軸,另一個變量爲 y 軸畫出這樣一副散點圖。

avator

那麼我就可以找出這樣的一條直線。這條直線的特徵是:儘可能的離所有離散點最近,也可以表述成,每個離散點離直線距離的差值之和最小。
那麼我就可以很好的根據我算出的這條直線,由已知的 x 值,來預測的未知的 y 值。
假如說 x, y 有線性關係的話,那麼預測的效果還是很不錯的。所以線性迴歸的主要任務是,找出這條直線。

單變量線性迴歸

我們先從單變量線性迴歸開始理解,即假設 x 只有一個特徵(比如一氧化氮濃度),y 是房價。
根據前文提到的感性理解,我們的目標就是找到最佳的直線方程:

avator

其實就是求參數 a 和 b 的過程。
那其實我們的目標就是,使得根據每一個 x 點,使得

avator

最小。這個方程叫做損失函數。
你可能想問爲什麼是差的平方和最小?而不是差的絕對值和最小或者差的 3 或者 4 次方最小?
差的平方和最小在數學中叫做最小二乘法,這裏給出一個鏈接
https://www.zhihu.com/question/24095027,這裏不再細究。

所以一類機器學習算法的基本思路是: 通過確定問題的損失函數,然後最優化損失函數,來獲得機器學習的模型。
怎麼求得這個損失函數的最小值,即求 a 和 b 的值。則需要對 a 和 b 分別進行求導。導數爲 0 的點則爲極值點。
現在我們對 a 進行求導(複合函數的鏈式求導法則):

avator

化簡一下:

avator

根據同樣的過程得出 a,化簡過程省略:

avator

然後 python 實現一下:
簡單來說我需要定義兩個方法。

  • fit 擬合方法。或者我們常說的訓練方法。通過將訓練數據作爲參數傳入這個方法,得出模型的各個參數。
  • predict 預測方法。將 x 值帶入這個方法,得出預測值

avator

這裏需要注意一下:這裏採用了向量化代替了循環去求 a。 我們看到,a 的分子分母實際上用循環也可以求,
但是實際上,a 的分子分母其實可以看成向量的點乘(即向量 a 裏的每一個分量乘以向量 b 裏的每一個分量)。
這樣做有兩個好處:

  • 代碼更清晰
  • 向量是並行運算。(調用 GPU 流處理器進行並行運算)遠快於 cpu 裏進行循環

當把這個 a 和 b 的參數求出之後,我們就得出了一個模型(在這個例子中是 y=ax+b),然後我們就可以進行預測了,把 x 帶入這個方程中,就可以得出預測後的這個 y 值。

多元線性迴歸

理解了單變量線性迴歸之後,我們就開始需要解決,當特徵爲多個的時候,怎麼進行預測?
也就是多元線性迴歸。
我們可以理解一下,多元線性迴歸實際要求的是這樣的一個方程

avator

即每一個特徵前面都有一個常數係數,再加一個常數(截距)。
這裏我們把這些係數整理成一個(列)向量

avator

然後我們爲了方便起見,設置一個 x0, x0 恆等於 1,那麼我們最終就化簡成了下面兩個向量的點乘

avator

然後把所有的 x 向量(樣本)組合成一個矩陣,將 theta 整理成一個列向量。那麼 y(向量)就是所有 x 向量的預測值。這裏用到了矩陣和向量的乘法(哈哈忘了的話得複習一下線性代數)。

avator

那麼根據最小二乘法,我們的目標就是使得 avator

最小。也就是要對整個矩陣進行求導,具體推導過程省略,這裏給出最終 theta 的解:

avator

也就是我們通過數學推導,直接求出了參數的數學解,然而一般而言,能夠直接得出參數數學解的機器學習方法還是比較少的,有可能還需要藉助其他方法比如梯度下降才能夠求出參數。

多元線性迴歸的實現

接下來根據這個數學解進行實現。

avator

簡單線性迴歸實戰(波士頓房價預測)

這個波士頓房價數據集是 sklearn(一個機器學習框架)自帶的數據集

其實我看到這個數據集時也懵了,這個例子是帶我們預測房價嗎?預測明天深圳的房價?
我覺得是可以這樣理解,通過收集一些特徵(學習資料)如下圖和波士頓某些地區的平均房價(目標結論),來推測出你或者房地產商賣房子時應該怎麼定價比較划算。或者說通過這個數據集來理解,哪個因素對於房價影響更大。

數據介紹

該數據集包含馬薩諸塞州波士頓郊區的房屋信息數據,來自 UCI 機器學習知識庫(數據集已下線),於 1978 年開始統計,包括 506 個樣本,每個樣本包括 12 個特徵變量和該地區的平均房價。

字段含義

avator

可以看到,研究者希望找出影響房價的重要因素,比如環境因素(一氧化氮濃度),位置因素(到波士頓 5 箇中心區域的加權距離)等等(不過我相信影響中國房價因素要比這複雜的多)

avator

經過求解得出了(或者說學習到了)各個參數的值,然後如果地產商想要定價的話,可以收集這些特徵,然後使用模型的 predict 方法可以得出一個房價的參考值。

然後我們也可以看到,哪些因素對於房價是正相關的,哪些是負相關的。然後參數越大,越影響房價,這就是線性迴歸法對於結果的可解釋性(有些機器學習方法是不支持的)。


歡迎關注凹凸實驗室博客:aotu.io

或者關注凹凸實驗室公衆號(AOTULabs),不定時推送文章:

歡迎關注凹凸實驗室公衆號

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章