線性回歸的基本含義
在統計學中,線性回歸(Linear Regression)是利用稱為線性回歸方程的最小平方函數對一個或多個
自變量和
因變量之間關系進行建模的一種
回歸分析。這種函數是一個或多個稱為回歸系數的模型參數的線性組合。只有一個自變量的情況稱為簡單回歸,大於一個自變量情況的叫做多元回歸。(這反過來又應當由多個相關的因變量預測的多元線性回歸區別,而不是一個單一的標量變量。)
在線性回歸中,數據使用線性預測函數來建模,並且未知的模型參數也是通過數據來估計。這些模型被叫做線性模型。最常用的線性回歸建模是給定X值的y的條件均值是X的仿射函數。不太一般的情況,線性回歸模型可以是一個中位數或一些其他的給定X的條件下y的條件分布的分位數作為X的線性函數表示。像所有形式的回歸分析一樣,線性回歸也把焦點放在給定X值的y的條件概率分布,而不是X和y的聯合概率分布(多元分析領域)。
例如,房子的面積
x與房子的價格 y具有一定的線性關系,也就是說,我們可以畫出能夠大致表示 x與 y關系的一條直線,如下圖:

在該直線中,房子的面積 x為自變量,房子的價格 y為因變量。而“線性回歸”的目的就是,利用自變量 x與因變量 y,來學習出這么一條能夠描述兩者之間關系的線。對於一元線性回歸來說就是學習出一條直線,而對於多元線性回歸來說則是學習出一個面或超平面。
一元線性回歸模型
在概念上理解了線性回歸是什么之后,我們就需要將線性回歸的問題進行抽象化,轉換成我們能夠求解的數學問題。
在上面的例子中,我們可以看出自變量 x與因變量 y致成線性關系,因此我們可以對因變量做如下假設(hypothesis):

或者記作:

其中 i=1,2,...,mi=1,2,...,m
在這里使用是由於通過觀察,我們可以發現直線並沒有完全擬合數據,而是存在一定的誤差。該假設即為一元線性函數的模型函數,其中含有兩個參數
與
。其中
可視為斜率,
為直線在y 軸上的截距。接下來的任務就是如何求得這兩個未知參數。
優化算法
在這里我們將使用兩種方法進行參數的求解:(1)最小二乘法(2)梯度下降法
1、最小二乘法
最小二乘法(又稱最小平方法)是一種數學優化技術。它通過最小化誤差的平方和尋找數據的最佳函數匹配。利用最小二乘法可以簡便地求得未知的數據,並使得這些求得的數據與實際數據之間誤差的平方和為最小。最小二乘法還可用於曲線擬合。
簡單推導過程:
2、梯度下降法
如下圖所示,將梯度下降的原理形象地描述為下山,直到獲得一個局部或者全局最小值。在每次迭代中,根據給定的學習速率和梯度的斜率,能夠確定每次移動的步幅,按照步幅沿着梯度方向前進一步。
簡單代碼實現如下:
1 class LinearModel(object): 2 def __init__(self): 3 # 初始值 4 self.w = np.random.randn(1)[0] 5 self.b = np.random.randn(1)[0] 6 7 def model(self,x):#線性模型 8 return self.w * x + self.b 9 10 def cost(self,x,y): 11 c = (self.model(x) - y)**2 12 # 偏導數(包含導數) = 梯度 13 dw = 2*(self.model(x) - y)*x 14 db = 2*(self.model(x) - y)*1 15 return c,dw,db 16 # 梯度下降更新數據 17 def gradient_descent(self,dw,db,step): 18 self.w -= dw*step 19 self.b -= db*step 20 21 def fit(self,X,y): 22 w_last = self.w + 0.1 23 b_last = self.b + 0.1 24 length = len(X) 25 count = 1 26 while True: 27 if (abs(self.w - w_last) < 1e-4) and (abs(self.b - b_last) < 1e-4): 28 print('*********************') 29 break 30 cost_ = 0 31 derivative_w = 0 32 derivative_b = 0 33 for xi,yi in zip(X,y): 34 c_,dw_,db_ = self.cost(xi[0],yi)# 求解的是每一個樣本的損失、w偏導、b偏導 35 cost_ += c_/length 36 derivative_w += dw_/length 37 derivative_b += db_/length 38 # cost_、derivative_w、derivative 整體的損失,偏導 39 w_last = self.w 40 b_last = self.b 41 42 self.gradient_descent(derivative_w,derivative_b,0.01) 43 44 print('--------------------------------梯度下降更新次數是:%d。損失是:%0.4f'%(count,cost_)) 45 count +=1 46 47 print('++++++++++++++++++++++++++++++++++梯度下降計算的斜率是:%0.4f。計算的截距是:%0.4f'%(self.w,self.b)) 48 49 linear_model = LinearModel() 50 linear_model.fit(X,y)
線性回歸算法的優缺點
優點:
(1)思想簡單,實現容易。建模迅速,對於小數據量、簡單的關系很有效;
(2)是許多強大的非線性模型的基礎。
(3)線性回歸模型十分容易理解,結果具有很好的可解釋性,有利於決策分析。
(4)蘊含機器學習中的很多重要思想。
(5)能解決回歸問題。
缺點:
(1)對於非線性數據或者數據特征間具有相關性多項式回歸難以建模.
(2)難以很好地表達高度復雜的數據。