線性回歸

鏈接:
1. 線性回歸總結
2. 正則化
3. 邏輯回歸
4. Boosting
5. Adaboost算法


一. 模型介紹

線性回歸簡而言之就是在平面中用一條直線去擬合一些點數據,在三維空間中就是用一個平面去擬合三維中的數據,而我們要做的就是尋找出一條最佳的線段或者平面去擬合數據,當然高維情況類似去尋找超平面。
初中的時候我們就學習過一元一次方程,那就是一個簡單的擬合過程,只不過那個是完全可以擬合在一條線上,現在要做的是在有誤差或者數據非線性排列的情況下,我們只能去盡力找出一條最佳的擬合線路:

import numpy as np
import matplotlib.pyplot as plt
x = np.arange(1,10,2).reshape(-1,1)
y = a*2 
plt.plot(x,y,'r-',linewidth=2, label=u"線性擬合")
plt.plot(x,y, 'bo')
plt.show()
完全擬合,二元一次方程組求解;(數據線性情況下)
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

x = np.arange(1,10,2).reshape(-1,1)
y = a*2 + np.random.randn(5)
linear_model = LinearRegression()
linear_model.fit(x.reshape(-1, 1),y)
y_pre = linear_model.predict(x)
plt.plot(x,y_pre,'r-',linewidth=2, label=u"線性擬合")
plt.plot(x,y, 'bo')
plt.show()
線性回歸;尋找最佳的擬合線段;(數據非線性情況下)

定義一下一些符號表達,我們通常習慣用X=(x1,x2,...,xn)T∈?n×p表示數據矩陣,其中xi∈?p表示一個p維度長的數據樣本;y=(y1,y2,...,yn)T∈?n表示數據的label,這里只考慮每個樣本一類的情況。

線性回歸的模型是這樣的,對于一個樣本xi,它的輸出值是其特征的線性組合:

線性表達式

其中,w0稱為截距,或者bias,通過設置X中X0=1,向量表達,簡化了形式,因此實際上xi有p+1維度。
線性回歸的目標是用預測結果盡可能地擬合目標label,

二. 損失函數

從下圖來直觀理解一下線性回歸優化的目標——圖中線段距離(平方)的平均值,也就是最小化到分割面的距離和。


三維中擬合后的情況

這里我們要做的是在隨機放置權值W的情況下不斷的優化程式,以達到效果最佳的情況,這里的優化指的是盡量讓各個點擬合在所求超平面,如果不能擬合,也要使得其距離超平面最近為好,也就是可以定義損失函數

損失函數

三. 求解過程

由于上述損失函數圖形如下,我們這里選用兩種方式去求解


J(θ)平面

1. 矩陣滿秩:###

這種形式下我們可以通過求解導數為零的方式求解算法,可以直接得到最后的W權值.


矩陣形式轉換

求解過程

1. 矩陣不滿秩:###

當矩陣不滿秩,無法求得上述的矩陣逆解,這里采用梯度下降法進行求解,梯度下降法通常分為三種形式:整體批次梯度下降法,隨機梯度下降法和批量梯度下降法.
  梯度下降算法是一種求局部最優解的方法,對于F(x),在a點的梯度是F(x)增長最快的方向,那么它的相反方向則是該點下降最快的方向,具體參考wikipedia
   原理:將函數比作一座山,我們站在某個山坡上,往四周看,從哪個方向向下走一小步,能夠下降的最快;注意:當變量之間大小相差很大時,應該先將他們做處理,使得他們的值在同一個范圍,這樣比較準確。
1)首先對θ賦值,這個值可以是隨機的,也可以讓θ是一個全零的向量。
2)改變θ的值,使得J(θ)按梯度下降的方向進行減少。
 描述一下梯度減少的過程,對于我們的函數J(θ)求偏導J:


下圖表達出解得最終結果與初始值相關:
梯度下降方式

在這里我們需要進行的是:


迭代公式

在批量梯度下降中,每一次參數更新都會遍歷全部的訓練數據{x1, y1}, {x2, y2}, ... , {xm,ym}對于線性回歸問題,這種方法可以得到一個全局最優解,但是當樣本數據量很大的時候,會非常耗時。

多項式回歸

我們可以通過設計高階特征在線性回歸的基礎上實現多項式回歸。對于線性回歸的hypothesis,



令$ x2=x1^2, x3=x1^3 $,實現了一個3次多項式的回歸:



這也是用線性模型實現非線性的常用方法。這種方式能夠擬合出非線性的超平面,有時候表現出很好的特性
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
X_train = [[6], [8], [10], [14], [18]]
y_train = [[7], [9], [13], [17.5], [18]]
X_test = [[6], [8], [11], [16]]
y_test = [[8], [12], [15], [18]]

quadratic_featurizer = PolynomialFeatures(degree=2)
X_train_quadratic = quadratic_featurizer.fit_transform(X_train)
X_test_quadratic = quadratic_featurizer.transform(X_test)
xx = np.linspace(0, 26, 100)
regressor_quadratic = LinearRegression()
regressor_quadratic.fit(X_train_quadratic, y_train)
xx_quadratic = quadratic_featurizer.transform(xx.reshape(xx.shape[0], 1))
plt.plot(xx, regressor_quadratic.predict(xx_quadratic), 'r-')
plt.show()
多項式回歸與一般線性回歸對比

線性回歸代碼地址

參考:
機器學習方法:回歸(一):線性回歸Linear regression
機器學習-----線性回歸淺談(Linear Regression)
Stanford機器學習筆記-1.線性回歸
線性回歸

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容