相信你們都聽過著名的博物學家,達爾文的大名,而今天這個故事的主人公就是他的表弟高爾頓。html
高爾頓是一名生理學家,在1995年的時候,他研究了1078堆父子的身高,發現他們大體知足一條公式,那就是java
Y=0.8567+0.516*x算法
這條式子中的x指的是父親的身高,Y指的是兒子的身高。能夠明顯看出,這就是咱們中學時代學的二元一次方程,反應在平面上就是一條直線。編程
經過這條公式,咱們或許會直觀得覺得高個的父親總會有高個的兒子,矮個的父親會有矮個的兒子。但高爾頓進一步觀察後發現,並不是全部的狀況都是這樣的。特別高的父親的兒子會比他父親矮一些,特別矮的父親的兒子會比他父親高一些,父子不會說一直不斷得更高或更矮下去。這個現象,其實就是迴歸。趨勢不會一直持續下去,而是會回到某個中心。函數式編程
經過這個故事,相信你已經明白了什麼是線性迴歸,那麼接下來咱們就來講說更加詳細的內容。函數
拋出問題:假設有這樣的一些點,這些都是現有的數據,咱們要找到擬合這些點的線,而後預測接下來的點。那咱們要怎麼找出這條線呢?oop
h(x)=a0 + a1 * x(a1是斜率,a0是截距)學習
或者說換個問法,咱們要怎麼求出a_1和a_0呢?大數據
第一次接觸線性迴歸的同窗可能不知道什麼叫cost function,其實當碰到不知道的概念的時候,只要想清楚兩件事,這個概念是什麼,有什麼用。想清楚這兩點,起碼就不會犯迷糊了。3d
咱們先隨便畫兩條線來擬合那些點,如圖所示,能夠看到,明顯圖二更加擬合,也就是說圖二的線更接近咱們理想中的線。
OK,再仔細觀察,圖二的線和圖一的線有什麼不一樣呢?最明顯的,就是圖一中,各個點沿y軸到那條直線的距離更遠,而圖二中各個點到線的距離更近。
這全部點沿y軸到直線的偏差,也就是各個點的偏差,的平均值。就是代價函數。公式以下:
pred(i) 就是第i個點上,直線的y值,y(i)就是第i個點,這個點的y值,加上平方主要是避免了負數的狀況。這就是代價函數。
代價函數有助於咱們找出a0和a1的最佳可能值。前面說到,代價函數就是每一個點在y軸到直線的距離的平均值。咱們的目標就是最小化這個值,在廣泛狀況下,代價函數是凸函數,以下圖所示,
看到這個函數是否是比較熟悉?在學習導數的時候不就常常看到這樣的圖嘛,這種圖一般也是經過求導來解的。
從y=a0+a1*x,這條直線開始。到寫出代價函數,咱們的目標一直沒變,就是要找出a0和a1,讓這條直線更貼緊那些點(就是讓代價函數最小)。固然,咱們還沒說到如何讓代價函數最小化,下面咱們就接着說說如何讓代價函數最小化吧。
梯度降低是一種不斷迭代更新a0和a1以下降代價函數的方法。 咱們能夠經過對代價函數求導的方式,看出應該讓a0或a1加仍是減。
上面部分其實就是對代價函數的求導,經過對其求導,咱們可以知道a0和a1應該是增大仍是減小。
這條公式其實就是(a0-代價函數的偏導數)。固然,其中還有一個控制速率的α(Alpha),對代價函數的求導能知道是對a0和a1增大仍是減小,那麼α就是應該增大多少,減小多少。
舉個例子,假設你如今在半山坡,你要作的是下山,代價函數的偏導數,就是告訴你應該向下仍是向上。而速率α就是來控制步子要邁多大。
步子小(α小)意味着小步快跑下山,缺點是跑比較久。大步向前(α大)意味着比較快,但可能一會兒邁太大,跑到對面半山腰去了。
經過梯度降低,可以讓咱們找到一個局部最優解的a0和a1,爲何是局部最優解呢?由於現實中的問題可能沒一開始的例子那麼清晰,不少時候你發現可能這條線也能夠,這條線也不錯,那條好像也能夠。計算機也會這樣,它可能也會以爲某條線就已經夠好了。就不去找其餘的線了。
反應到咱們求的問題裏面,能夠說由於是最小化問題(最小化代價函數),但可能像右圖同樣,它已經在一個局部裏面是最小的了,向左向右都是升高,既然如此那就安心當鹹魚嘍。這種現象和初始的隨機選擇有關,也和訓練的速率有關。
當選擇了一個合適的α值,當更新迭代足夠屢次以後。理論上就會到達某個底部,這時候也就意味着代價函數是某個範圍內最小的。這個時候的a0喝a1就被咱們求出來了,咱們就可以獲得一條擬合空間中點的直線了。
最後再說一下,剛剛介紹的都只是在二維空間中的計算,也就是隻有一個特徵。而現實中每每不止會有一個特徵,而是多個特徵,以下面的形式:
h(x)=a0 + a1 * x1 + a2 * x2 + a3 * x3 ...
不過計算方式和計算的方法都是相似的。只是數據量會變多,計算會更加複雜些。
OK,今天先從一個例子開始介紹線性迴歸。而後闡述了代價函數,以及求解代價函數最小化的一個方法,梯度降低。後面會介紹用sklearn來作線性迴歸,以及其餘多種迴歸分析方法的初步介紹。
以上~
推薦閱讀:
Windows上IDEA搭建最新Spark2.4.3源碼閱讀及調試的開發環境
Scala 函數式編程指南(一) 函數式思想介紹
通俗地說決策樹算法(二)實例解析
大數據存儲的進化史 --從 RAID 到 Hadoop Hdfs
C,java,Python,這些名字背後的江湖!