python中三个线性回归解决方法

import numpy as np
import scipy as sp
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.linear_model import SGDRegressor
from sklearn.linear_model import LinearRegression
from scipy.optimize import leastsq
sns.set()

#数据
X = 10 * np.random.rand(50, 1)
y = 2 * X - 5 + np.random.randn(50, 1)
#print(X.shape,y.shape)#(50, 1) (50, 1)


# 梯度下降回归
sgd_reg = SGDRegressor(max_iter=100)  # 最大迭代次数
sgd_reg.fit(X, y.ravel())
#print('y.ravel().shape:',y.ravel().shape) #y.ravel().shape:(50,)
print(sgd_reg.predict(1.5))  # 预测
print("W0=", sgd_reg.intercept_)
print("W1=", sgd_reg.coef_)


xfit = np.linspace(0, 10, 1000)
yfit1 = sgd_reg.predict(xfit[:, np.newaxis])
#print('yfit1.shape:',yfit1.shape)#yfit1.shape: (1000,)
print("="*50)

#线性回归
LR = LinearRegression(fit_intercept=True)
LR.fit(X, y)
#print('y.shape:',y.shape)#y.shape: (50, 1)

yfit2 = LR.predict(xfit[:, np.newaxis])
#print('yfit2.shape:',yfit2.shape) #yfit2.shape: (1000, 1)
print(LR.predict(1.5)[0])  
print("Model intercept(w0):", LR.intercept_)
print("Model slope(w1): ", LR.coef_[0])
#print(type(LR.coef_[0]),type(sgd_reg.coef_))
print("="*50)

#最小二乘
def func(p,x):
    k,b=p
    return k*x+b

def error(p,x,y):
    return func(p,x)-y


p0=[1,20]
Para=leastsq(error,p0,args=(X.ravel(),y.ravel()))
k,b=Para[0]
print(k*1.5+b)
print('w0:',str(round(b,2)))
print('w1:',str(round(k,2)))
yfit3=k*xfit[:, np.newaxis]+b

#画图
plt.scatter(X,y)
plt.plot(xfit,yfit1,color='red')
plt.plot(xfit,yfit2,color='yellow')
plt.plot(xfit,yfit3,color='blue')
plt.show()


程序是我模仿了三篇文章写的,原文分别是

1.https://www.cnblogs.com/yszd/p/9280700.html

2.https://blog.csdn.net/weixin_34314962/article/details/86247121

3.https://www.cnblogs.com/lc1217/p/6514734.html

    这些代码问题不大,主要是每一篇中的数据格式不同,需要修改。

输出:

[-1.40302364]
W0= [-4.22892382]
W1= [1.88393345]
==================================================
[-2.00646028]
Model intercept(w0): [-5.04987531]
Model slope(w1):  [2.02894335]
==================================================
-2.006460274652897
w0: -5.05
w1: 2.03

图像:

LinearRegression与leastlq结果十分相似,所以蓝色线盖住了黄色线。程序中如果注掉leastlq的图像,LinearRegression就会出现。


8种python实现线性回归的方法:(https://baijiahao.baidu.com/s?id=1589000357170305884&wfr=spider&for=pc&isFailFlag=1

方法一: Scipy.polyfit( ) or numpy.polyfit( )

一个最基本的最小二乘多项式拟合函数(least squares polynomial fit function),接受数据集和任何维度的多项式函数(由用户指定),并返回一组使平方误差最小的系数;

方法二:Stats.linregress( )

一个高度专业化的线性回归函数,可以在SciPy的统计模块中找到。然而因为它仅被用来优化计算两组测量数据的最小二乘回归,所以其灵活性相当受限。因此,不能使用它进行广义线性模型和多元回归拟合。但是,由于其特殊性,它是简单线性回归中最快速的方法之一。除了拟合的系数和截距项之外,它还返回基本统计量,如R2系数和标准差。

方法三:Optimize.curve_fit( )

与Polyfit方法是一致的,但本质上更具一般性。这个强大的函数来自scipy.optimize模块,可以通过最小二乘最小化将任意的用户自定义函数拟合到数据集上。对于简单的线性回归来说,可以只写一个线性的mx + c函数并调用这个估计函数。也适用于多元回归,并返回最小二乘度量最小的函数参数数组以及协方差矩阵。

方法四:numpy.linalg.lstsq()

通过矩阵分解计算线性方程组的最小二乘解的基本方法。

方法五:Statsmodels.OLS ( )

Statsmodels是一个小型的Python包,它为许多不同的统计模型估计提供了类和函数,还提供了用于统计测试和统计数据探索的类和函数。每个估计对应一个泛结果列表。可根据现有的统计包进行测试,从而确保统计结果的正确性。对于线性回归,可以使用该包中的OLS或一般最小二乘函数来获得估计过程中的完整的统计信息。

方法六和七:使用矩阵的逆求解析解

对于条件良好的线性回归问题(其中,至少满足数据点个数>特征数量),系数求解等价于存在一个简单的闭式矩阵解,使得最小二乘最小化。这里有两个选择:

(a)使用简单的乘法求矩阵的逆;

(b)首先计算x的Moore-Penrose广义伪逆矩阵,然后与y取点积。由于第二个过程涉及奇异值分解(SVD),所以它比较慢,但是它可以很好地适用于没有良好条件的数据集。

方法八:sklearn.linear_model.LinearRegression( )

这是大多数机器学习工程师和数据科学家使用的典型方法。当然,对于现实世界中的问题,它可能被交叉验证和正则化的算法如Lasso回归和Ridge回归所取代,而不被过多使用,但是这些高级函数的核心正是这个模型本身。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值