線性回歸模型(Linear Regression)及Python實現


線性回歸模型(Linear Regression)及Python實現

http://www.cnblogs.com/sumai

1.模型

   對於一份數據,它有兩個變量,分別是Petal.Width和Sepal.Length,畫出它們的散點圖。我們希望可以構建一個函數去預測Sepal.Length,當我們輸入Petal.Width時,可以返回一個預測的Sepal.Length。從散點圖可以發現,可以用一條直線去擬合,這時我們可以構建一元線性回歸模型:hθ(x) = θ0 + θ1x1 (x1= Petal.Width)。當然,如果我們的特征X不止一個的話,我們可以構造多元線性回歸模型,hθ(x) = ∑θix(i = 0,...,n , x= 1)。

 

2.評價

   對於上述的線性回歸模型hθ(x),我們需要求出θ來。可以想象,參數θ的取值有無數多種,那么我們應該怎么樣選取合適的參數θ? 直觀的去理解,我們希望估計出來的hθ(x)與實際的Y值盡量的靠近,因此我們可以定義一個損失函數J(θ) = (1/2m)∑(hθ(x(i)) − y(i))2,m為樣本量。當然,損失函數可以有很多種定義方法,這種損失函數是最為經典的,由此得到的線性回歸模型稱為普通最小二乘回歸模型(OLS)。

3.優化

   我們已經定義好了損失函數J(θ),接下來的任務就是求出參數θ。我們的目標很明確,就是找到一組θ,使得我們的損失函數J(θ)最小。最常用的求解方法有兩種:批量梯度下降法(batch gradient descent), 正規方程方法(normal equations)。 前者是一種通過迭代求得的數值解,后者是一種通過的公式一步到位求得的解析解。在特征個數不太多的情況下,后者的速度較快,一旦特征的個數成千上萬的時候,前者的速度較快。另外,先對特征標准化可以加快求解速度。

 批量梯度下降法:θj := θj − α· ∂J(θ)/∂θj  (j = 0,1,...,n, α為學習速率, J(θ)/∂θj 為J的偏導數)  不斷同時更新θj直到收斂

   正規方程法:θ = (XTX)−1XTY

 

4.python代碼實現

 1 # -*- coding: utf-8 -*-
 2 """
 3 Created on Tue Feb 23 16:06:54 2016
 4 
 5 @author: SumaiWong
 6 """
 7 
 8 import numpy as np
 9 import pandas as pd
10 from numpy.linalg import inv
11 from numpy import dot
12  
13 iris = pd.read_csv('iris.csv')
14 # 擬合線性模型: Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width
15 
16 # 正規方程法 
17 temp = iris.iloc[:, 1:4]
18 temp['x0'] = 1
19 X = temp.iloc[:,[3,0,1,2]]
20 Y = iris.iloc[:, 0]
21 Y = Y.reshape(len(iris), 1)
22 theta_n = dot(dot(inv(dot(X.T, X)), X.T), Y) # theta = (X'X)^(-1)X'Y
23 print theta_n
24 
25 #批量梯度下降法
26 theta_g = np.array([1., 1., 1., 1.]) #初始化theta
27 theta_g = theta_g.reshape(4, 1)
28 alpha = 0.1
29 temp = theta_g
30 X0 = X.iloc[:, 0].reshape(150, 1)
31 X1 = X.iloc[:, 1].reshape(150, 1)
32 X2 = X.iloc[:, 2].reshape(150, 1)
33 X3 = X.iloc[:, 3].reshape(150, 1)
34 J = pd.Series(np.arange(800, dtype = float))
35 for i in range(800):
36 # theta j := theta j + alpha*(yi - h(xi))*xi
37     temp[0] = theta_g[0] + alpha*np.sum((Y- dot(X, theta_g))*X0)/150.
38     temp[1] = theta_g[1] + alpha*np.sum((Y- dot(X, theta_g))*X1)/150.
39     temp[2] = theta_g[2] + alpha*np.sum((Y- dot(X, theta_g))*X2)/150.
40     temp[3] = theta_g[3] + alpha*np.sum((Y- dot(X, theta_g))*X3)/150.
41     J[i] = 0.5*np.sum((Y - dot(X, theta_g))**2) #計算損失函數值    
42     theta_g = temp #更新theta
43     
44 print theta_g
45 print J.plot(ylim = [0, 50])

代碼所用的數據下載地址:http://files.cnblogs.com/files/sumai/iris.rar

 

5.局部加權回歸(LWR)

   當遇到類似下面情況的數據時,我們用簡單的線性回歸去擬合的話顯然不合適,這時候局部加權回歸就適用了。局部加權回歸的思想是重點考慮你輸入特征X附近的情況,同時不那么重視離你輸入特征較遠的情況,這就是所謂的“局部加權”。如下圖所示,當我們要預測X大約為-1時,Y的值。這時候我就重點考慮X=-1附近的點,然后擬合出回歸直線,作出預測。

   局部加權回歸的損失函數為:

    

   與線性回歸的損失函數相比,多了一個w權值。其中 x 是要預測的特征,這樣假設的道理是離 x 越近的樣本權重越大,越遠的影響越小。τ是帶寬參數,用來調節“局部”的大小。
  

   求出參數θ的方法有以下兩種

   批量梯度下降法:θj := θj − α· ∂J(θ)/∂θ (j = 0,1,...,n, α為學習速率, J(θ)/∂θ為J的偏導數)  不斷同時更新θj直到收斂

   正規方程法:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM