我很早就對人工智能是很是感興趣的。記得我大學的畢業論文,就是使用遺傳算法解決了一個經典的尋路問題。 我一直對人類經典的思想是很是敬畏和崇拜的,好比傳統的計算機數據結構算法問題,例如經典的排序算法或者動態規劃思想,把一些看似複雜的問題居然用短短十幾行甚至一個 for 循環就能解決,這令我感覺到了一種美學,也同時對人類的偉大思想而讚歎。python
但傳統的計算機算法其實仍是經過,人來編寫代碼,人來經過完整的、解決問題的思路來解決問題。但若是機器能有本身的思想,若是它本身就能「學習」到解決問題的方法,豈不是很是 cool 的一件事。算法
但以我目前的認知來看,如今的人工智能是更像是一種工具,一種「數學工具」,一種「統計學工具」,它是從大量數據裏總結出了一種「規律」,用來解決實際問題。它離電腦真正有思想還相距甚遠,甚至以目前來看,兩者可能並非一回事。可能讓機器具備思惟,還須要在其餘學科上進行突破好比人的認知機制,腦科學進行突破。哈哈扯遠了。markdown
先來介紹本身的一些簡單認識。數據結構
有一類幾何對象,好比直線、平面、立方體,看上去都是有棱有角的,都是「直」的,在數學中稱爲線性 框架
要處理它們相關的問題就很是簡單。好比在高中就學過,兩根直線能夠用兩個線性方程來表示,想求它們交點的話:機器學習
聯立出二者的方程組,求出該方程組的解就能夠獲得交點函數
(1)咱們所處的世界、宇宙太複雜了,不少現象都沒法理解,更談不上用數學去描述;工具
(2)有一些符合特定條件的複雜問題,能夠轉化爲簡單的線性問題。線性問題就能夠徹底被理解,徹底能夠被數學所描述oop
以我目前的認知來看,機器學習主要的任務有兩類。 第一就是分類任務,好比學習
也就是說,分類的結果是,人爲預先定義的結果範圍裏的一種
而第二類任務就是迴歸任務,而它得出的結果是一個連續數字的值,而非類別。 例如
這是我目前的淺顯理解。機器學習目前我以爲是一種數學工具。經過餵給機器大量的學習資料,而後機器運行一個機器學習算法,訓練出了一個模型。而後再向機器丟入問題,機器經過這個模型運算得出結果。
好比我收集到了有 x, y 的兩組數據(好比年齡和身高),我想要知道這兩組變量是否有線性關係。那麼我先以一個變量爲 x 軸,另外一個變量爲 y 軸畫出這樣一副散點圖。
那麼我就能夠找出這樣的一條直線。這條直線的特徵是:儘量的離全部離散點最近,也能夠表述成,每一個離散點離直線距離的差值之和最小。 那麼我就能夠很好的根據我算出的這條直線,由已知的 x 值,來預測的未知的 y 值。 假如說 x, y 有線性關係的話,那麼預測的效果仍是很不錯的。因此線性迴歸的主要任務是,找出這條直線。
咱們先從單變量線性迴歸開始理解,即假設 x 只有一個特徵(好比一氧化氮濃度),y 是房價。 根據前文提到的感性理解,咱們的目標就是找到最佳的直線方程:
其實就是求參數 a 和 b 的過程。 那其實咱們的目標就是,使得根據每個 x 點,使得
最小。這個方程叫作損失函數。 你可能想問爲何是差的平方和最小?而不是差的絕對值和最小或者差的 3 或者 4 次方最小? 差的平方和最小在數學中叫作最小二乘法,這裏給出一個連接 www.zhihu.com/question/24…,這裏再也不細究。
因此一類機器學習算法的基本思路是: 經過肯定問題的損失函數,而後最優化損失函數,來得到機器學習的模型。 怎麼求得這個損失函數的最小值,即求 a 和 b 的值。則須要對 a 和 b 分別進行求導。導數爲 0 的點則爲極值點。 如今咱們對 a 進行求導(複合函數的鏈式求導法則):
化簡一下:
根據一樣的過程得出 a,化簡過程省略:
而後 python 實現一下: 簡單來講我須要定義兩個方法。
這裏須要注意一下:這裏採用了向量化代替了循環去求 a。 咱們看到,a 的分子分母實際上用循環也能夠求, 可是實際上,a 的分子分母其實能夠當作向量的點乘(即向量 a 裏的每個份量乘以向量 b 裏的每個份量)。 這樣作有兩個好處:
當把這個 a 和 b 的參數求出以後,咱們就得出了一個模型(在這個例子中是 y=ax+b),而後咱們就能夠進行預測了,把 x 帶入這個方程中,就能夠得出預測後的這個 y 值。
理解了單變量線性迴歸以後,咱們就開始須要解決,當特徵爲多個的時候,怎麼進行預測? 也就是多元線性迴歸。 咱們能夠理解一下,多元線性迴歸實際要求的是這樣的一個方程
即每個特徵前面都有一個常數係數,再加一個常數(截距)。 這裏咱們把這些係數整理成一個(列)向量
而後咱們爲了方便起見,設置一個 x0, x0 恆等於 1,那麼咱們最終就化簡成了下面兩個向量的點乘
而後把全部的 x 向量(樣本)組合成一個矩陣,將 theta 整理成一個列向量。那麼 y(向量)就是全部 x 向量的預測值。這裏用到了矩陣和向量的乘法(哈哈忘了的話得複習一下線性代數)。
那麼根據最小二乘法,咱們的目標就是使得
最小。也就是要對整個矩陣進行求導,具體推導過程省略,這裏給出最終 theta 的解:
也就是咱們經過數學推導,直接求出了參數的數學解,然而通常而言,可以直接得出參數數學解的機器學習方法仍是比較少的,有可能還須要藉助其餘方法好比梯度降低纔可以求出參數。
接下來根據這個數學解進行實現。
這個波士頓房價數據集是 sklearn(一個機器學習框架)自帶的數據集
其實我看到這個數據集時也懵了,這個例子是帶咱們預測房價嗎?預測明天深圳的房價? 我以爲是能夠這樣理解,經過收集一些特徵(學習資料)以下圖和波士頓某些地區的平均房價(目標結論),來推測出你或者房地產商賣房子時應該怎麼訂價比較划算。或者說經過這個數據集來理解,哪一個因素對於房價影響更大。
該數據集包含馬薩諸塞州波士頓郊區的房屋信息數據,來自 UCI 機器學習知識庫(數據集已下線),於 1978 年開始統計,包括 506 個樣本,每一個樣本包括 12 個特徵變量和該地區的平均房價。
能夠看到,研究者但願找出影響房價的重要因素,好比環境因素(一氧化氮濃度),位置因素(到波士頓 5 箇中心區域的加權距離)等等(不過我相信影響中國房價因素要比這複雜的多)
通過求解得出了(或者說學習到了)各個參數的值,而後若是地產商想要訂價的話,能夠收集這些特徵,而後使用模型的 predict 方法能夠得出一個房價的參考值。
而後咱們也能夠看到,哪些因素對於房價是正相關的,哪些是負相關的。而後參數越大,越影響房價,這就是線性迴歸法對於結果的可解釋性(有些機器學習方法是不支持的)。