多元線性回歸求解過程 解析解求解
一、總結
一句話總結:
a、多元線性回歸求解過程 解析解求解得到的表達式是θ=(X.T*X)^(-1) * (X.T*X),這樣就可以求的ax+b中的a
b、核心代碼:theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
#構建y和x的關系。 np.random.randn(100,1)是構建的符合高斯分布(正態分布)的100行一列的隨機數。相當於給每個y增加列一個波動值。 y= 4 + 3 * X + np.random.randn(100,1) #解析解求theta到最優解 theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y) print(theta_best) [[3.98485975] [2.86232606]]
1、解析解是什么?
解析解就是指通過公式就可以求得到方程的解。我們只需要方程的參數帶入到公式中,計算公式結果就可以得到方程的解,而不用一步一步化簡求解。
2、獲取機器學習測試數據的方式(生成角度)?
可以生成隨機數據:例如 y= 4 + 3 * X + np.random.randn(100,1)
二、多元線性回歸求解過程 解析解求解
轉自或參考:多元線性回歸求解過程 解析解求解
https://blog.csdn.net/weixin_39445556/article/details/83543945
多元線性回歸常用的求解方法有兩種:
1-解析解求解法
2-梯度下降法求解
本章我們來看多元線性回歸的解析解求解法。
解析解求解法
說到解析解求解,很多同學都已經忘記了什么事解析解。解析解就是指通過公式就可以求得到方程的解。我們只需要方程的參數帶入到公式中,計算公式結果就可以得到方程的解,而不用一步一步化簡求解。比如我們初中學的一元二次方程的解細節是。是不是豁然開朗,原來就是你小子。
想要用解析解來求解最小二乘函數,那我們首先得知道他的解析解是啥。
a.求得最小二乘公式的解析解。
這里要用到上一章講到的知識點,求一個函數在某一點上的導數,就是求在這個函數的圖像上,過這一點所做切線的斜率。這一點的導函數就是切線的函數。一個二次函數的圖像是一個拋物線,那想想一下,通過圖像的頂點所做的切線是一條怎樣的直線。應該是一條與x軸平行的直線,此時這條直線的斜率為0.函數圖像的頂點就是函數的解,也就是說,我們通過函數的解這一點來做切線,切線的斜率就是0.
那我們反過來利用一下剛剛總結出的結論。如果我找到了函數圖像上切線為0的點,是不是找到了函數的解?切線是什么?對函數上某一點求導就等於通過這一點在函數圖像上做切線,作出的切線就是求導得到的導函數的圖像,切線的函數就是對函數求導所得到的導函數,那我們只要找到導函數為0對點,是不是就得到了圖像的解?(這一段一定要理解。多讀幾遍)
所以,我們可以通過對最小二乘函數求導,讓導函數為0時的結果,就是最小二乘的解。求導過程如下:
首先對最小二乘進行變形,變為矩陣表達形式:
展開矩陣函數:
展開之后我們對J(θ)求導並令導數等於0:
最終求的解析解為:θ=
2-解析解的代碼實現
手動實現:
import numpy as np
import matplotlib.pyplot as plt
from bz2 import __author__
#設置隨機種子
seed = np.random.seed(100)
#構造一個100行1列到矩陣。矩陣數值生成用rand,得到到數字是0-1到均勻分布到小數。
X = 2 * np.random.rand(100,1) #最終得到到是0-2均勻分布到小數組成到100行1列到矩陣。這一步構建列X1(訓練集數據)
#構建y和x的關系。 np.random.randn(100,1)是構建的符合高斯分布(正態分布)的100行一列的隨機數。相當於給每個y增加列一個波動值。
y= 4 + 3 * X + np.random.randn(100,1)
#將兩個矩陣組合成一個矩陣。得到的X_b是100行2列的矩陣。其中第一列全都是1.
X_b = np.c_[np.ones((100,1)),X]
#解析解求theta到最優解
theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
# print(theta_best)
# 生成兩個新的數據點,得到的是兩個x1的值
X_new = np.array([[0],[2]])
# 填充x0的值,兩個1
X_new_b = np.c_[(np.ones((2,1))),X_new]
print (X_new_b)
# 用求得的theata和構建的預測點X_new_b相乘,得到yhat
y_predice = X_new_b.dot(theta_best)
print(y_predice)
# 畫出預測函數的圖像,r-表示為用紅色的線
plt.plot(X_new,y_predice,'r-')
# 畫出已知數據X和摻雜了誤差的y,用藍色的點表示
plt.plot(X,y,'b.')
# 建立坐標軸
plt.axis([0,2,0,15,])
plt.show()
利用sklearn包實現
from sklearn.linear_model import LinearRegression
import numpy as np
import matplotlib.pyplot as plt
# 解析解求線性回歸
# 手動構建數據集和y與x的對應關系
x = 2 * np.random.rand(100,1)
y= 4 + 3*x + np.random.randn(100,1)
line_reg = LinearRegression()
# 訓練數據集,訓練完成后,參數會保存在對象line_reg中。
line_reg.fit(x,y)
# line_reg.intercept為截距,就是w0,line_reg.coef_為其他參數,coef的全拼為coefficient
print(line_reg.intercept_,line_reg.coef_)
x_new = np.array([[0],[2]])
# line_reg.predict(x_new) 為預測結果
print(line_reg.predict(x_new))
plt.plot(x_new,line_reg.predict(x_new),'r-')
# 畫出已知數據X和摻雜了誤差的y,用藍色的點表示
plt.plot(x,y,'b.')
# 建立坐標軸
plt.axis([0,2,0,15,])
plt.show()
運行結果如下:
如果有的同學想要運行代碼,需要安裝pycharm和anaconda,將python的interrupt設置為anaconda的bin目錄下的python就可以了。網上有很多教程,請原諒這里不再贅述了。
此處需要說明,因為在使用解析解求解最小二乘的過程中,出現了矩陣求逆的步驟。因為有些矩陣沒有逆矩陣,只能使用近似矩陣來代替,所以結果的精度會降低。二則矩陣求逆隨着維度的增加,計算量也大大增加,求解速度變慢。所以一般情況下我們都會使用第二種求解辦法:梯度下降。