線性回歸模型(Linear Regression)及Python實現
1.模型
對於一份數據,它有兩個變量,分別是Petal.Width和Sepal.Length,畫出它們的散點圖。我們希望可以構建一個函數去預測Sepal.Length,當我們輸入Petal.Width時,可以返回一個預測的Sepal.Length。從散點圖可以發現,可以用一條直線去擬合,這時我們可以構建一元線性回歸模型:hθ(x) = θ0 + θ1x1 (x1= Petal.Width)。當然,如果我們的特征X不止一個的話,我們可以構造多元線性回歸模型,hθ(x) = ∑θixi (i = 0,...,n , x0 = 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 (j = 0,1,...,n, α為學習速率, J(θ)/∂θj 為J的偏導數) 不斷同時更新θj直到收斂
正規方程法: