Sklearn实现普通最小二乘法

Sklearn实现普通最小二乘法LinearRegres 拟合一个带有系数 w w1 wp w w 1 w p w w1 wp 的线性模型 使得数据集实际观测数据和预测数据之间的残差平方和最小 其数学表达式为 minw Xw y 22min w Xw y 2 2minw Xw y 22 LinearRegres 会调用 fit 方法来拟合数组 X y 并且将线性模型的系数 w 存储在其成员变量 coef 中 gt gt gt fromsklearn lin

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

ols

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.0313e-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.] # 均方误差 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() 

ols

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/178376.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午5:25
下一篇 2026年3月26日 下午5:25


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号