1. 程式人生 > >機器學習|迴歸問題與python實現

機器學習|迴歸問題與python實現

1240

大多數的迴歸問題,都可以使用最小二乘法來求解引數,而求解引數的過程又通常依賴梯度下降法。不僅是迴歸問題,很多機器學習都是基於梯度下降來實現引數優化,因此梯度下降可以說是機器學習的核心演算法之一。簡單地說梯度下降利用導數,通過不斷迭代,經過有限次的運算,逐漸逼近最優解。

1. 一元迴歸與最小二乘

直接看吳恩達老師課程中的例子。現在有一些房價和麵積的資料(x,y),想找出他們之間的關係。

1240

我們可以大概畫出散點圖,通過圖形分佈,假設他們之間是線性關係。那麼這個例子可以抽象為,求一個方程f(x) = k*x+b,使預測值f(x)與真實值y儘量接近。

1240

如何算是接近?我們定義一個新的函式來判斷接近程度。這個函式叫做損失函式,用差平方來表示,[f(x)-y]2。它反映了預測值與真實值的偏離程度。差平方和則反映了所有樣本的偏離大小。將引數k和b用p取代,假設共有m個樣本,那麼擬合問題就成了找一組p值,使如下函式值最小。

1240

這種擬合方法稱為最小二乘法。現在我們不繼續深究,因為這個一元問題用Excel就能搞定了:

1240

2. 多元迴歸與梯度下降

一元線性迴歸只是其他更復雜模型中的一個特例,實際資料也往往並不會這麼簡單。現在我們給資料增加一個維度,探究一下房間數量、房屋面積和價格間的關係。

1240

根據上面的思路,首先假設還是線性關係。將引數統一表示為θn(或叫做權重,相當於一元中的k,b),xn為資料特徵,本例中兩個資料特徵分別為面積和房間數量。用多元迴歸對房價進行擬合。這裡設x0=1。

1240

同樣,引入經驗風險J(θ),相當於上文中的S(P),表示資料總體的誤差。前面乘以0.5,是方便後面的求導運算:

1240

為了使決策函式更接近真實值之間的關係,經驗風險越小越好。到這裡,最優問題就成了求最小值問題。J(θ)這個函式可以看成是這樣的。

1240

如何到達最低點,從而使J(θ)最小呢?接下來就需要梯度下降法了。首先,隨機給定一組θ值,得到一個解。在這個解的基礎上進行優化,讓θj沿著J(θ)下降最快的方向,也就是導數的反方向移動一小步,得到一個新的θj,再繼續優化,重複上述過程,多次調整後,最終沿著“path”,達到最低點。表示式如下。

1240

其中“α”叫做學習率,代表了每一次優化的步長。步長太大,容易直接跳過最優解,步長太小,迭代次數過多,學習效率降低。“:=”表示從右向左賦值,新產生的值會再次迭代,直到求出最小值。

對θj求偏導數,根據加減法則及鏈式求導法則得到以下等式:

1240

最終梯度下降法表示式如下:

1240

3. 迴歸問題的python實現

在python的scipy庫中,提供了leastsq函式,直接實現此目的,語法如下:

scipy.optimize.leastsq(func,x0,args=(),……)

func:預測值與實際值的差,需要帶有至少一個變數,並返回數值型資料。

x0:初始引數,作為學習的起點。格式為陣列。

args:訓練集。

leastsq函式的目標是,求得如下的一個值:

1240

是不是很熟悉?把func(y)**2作為誤差函式,再經過sum求和,就等於經驗風險。即求一個y值,使經驗風險J(θ)或S(p)最小。

Python實現過程分為以下四個步驟

(1)定義擬合函式

def f(x1, x2, p):

    k0, k1, k2 = p

    returnk0 +k1*x1 + k2*x2

(2)定義誤差函式

def cost(p,x1,x2,y):

    return y-f(x1,x2, p)

(3)初始化引數

p0=[1,1,1]

x1=np.array([2104,1600,2400,1416,3000])

x2=np.array([3,3,3,2,4])

y=np.array([400,330,369,232,540])

(4)用leastsq求解

arg = leastsq(cost,p0,args=(x1,x2,y))

print arg[0]

完整程式碼如下:

1240

輸出

[-7.04346018e+01     6.38433756e-02     1.03436047e+02]

4. 正規方程組

梯度下降法通過多次迭代,最終求出最優解。如果想一次性求出結果,也能夠實現。即利用最優解處,導數為0特徵直接求解。與梯度下降法類似,用x(i)列向量表示第i個數據裡所有的變數特徵,θ列向量表示每個特徵對應的權重,y向量表示每組資料的實際輸出。每個預測值和實際值的差用如下方程表示:

1240

接著寫出風險函式:

1240

對風險函式求導:

1240

並使導數等於0,即可能存在的最優解:

1240