ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

机器学习-线性回归

2022-02-20 17:30:39  阅读:213  来源: 互联网

标签:plt 机器 fit 回归 np Xi 拟合 线性 import


线性回归

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

文章目录

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有