scikit-learn linearRegression 1.1.1 普通最小二乘法

2024-05-03 19:58

本文主要是介绍scikit-learn linearRegression 1.1.1 普通最小二乘法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

普通线性回归公式:

\hat{y}(w, x) = w_0 + w_1 x_1 + ... + w_p x_p

在这个公式中,w = (w_1,...,w_p)为权值,有些书籍和文章也称为参数和权重,再线性回归中,通过优化算法求出最佳拟合的w和b(偏值),来进行预测



sklaern实例应用:

LinearRegression 用系数 :math:w = (w_1,...,w_p) 来拟合一个线性模型, 使得数据集实际观测数据和预测数据(估计值)之间误差平方和最小,这也是最小二乘法的核心思想。数学形式可表达为:

\underset{w}{min\,} {|| X w - y||_2}^2   (Xw:为预测值,y为真实值)

../_images/plot_ols_0011.png

LinearRegression 模型会调用 fit 方法来拟合X,y(X为输入,y为输出把拟).并且会合的线性模型的系数 w 存储到成员变量 coef_ 中

>>> from sklearn import linear_model
>>> clf = linear_model.LinearRegression()
>>> clf.fit ([[0, 0], [1, 1], [2, 2]], [0, 1, 2])
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
>>> clf.coef_
array([ 0.5,  0.5])
然而,对于普通最小二乘问题,其系数估计依赖模型各项相互独立。当各项是相关的,设计矩阵(Design Matrix)  x  的各列近似线性相关, 那么,设计矩阵会趋向于奇异矩阵,这会导致最小二乘估计对于随机误差非常敏感,会产生很大的方差。这种  多重共线性(multicollinearity)  的情况可能真的会出现,比如未经实验设计收集的数据.


LinearRegression具体使用实例:

本例子利用了sklearn本身自带的数据集datasets中的糖尿病患者的第一个特征,并结合label,训练和绘制出简单的二维图像,散点图,并拟合出一条直线,二维图像点到直线的距离之和最小(y轴距离label),同时还计算了方差  偏差等值

../../_images/plot_ols_001.png

Script output:

Coefficients:[ 938.23786125]
Residual sum of squares: 2548.07
Variance score: 0.47
这里的Coefficient是系数w,通过最小二乘法拟合出来的数据


import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model# Load the diabetes dataset 加载糖尿病患者数据
diabetes = datasets.load_diabetes()# Use only one feature 使用一个特征
diabetes_X = diabetes.data[:, np.newaxis, 2]# Split the data into training/testing sets 划分X的训练集和测试集
diabetes_X_train = diabetes_X[:-20]
diabetes_X_test = diabetes_X[-20:]# Split the targets into training/testing sets 划分目标label训练集和测试集,数量与x划分对应
diabetes_y_train = diabetes.target[:-20]
diabetes_y_test = diabetes.target[-20:]# Create linear regression object 创建一个线性回归模型对象
regr = linear_model.LinearRegression()# Train the model using the training sets 讲训练集和对应训练集的label放到fit()中训练模型
regr.fit(diabetes_X_train, diabetes_y_train)# The coefficients  得出训练模型参数W的值
print('Coefficients: \n', regr.coef_)
# The mean square error 预测值与真实值之间的误差平方和 predict输出预测值
print("Residual sum of squares: %.2f"% np.mean((regr.predict(diabetes_X_test) - diabetes_y_test) ** 2))
# Explained variance score: 1 is perfect prediction 
print('Variance score: %.2f' % regr.score(diabetes_X_test, diabetes_y_test))# Plot outputs  运用matplotlib绘制出图像
plt.scatter(diabetes_X_test, diabetes_y_test,  color='black')
plt.plot(diabetes_X_test, regr.predict(diabetes_X_test), color='blue',linewidth=3)plt.xticks(())
plt.yticks(())plt.show()

部分参数和函数使用方法汇总:

属性: 
coef_ : array类型,形状为 (n_features, ) 或者 (n_targets, n_features),这个是表示的线性回归求出来的系数。即方程里面经常见到的w。 
Estimated coefficients for the linear regression problem. If multiple targets are passed during the fit (y 2D), this is a 2D array of shape (n_targets, n_features), while if only one target is passed, this is a 1D array of length n_features. 
residues_ : array, shape (n_targets,) or (1,) or empty 
Sum of residuals. Squared Euclidean 2-norm for each target passed during the fit. If the linear regression problem is under-determined (the number of linearly independent rows of the training matrix is less than its number of linearly independent columns), this 
is an empty array. If the target vector passed during the fit is 1-dimensional, this is a (1,) shape array. 
New in version 0.18. 
intercept_ : 截距,b值

方法:

__init__(fit_intercept=True, normalize=False, copy_X=True, n_jobs=1)

fit(X, y, sample_weight=None)

作用: 
拟合线性模型 
参数: 
X : 训练集(自变量),numpy array类型,且形状为[n_samples,n_features] 
y : 标签(因变量)numpy array类型,形状为 [n_samples, n_targets] 
sample_weight : 每个样本的权重,形状为 [n_samples]

get_params(deep=True)

Get parameters for this estimator. 
Parametersdeep : boolean, optional 
If True, will return the parameters for this estimator and contained subobjects that are estimators. 
Returnsparams : mapping of string to any 
Parameter names mapped to their values.

predict(X)

作用:利用这个线性模型来做预测 
参数: 
X :预测的数据,形状为 (n_samples, n_features) 
返回: 
array类型,形状为 (n_samples,)

score(X, y, sample_weight=None) 
Returns the coefficient of determination R^2 of the prediction. 
The coefficient R^2 is defined as (1 - u/v), where u is the regression sum of squares ((y_true - y_pred) ** 
2).sum() and v is the residual sum of squares ((y_true - y_true.mean()) ** 2).sum(). Best possible score 
is 1.0 and it can be negative (because the model can be arbitrarily worse). A constant model that always 
predicts the expected value of y, disregarding the input features, would get a R^2 score of 0.0. 
ParametersX : array-like, shape = (n_samples, n_features) 
Test samples. 
y : array-like, shape = (n_samples) or (n_samples, n_outputs) 
True values for X. 
sample_weight : array-like, shape = [n_samples], optional 
Sample weights. 
Returnsscore : float 
R^2 of self.predict(X) wrt. y. 
29.18. sklearn.linear_model: Generalized Linear Models 1531scikit-learn user guide, Release 0.18.1 
set_params(**params) 
Set the parameters of this estimator. 
The method works on simple estimators as well as on nested objects (such as pipelines). The latter have 
parameters of the form __ so that it’s possible to update each component 
of a nested object. 
Returnsself :




本文参考了 github上这位大神带来的翻译
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model# Load the diabetes dataset
diabetes = datasets.load_diabetes()# Use only one feature
diabetes_X = diabetes.data[:, np.newaxis, 2]# Split the data into training/testing sets
diabetes_X_train = diabetes_X[:-20]
diabetes_X_test = diabetes_X[-20:]# Split the targets into training/testing sets
diabetes_y_train = diabetes.target[:-20]
diabetes_y_test = diabetes.target[-20:]# Create linear regression object
regr = linear_model.LinearRegression()# Train the model using the training sets
regr.fit(diabetes_X_train, diabetes_y_train)# The coefficients
print('Coefficients: \n', regr.coef_)
# The mean square error
print("Residual sum of squares: %.2f"% np.mean((regr.predict(diabetes_X_test) - diabetes_y_test) ** 2))
# Explained variance score: 1 is perfect prediction
print('Variance score: %.2f' % regr.score(diabetes_X_test, diabetes_y_test))# Plot outputs
plt.scatter(diabetes_X_test, diabetes_y_test,  color='black')
plt.plot(diabetes_X_test, regr.predict(diabetes_X_test), color='blue',linewidth=3)plt.xticks(())
plt.yticks(())plt.show()
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model# Load the diabetes dataset
diabetes = datasets.load_diabetes()# Use only one feature
diabetes_X = diabetes.data[:, np.newaxis, 2]# Split the data into training/testing sets
diabetes_X_train = diabetes_X[:-20]
diabetes_X_test = diabetes_X[-20:]# Split the targets into training/testing sets
diabetes_y_train = diabetes.target[:-20]
diabetes_y_test = diabetes.target[-20:]# Create linear regression object
regr = linear_model.LinearRegression()# Train the model using the training sets
regr.fit(diabetes_X_train, diabetes_y_train)# The coefficients
print('Coefficients: \n', regr.coef_)
# The mean square error
print("Residual sum of squares: %.2f"% np.mean((regr.predict(diabetes_X_test) - diabetes_y_test) ** 2))
# Explained variance score: 1 is perfect prediction
print('Variance score: %.2f' % regr.score(diabetes_X_test, diabetes_y_test))# Plot outputs
plt.scatter(diabetes_X_test, diabetes_y_test,  color='black')
plt.plot(diabetes_X_test, regr.predict(diabetes_X_test), color='blue',linewidth=3)plt.xticks(())
plt.yticks(())plt.show()

这篇关于scikit-learn linearRegression 1.1.1 普通最小二乘法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/957524

相关文章

usaco 1.1 Broken Necklace(DP)

直接上代码 接触的第一道dp ps.大概的思路就是 先从左往右用一个数组在每个点记下蓝或黑的个数 再从右到左算一遍 最后取出最大的即可 核心语句在于: 如果 str[i] = 'r'  ,   rl[i]=rl[i-1]+1, bl[i]=0 如果 str[i] = 'b' ,  bl[i]=bl[i-1]+1, rl[i]=0 如果 str[i] = 'w',  bl[i]=b

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

poj 1287 Networking(prim or kruscal最小生成树)

题意给你点与点间距离,求最小生成树。 注意点是,两点之间可能有不同的路,输入的时候选择最小的,和之前有道最短路WA的题目类似。 prim代码: #include<stdio.h>const int MaxN = 51;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int P;int prim(){bool vis[MaxN];

poj 2349 Arctic Network uva 10369(prim or kruscal最小生成树)

题目很麻烦,因为不熟悉最小生成树的算法调试了好久。 感觉网上的题目解释都没说得很清楚,不适合新手。自己写一个。 题意:给你点的坐标,然后两点间可以有两种方式来通信:第一种是卫星通信,第二种是无线电通信。 卫星通信:任何两个有卫星频道的点间都可以直接建立连接,与点间的距离无关; 无线电通信:两个点之间的距离不能超过D,无线电收发器的功率越大,D越大,越昂贵。 计算无线电收发器D

poj 1734 (floyd求最小环并打印路径)

题意: 求图中的一个最小环,并打印路径。 解析: ans 保存最小环长度。 一直wa,最后终于找到原因,inf开太大爆掉了。。。 虽然0x3f3f3f3f用memset好用,但是还是有局限性。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#incl

hdu 1102 uva 10397(最小生成树prim)

hdu 1102: 题意: 给一个邻接矩阵,给一些村庄间已经修的路,问最小生成树。 解析: 把已经修的路的权值改为0,套个prim()。 注意prim 最外层循坏为n-1。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstri

【WebGPU Unleashed】1.1 绘制三角形

一部2024新的WebGPU教程,作者Shi Yan。内容很好,翻译过来与大家共享,内容上会有改动,加上自己的理解。更多精彩内容尽在 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加微信号:digital_twin123 在 3D 渲染领域,三角形是最基本的绘制元素。在这里,我们将学习如何绘制单个三角形。接下来我们将制作一个简单的着色器来定义三角形内的像素

poj 2175 最小费用最大流TLE

题意: 一条街上有n个大楼,坐标为xi,yi,bi个人在里面工作。 然后防空洞的坐标为pj,qj,可以容纳cj个人。 从大楼i中的人到防空洞j去避难所需的时间为 abs(xi - pi) + (yi - qi) + 1。 现在设计了一个避难计划,指定从大楼i到防空洞j避难的人数 eij。 判断如果按照原计划进行,所有人避难所用的时间总和是不是最小的。 若是,输出“OPETIMAL",若

poj 2135 有流量限制的最小费用最大流

题意: 农场里有n块地,其中约翰的家在1号地,二n号地有个很大的仓库。 农场有M条道路(双向),道路i连接着ai号地和bi号地,长度为ci。 约翰希望按照从家里出发,经过若干块地后到达仓库,然后再返回家中的顺序带朋友参观。 如果要求往返不能经过同一条路两次,求参观路线总长度的最小值。 解析: 如果只考虑去或者回的情况,问题只不过是无向图中两点之间的最短路问题。 但是现在要去要回

poj 3422 有流量限制的最小费用流 反用求最大 + 拆点

题意: 给一个n*n(50 * 50) 的数字迷宫,从左上点开始走,走到右下点。 每次只能往右移一格,或者往下移一格。 每个格子,第一次到达时可以获得格子对应的数字作为奖励,再次到达则没有奖励。 问走k次这个迷宫,最大能获得多少奖励。 解析: 拆点,拿样例来说明: 3 2 1 2 3 0 2 1 1 4 2 3*3的数字迷宫,走两次最大能获得多少奖励。 将每个点拆成两个