Sklearn实现普通最小二乘法

LinearRegression拟合一个带有系数 w = ( w 1 , . . . , w p ) w=(w_1,...,w_p) w=(w1,...,wp)的线性模型,使得数据集实际观测数据和预测数据之间的残差平方和最小,其数学表达式为:
m i n w ∣ ∣ X w − y ∣ ∣ 2 2 min_w||Xw-y||^2_2 minwXwy22

Sklearn实现普通最小二乘法_第1张图片

LinearRegression 会调用 fit 方法来拟合数组 Xy,并且将线性模型的系数 w 存储在其成员变量 coef_ 中:

>>> from sklearn.linear_model import LinearRegression
>>> ols = LinearRegression()
# 训练
>>> ols.fit([[0, 0], [1, 1], [2, 2]], [0, 1, 2])
# 线性模型的系数存储在coef_
>>> print(ols.coef_)
[0.5 0.5]
# 线性模型的截距项
>>> print(ols.intercept_)
2.220446049250313e-16

然而,对于普通最小二乘的系数估计问题,其依赖于模型各个特征的相互独立性。当各个特征是相关的,且设计矩阵 X X X的各项近似线性相关,那么,设计矩阵会趋向于奇异矩阵,这种特性导致最小二乘估计对于随机误差非常敏感,可能产生很大的方差。例如,在没有实验设计的情况下收集到的数据,这种多重共线性的情况可能真的会出现。

线性回归示例

下面的示例只使用了糖尿病数据集diabetes的第一个特征,便于绘图。可以在图中看到线性回归如何试图绘制一条最小化残差平方和的直线。

import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model
from sklearn.metrics import mean_squared_error, r2_score

# 加载糖尿病数据
diabetes_x, diabetes_y = datasets.load_diabetes(return_X_y=True)
# 取糖尿病数据第三列为训练集
diabetes_x = diabetes_x[:, np.newaxis, 2]
# 划分训练集和测试集
diabetes_x_train, diabetes_x_test = diabetes_x[:-20], diabetes_x[-20:]
diabetes_y_train, diabetes_y_test = diabetes_y[:-20], diabetes_y[-20:]
# 创建线性模型对象
reg = linear_model.LinearRegression()
# 训练
reg.fit(diabetes_x_train, diabetes_y_train)
# 使用测试集预测
diabetes_y_pred = reg.predict(diabetes_x_test)
# 线性模型的系数
print("线性模型的系数:%s" % reg.coef_) # 线性模型的系数:[938.23786125]
# 均方误差
print("均方误差:%.2f" % mean_squared_error(diabetes_y_test, diabetes_y_pred)) # 均方误差:2548.07
# r2
print("R^2: %.2f" % r2_score(diabetes_y_test, diabetes_y_pred)) # R^2: 0.47

# 绘图
plt.scatter(diabetes_x_test, diabetes_y_test, color='black')
plt.plot(diabetes_x_test, diabetes_y_pred, color='blue', linewidth=3)
plt.xticks(())
plt.yticks(())
plt.show()

Sklearn实现普通最小二乘法_第2张图片

你可能感兴趣的:(AI,#,Sklearn笔记,sklearn,机器学习,普通最小二乘法)