-
自定义多元回归函数linearRegression,要求输入参数为 X X X和 y y y,分别为xArr和yArr,输出为参数 w s ws ws
-
已知最小二乘法的解为:
w ^ = ( X T X ) − 1 X T y \hat{\boldsymbol{w}} = (\mathbf{X}^{\text{T}} \mathbf{X})^{-1}\mathbf{X}^{\text{T}} \boldsymbol{y} w^=(XTX)−1XTy -
使用美国医疗保险费数据insurance.csv的连续型特征age、bmi和children作为输入特征,目标特征为charges,根据linearRegression得到回归参数向量ws
(1)注意判断 ( X T X ) − 1 (\mathbf{X}^{\text{T}} \mathbf{X})^{-1} (XTX)−1是否存在
(2)为了得到模型的截距,需要在数据矩阵X中添加一列,并且该列所有行的值都为1:np.column_stack((X,ones(X.shape[0]))) -
比较sklearn运行的结果跟自定义函数的输出结果是否一致
from sklearn import linear_model
from numpy import mat, linalg, column_stack, ones
import pandas as pd
insurance = pd.read_csv('insurance.csv')
# 定义多元线性回归函数
def linearRegression(xArr,yArr):
xMat = mat(xArr)
yMat = mat(yArr).T
xTx = xMat.T*xMat
if linalg.det(xTx) == 0.0:
print "singular matrix, can't do inverse"
ws = linalg.solve(xTx, xMat.T*yMat)
return ws
# 模型训练,得到参数值
X = insurance[['age', 'bmi', 'children']].values
X = column_stack((X,ones(X.shape[0])))
y = insurance['charges']
ws = linearRegression(X, y)
print ws
# sklearn的训练结果
regr = linear_model.LinearRegression()
regr.fit(X, y)
print regr.coef_
print regr.intercept_
[[ 239.99447429]
[ 332.0833645 ]
[ 542.86465225]
[-6916.24334779]]
[239.99447429 332.0833645 542.86465225 0. ]
-6916.243347787033