其他分享
首页 > 其他分享> > 机器学习-线性回归

机器学习-线性回归

作者:互联网

线性回归

线性回归,又名普通最小二乘法,是回归问题最简单也是最经典的回归方法

文章目录

1.使用numpy线性回归

(1)函数:p = polyfit(x,y,n)

x是已知的离散数据点的横坐标,y是已知离散数据点的纵坐标,
n为需要拟合的多项式最高次幂,由我们给定,运用不同的多项式进行拟合.

p = polyfit(x,y,n)返回值p从左到右是高次到低次的多项式p(x)的系数,长度是n+1
p(x)=p1xn+p2xn−1+…+pnx+p(n+1)

(2)函数:np.poly1d()
这个函数的返回值是一个你和出来的多项式方程.

(3)函数:y=polyval(p,x);
根据拟合的函数得出x对应的因变量y的值

多项式n的阶数的确定:

1.1拟合直线

首先我们模拟一下数据散点:

import numpy as np
import matplotlib.pyplot as plt

Xi=np.array([6.19,2.51,7.29,7.01,5.7,2.66,3.98,2.5,9.1,4.2])
Yi=np.array([5.25,2.83,6.41,6.71,5.1,4.23,5.05,1.98,10.5,6.3])

画出散点的图像:

import numpy as np
import matplotlib.pyplot as plt

Xi=np.array([6.19,2.51,7.29,7.01,5.7,2.66,3.98,2.5,9.1,4.2])
Yi=np.array([5.25,2.83,6.41,6.71,5.1,4.23,5.05,1.98,10.5,6.3])
plt.scatter(Xi,Yi)
plt.show()

输出结果:
在这里插入图片描述
接下来我们使用刚刚提到的三个函数进行拟合直线

import numpy as np
import matplotlib.pyplot as plt
# 处理乱码
matplotlib.rcParams['font.sans-serif'] = ['SimHei']  # 用黑体显示中文
#模拟数据
Xi=np.array([6.19,2.51,7.29,7.01,5.7,2.66,3.98,2.5,9.1,4.2])
Yi=np.array([5.25,2.83,6.41,6.71,5.1,4.23,5.05,1.98,10.5,6.3])

X=np.linspace(1,10,100)
yi_fit=np.polyfit(Xi,Yi,1)#利用最小二乘法计算出多项式的系数,多项式最高次幂=1

yi_1d=np.poly1d(yi_fit)##根据计算出来的系数拟合方程

yi_hat=yi_1d(X)#代入横坐标,算出拟合的y坐标
plt.scatter(Xi,Yi)
plt.plot(X,yi_hat,c='red')#画出拟合后的直线图像
plt.show()

输出结果:
在这里插入图片描述

我们来输出一下这两项:

print("yi_fit:",yi_fit)
yi_1d=np.poly1d(yi_fit)
print("yi_1d",yi_1d)
yi_hat=yi_1d(X)


输出结果:

yi_fit: [0.90045842 0.83105566]
yi_1d :
0.9005 x + 0.8311
进程已结束,退出代码为 0

1.2高阶多项式拟合曲线

首先我们用三角函数来模拟数据散点,顺带画出图像

import numpy as np
import matplotlib.pyplot as plt

#模拟数据
def f(x):
    return 2 * np.sin(x) + 3
# X and Y
x = np.linspace(0, 4 * np.pi)
y = f(x) + 0.2 * np.random.randn(len(x))  # 添加噪点

plt.scatter(x,y)
plt.show()

输出结果:
在这里插入图片描述

接下来我们还是使用刚才的三个函数,使用高阶多项式拟合曲线

import numpy as np
import matplotlib.pyplot as plt

#模拟数据
def f(x):
    return 2 * np.sin(x) + 3
# X and Y
x = np.linspace(0, 2 * np.pi)#设置三角函数的定义域
y = f(x) + 0.2 * np.random.randn(len(x))  # 添加噪点

y_fit = np.polyfit(x, y, 3)#利用最小二乘法计算出多项式的系数,此时多项式的最高次幂=3
print('y_fit:', y_fit)

y_fit_1d = np.poly1d(y_fit)#根据计算出来的系数拟合方程
print('y_fit_1d:\n', y_fit_1d)

y_hat = np.polyval(y_fit, x)#代入数据,算出拟合的y坐标
# 这个形式也可以: y_hat = y_fit_1d(x)
print('y_hat:', y_hat)

print('Correlation coefficients:')#相关系数
print(np.corrcoef(y_hat, y))

plt.figure(dpi=200)
plot1 = plt.plot(x, y, 'o', label='Original Values')
plot3 = plt.plot(x, f(x), 'g', label='Original Curve')
plot2 = plt.plot(x, y_hat, 'r', label='Fitting Curve')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.title('Polyfitting')
plt.show()

输出结果:
在这里插入图片描述
要是我们把模拟出来的数据定义域改为(0~4np.pi)不更改多项式的最高次幂看看拟合出来的曲线是什么样:

import numpy as np
import matplotlib.pyplot as plt

#模拟数据
def f(x):
    return 2 * np.sin(x) + 3
# X and Y
x = np.linspace(0, 4 * np.pi)#设置三角函数的定义域
y = f(x) + 0.2 * np.random.randn(len(x))  # 添加噪点

y_fit = np.polyfit(x, y, 3)#利用最小二乘法计算出多项式的系数,此时多项式的最高次幂=3
print('y_fit:', y_fit)

y_fit_1d = np.poly1d(y_fit)#根据计算出来的系数拟合方程
print('y_fit_1d:\n', y_fit_1d)

y_hat = np.polyval(y_fit, x)#代入数据,算出拟合的y坐标
# 这个形式也可以: y_hat = y_fit_1d(x)
print('y_hat:', y_hat)

print('Correlation coefficients:')#相关系数
print(np.corrcoef(y_hat, y))

plt.figure(dpi=200)
plot1 = plt.plot(x, y, 'o', label='Original Values')
plot3 = plt.plot(x, f(x), 'g', label='Original Curve')
plot2 = plt.plot(x, y_hat, 'r', label='Fitting Curve')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.title('Polyfitting')
plt.show()

输出:
Correlation coefficients:
[[1. 0.49067649]
[0.49067649 1. ]]
在这里插入图片描述
很明显这就拟合的不是很准确,所以我们要把最高次幂改为合适的数字
y_fit = np.polyfit(x, y, 7)

.
输出:
Correlation coefficients:
[[1. 0.99209803]
[0.99209803 1. ]]

在这里插入图片描述
相关系数很接近1,就代表拟合的很准确.

2.使用sklearn进行回归

使用sklearn进行回归时,数据需要使用二维的形式

2.1拟合直线

from sklearn import linear_model
import numpy as np
import matplotlib.pyplot as plt
##样本数据(Xi,Yi),需要转换成数组(列表)形式
Xi=np.array([6.19,2.51,7.29,7.01,5.7,2.66,3.98,2.5,9.1,4.2]).reshape(-1,1)
Yi=np.array([5.25,2.83,6.41,6.71,5.1,4.23,5.05,1.98,10.5,6.3]).reshape(-1,1)
##设置模型
model = linear_model.LinearRegression()
##训练数据
model.fit(Xi, Yi)
##用训练得出的模型预测数据
y_plot = model.predict(Xi)
##打印线性方程的权重
print(model.coef_) ## 0.90045842
##绘图
plt.scatter(Xi, Yi, color='red',label="ynagben",linewidth=2)
plt.plot(Xi, y_plot, color='green',label="nihe",linewidth=2)
plt.legend(loc='best')
plt.show()

输出:
在这里插入图片描述

2.2 拟合曲线

from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import Ridge
##样本数据(Xi,Yi),需要转换成数组(列表)形式
Xi=np.array([1,2,3,4,5,6]).reshape(-1,1)
#Yi=np.array([9,18,31,48,69,94])
Yi=np.array([9.1,18.3,32,47,69.5,94.8]).reshape(-1,1)
##这里指定使用岭回归作为基函数
model = make_pipeline(PolynomialFeatures(2), Ridge())
model.fit(Xi, Yi)
##根据模型预测结果
y_plot = model.predict(Xi)
##绘图
plt.scatter(Xi, Yi, color='red',label="s",linewidth=2)
plt.plot(Xi, y_plot, color='green',label="n",linewidth=2)
plt.legend(loc='lower right')
plt.show()

输出:
在这里插入图片描述

标签:plt,机器,fit,回归,np,Xi,拟合,线性,import
来源: https://blog.csdn.net/m0_62844645/article/details/123032382