注:本文內容資源來自 Andrew Ng 在 Coursera上的 Machine Learning 課程,在此向 Andrew Ng 致敬。算法
對於筆記(一)中的房價問題,如何進行求解,這將會是本文中討論的重點。函數
如今假設有了更多的房屋價格數據,須要用一條直線來近似房屋價格的走勢,以下圖所示:學習
回顧筆記(一)中所講 監督學習、非監督學習、迴歸 和 分類 的概念:ui
1. 監督學習(Supervised Learning)spa
對於數據的每個樣例,都有明確的輸出值與之對應。
2. 非監督學習(Unsupervised Learning)code
對於數據的每個樣例,其輸出值名不明確。
3. 迴歸(Regression)資源
對於輸入樣本,預測的輸出值是連續的實數。
4. 分類(Classification)同步
對於輸入樣本,預測的輸出值是離散的。
因而可知,房價問題是一個 監督學習 問題,須要使用 迴歸 方法求解。it
下面給出該問題的一些概念:io
m: 訓練樣本個數
x: 輸入變量/特徵
y: 輸出變量/目標變量
(x(i), y(i)): 第i個訓練樣本
對於給定的訓練集(Training Set),咱們但願利用學習算法(Learning Algorithm)找到一條直線,以最大地近似全部的數據,而後經過這條直線所表示的函數(h),來推測新的輸入(x)的輸出值(y),該模型表示以下:
h每每被稱爲假設函數,對應着x到y的映射,因爲在本文例子中爲一條直線,用上圖右側綠色公式表示。
因爲假設函數爲線性函數,且訓練樣本中輸入變量只有一個特徵(即尺寸),將此類問題稱之爲 單變量線性迴歸(Linear Regression with One Variable,或 Univariate Linear Regression)問題。
繼續討論上述問題的假設函數h:
如上圖所示,hθ(x) 表示一條關於 x 的直線, θ0 和 θ1 是它的兩個參數,要求 hθ(x),就必須肯定這兩個參數。
那麼,如何選擇這兩個參數呢?
對於只有數據的咱們,並不知道 hθ(x) 的參數值,最簡單的辦法就是假設兩個 θ 。對於不一樣的假設,hθ(x) 表示以下:
那麼,怎麼樣選擇參數 θ ,才能讓 hθ(x) 與數據最近似?
一個很好的想法:選擇 θ0 和 θ1 ,以使得對於全部的訓練樣本 (x, y) , hθ(x) 都與 y 最相近。
如何才能說明最相近?咱們能夠經過調節參數 θ,以最小化全部訓練樣本點 (x, y) 與預測樣本點(x,hθ(x)) 的距離的平方和來求得。
具體敘述以下:
注:m表示訓練樣本個數。將距離的平方和除以 2m,是爲了後期求導方便二考慮,對最後結果不會形成影響。
所以,訓練的目標,便是調節參數 θ0 和 θ1 ,以最小化代價函數 J(θ0, θ1)。
爲了方便的說明求解過程,先作必定的簡化,假設 θ0 = 0,以下圖右方所示,那麼代價函數J只與 θ1相關。
當 θ1 = 1 時,求解過程以下,可得 J(1) = 0 。
當 θ1 = 0.5 時,求解過程以下,可得 J(0.5) ≈ 0.58 。
經過不斷的嘗試 θ1 的值,能夠求出相應的 J(θ1) 的值,能夠發現, J(θ1) 是關於 θ1 的二次函數,而且對於此樣例中的三個數據,在 θ1 = 1 時, J(θ1) 取得最小值,且僅有一個最小值。
那麼,咱們能夠猜測一下,最快速的方法求 J(θ1) 的最小值,就是求其關於 θ1 的導數。
在 Intuition I 中,爲了求解方便,咱們殘忍地拋棄了 θ1 ,可是 θ0 和 θ1 同等重要。如今,咱們要將θ0 撿回來,並加以悉心照料。
如今假設 θ0 = 50, θ1 = 0.06 ,獲得直線以下圖所示:
在Intuition I中, J(θ1) 是關於 θ1 的二次函數。因爲如今有兩個參數 θ0 和 θ1 ,J(θ0, θ1) 利用 matlab/octave 繪圖結果表示以下:
可是,這樣的顯示,儘管咱們可以大體的瞭解到J的最小值所在的位置,可是並不太明顯,所以,利用等值線的顯示方法,能夠將 θ1 ,J(θ0, θ1) 更加直觀地展示。
等值線:處在該曲線上的全部點的值都相等,且越往內值越小。
例如,對於下面的 hθ(x) ,其 J(θ0, θ1) 的值在等值線中表示如圖中紅X所示:
選取另外的 θ 值, J(θ0, θ1) 的值更加接近最小值:
選取到合適的 θ 值後,J(θ0, θ1) 的值基本徹底接近最小值:
如今咱們已經知道,須要選擇適當的 θ ,以將 J(θ0, θ1) 最小化,以下圖所示:
在平面內, θ 的取值有無限種, 從而 J(θ0, θ1) 所表示的函數有無限種可能,咱們不可能僅僅用猜想的方法獲得所須要的結果。於是,尋求一種求 J(θ0, θ1) 最小值的方法極其重要。
典型的方法就是 梯度降低 法,以下圖所示:
假設你如今站在一個山坡上,想要以最快的方法到達山底,一般咱們會選擇每一次向下邁一步,在多步以後到達山底。然而,有一種狀況須要考慮,就是多多個山底的狀況,在你選擇不一樣的出發點時,可能會到達不一樣的山底:
咱們所說的山底,就是 J(θ0, θ1) 的一個局部最優解,有時候局部最優解並不能表明全局最優解。慶幸的是,在文中的例子中,咱們選擇的假設函數 hθ(x) 是一條直線,從而 J(θ0, θ1) 是一個二次函數,它只有一個最優解,利用梯度降低方法能夠很好的解決問題。
那麼,如何邁每一步,也就是說如何執行梯度降低算法?其執行過程以下:
對於 θj ,先求 J(θ0, θ1) 關於 θj 的偏導,在乘以 α(稱爲學習率),再用 θj 減去這個值,至關於全部的 θj 都在必定程度上向最小值所表示的點邁進,這在圖中就表示 J(θ0, θ1) 向下邁了一步。一直重複這一步驟,直到 θ0和θ1 基本不變即結束。
此處,須要注意如下幾點,很是重要:
1. := 符號表示賦值,= 符號表示求真; 2. α 表示學習率,決定了梯度降低的步子邁得有多大,α > 0; 3. 全部的 θ 值必須同步更新。
咱們知道了梯度降低方法的相關概念,如今進行直觀的展示以解釋梯度降低的執行過程。梯度降低算法以下:
爲了更方便的解釋,先讓 θ0 := 0,這樣 J 簡化爲關於 θ1 的一元二次函數。當 J(θ1) 關於 θ1 的導數大於0時, θ1 左移, J(θ1) 降低。當 J(θ1) 關於 θ1 的導數小於0時, θ1 右移, J(θ1) 仍然降低。
那麼問題來了。 若是邁的步子過小, J(θ1) 每次只下降一點點,何時才能到最底部? 若是邁的步子太大, J(θ1) 越過了最小值到達另外一邊,會出現什麼狀況?
這兩個問題,跟學習率 α 有着極大的關係。若是 α 過小,梯度降低算法將會至關慢。若是 α 太大,梯度降低可能越過最小值,致使不收斂,甚至發散。
讓人欣慰的一件事是,在大部分的問題中,隨着 θ 逐漸靠近最優解,J(θ) 關於 θ 的偏導的絕對值將會更小,也就是說曲線更加平滑。這意味着 θ 的減小或增長逐漸緩慢,也就意味着,J(θ) 的減少將會逐漸緩慢。所以,咱們並不須要在每一步去下降 α 的值。
如今,瞭解了梯度降低與線性迴歸,如今須要將它們進行結合,以求解本文中的房價問題的單變量線性迴歸模型。
對於線性迴歸模型,因爲能夠求 J(θ) 關於 θ 的偏導:
於是,梯度降低方法轉化爲以下形式(θ0 和 於 θ1 必須同步更新):
並且,因爲 J(θ0, θ1) 的形狀是一個碗形的,所以梯度降低最後將收斂到最小值: