我們的目的是求解出具體的參數值,可以穿過這些點的直線可以有多條,如何選取呢?此時就需要引入一個評價標準。在最小二乘法中,這個評價標準就會誤差平方和,定義如下
其中e表示通過回歸方程計算出的擬合值與實際觀測值的差,通過維基百科上的例子來看下實際的計算過程
如上圖所示,有4個紅色的採樣點,在每個點都可以得到(x, y)的觀測值,將4個採樣點的數據,帶入回歸方程,可以得到如下結果
計算全部點的誤差平方和,結果如下
對於上述函數,包含了兩個自變量,為了求解其最小值,可以藉助偏導數來實現。通過偏導數和函數極值的關係可以知道,在函數的最小值處,偏導數肯定為0,所以可以推導出如下公式
對於上述兩個方程構成的方程組,簡單利用消元法或者代數法就可以快速求出兩個參數的值
實際上,更加通過的方法是通過矩陣運算來求解,這種方法不僅適合一元線性回歸,也適合多元線性回歸,其本質是利用矩陣來求解以下方程組
計算過程如下
>>> data = np.array([[1, 1], [1, 2], [1, 3], [1, 4]])
>>> data
array([[1, 1],
[1, 2],
[1, 3],
[1, 4]])
>>> target = np.array([6, 5, 7, 10]).reshape(-1, 1)
>>> target
array([[ 6],
[ 5],
[ 7],
[10]])
# 先對data矩陣求逆矩陣
# 再計算兩個矩陣的乘積
>>> np.matmul(np.matrix(data).I, target)
matrix([[3.5],
[1.4]])
通過一個逆矩陣與矩陣乘積操作,就可以方便的求解參數。在scikit-learn中,使用最小二乘法的代碼如下
>>> data = np.array([1, 2, 3, 4]).reshape(-1, 1)
>>> data
array([[1],
[2],
[3],
[4]])
>>> target = np.array([6, 5, 7, 10]).reshape(-1, 1)
>>> target
array([[ 6],
[ 5],
[ 7],
[10]])
>>> reg = linear_model.LinearRegression()
>>> reg.fit(data, target)
LinearRegression()
>>> reg.intercept_
array([3.5])
>>> reg.coef_
array([[1.4]])
intercept_表示回歸方程的截距,coef_表示回歸方程的係數。
最小二乘法的求解過程簡單粗暴,但是也存在一定限制,首先,根據方程組能夠求解可以知道,樣本數目必須大於等於特徵的個數;其次,當輸入的特徵很多,大於10000時,矩陣運算非常的費時。
最小二乘法肯定可以求解出線性方程的解,但是其解只是在線性模型假設的前提下得到的最優解,如果數據不符合線性模型,此時用最小二乘法依然可以得到結果,但是顯然是一個非常差的擬合結果,為了更好的評估線性回歸擬合效果的好壞,我們還需要一個評估指標R square, 公式如下
這個值也稱之為擬合優度,從定義可以看出,其範圍在0到1之間,越靠近1,說明擬合效果越好。在scikit-learn中,提供了計算擬合優度的函數,用法如下
>>> from sklearn.metrics import mean_squared_error, r2_score
>>> predict = reg.predict(data)
>>> mean_squared_error(target, predict)
1.0500000000000003
>>> r2_score(target, predict)
0.7
對於線性回歸而言,離群值對擬合結果影響很大,在預處理階段,要注意過濾離群值點;同時,我們會根據回歸係數對變量的重要性進行排序,此時要注意各個變量的單位是不一樣的,在預處理階段需要進行歸一化。
原創不易,歡迎收藏,點讚,轉發!生信知識浩瀚如海,在生信學習的道路上,讓我們一起並肩作戰!
本公眾號深耕耘生信領域多年,具有豐富的數據分析經驗,致力於提供真正有價值的數據分析服務,擅長個性化分析,歡迎有需要的老師和同學前來諮詢。轉發本文至朋友圈,後臺私信截圖即可加入生信交流群,和小夥伴一起學習交流。掃描下方二維碼,關注我們,解鎖更多精彩內容!