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回归所取代,而不被过多使用,但是这些高级函数的核心正是这个模型本身。