線性回歸形如y=w*x+b的形式,變量為連續型(離散為分類)。一般求解這樣的式子可采用最小二乘法原理,即方差最小化,
loss=min(y_pred-y_true)^2。若為一元回歸,就可以求w與b的偏導,並令其為0,可求得w與b值;若為多元線性回歸,
將用到梯度下降法求解,這里的梯度值w的偏導數,利用目標公式,loss如下:
對其求偏導,公式如下:
其中x表示為(n+1)行m列,有n個屬性,m個樣本,最后一行值為1給偏差的;y表示m行1列為m個樣本的值;
w表示(n+1)行1列為n個w對應屬性最后一個為b表示偏差。
# 調用多元線性回歸模型
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
d=datasets.load_boston()
print(d.data)
print(d.DESCR)
print(d.feature_names)
print(d.data[:,5])
x=d.data[d.target<50]
y=d.target[d.target<50]
from sklearn.linear_model import LinearRegression #引入多元線性回歸算法模塊進行相應的訓練
simple2=LinearRegression()
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(x,y,random_state=666)
simple2.fit(x_train,y_train)
print(simple2.coef_) #輸出多元線性回歸的各項系數
print(simple2.intercept_) #輸出多元線性回歸的常數項的值
y_predict=simple2.predict(x_test)
from sklearn.metrics import mean_absolute_error
from sklearn.metrics import mean_squared_error
from sklearn.metrics import r2_score #直接調用庫函數進行輸出R2
print(mean_squared_error(y_test,y_predict))
print(mean_absolute_error(y_test,y_predict))
print(r2_score(y_test,y_predict))
print(simple2.score(x_test,y_test))
print(simple2.coef_) #輸出多元回歸算法的各個特征的系數矩陣
print(np.argsort(simple2.coef_)) #輸出多元線性回歸算法各個特征的系數排序,可以知道各個特征的影響度
print(d.feature_names[np.argsort(simple2.coef_)]) #輸出各個特征按照影響系數從小到大的順序
雖然已經手寫出梯度下降法的求解過程,但是該數據不能求解出一條很好的方程,但跟着博客思路應該沒有,我想是因為設置w的初始化或者參數配置的原因,
也或許是數據的不好,代碼是沒有問題,將show出供讀者參考,如下:
# 手寫多元線性回歸模型,采用梯度下降法來計算
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets # 調用sklearn的數據集
d=datasets.load_boston()
# print(d.data)
# print(d.DESCR)
# print(d.feature_names)
# print(d.data[:,5])
x=d.data[d.target<50]
y=d.target[d.target<50]
# print(x.shape) # 490個樣本,每個樣本有13個屬性
# print(y.shape) # 490個y值
# 建立w的矩陣
def GradLinear(X,Y,learn=0.001,threshold=0.1,iterator_stop=0):
# 數據處理
m, n = X.shape # m表示樣本個數,n表示每個樣本的屬性
y = Y.reshape((m,1))
x_temp = X.T
x = np.ones((n+1, m))
x[:n, :] = x_temp
w_old = np.ones((n+1, 1)) # 這里可以隨機初始化w
w_best=w_old # 保存最好的w
iterator=0
while True:
# 2X(XT*w−y) #對w與b求偏導的公式
w_new=2*np.dot(x,(np.dot(x.T,w_old)-y))
w_new=w_old-learn*w_new
y_pred=np.dot(w_new.T,x).reshape((m,1))
loss=np.sum((y-y_pred)*(y-y_pred))/m
w_old=w_new
if loss <threshold:
break
if iterator==0:
loss_old=loss
w_true = w_best[:-1] # 保證有值,不會出現小概率錯誤
b = w_best[-1]
if loss-loss_old<0: # 利用了啟發式思維
w_best=w_new
w_true=w_best[:-1]
b=w_best[-1]
if iterator_stop:
break
iterator = iterator+1
print(loss)
return w_true,b
if __name__=='__main__':
w,b=GradLinear(x,y,learn=0.00001,threshold=0.1)
print('w=',w)
print('b=',b)
參考博客: https://blog.csdn.net/engineerhe/article/details/99343551