python绘制拟合曲线与样本点_python中matplotlib实现最小二乘法拟合的过程详解

前言

最小二乘法Least Square Method,做为分类回归算法的基础,有着悠久的历史(由马里·勒让德于1806年提出)。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合。其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达。

下面这篇文章主要跟大家介绍了关于python中matplotlib实现最小二乘法拟合的相关内容,下面话不多说,来一起看看详细的介绍:

一、最小二乘法拟合直线

生成样本点

首先,我们在直线 y = 3 + 5x 附近生成服从正态分布的随机点,作为拟合直线的样本点。

1

2

3

4

5

6

7

8

9

10

import numpy as np

import matplotlib.pyplot as plt

# 在直线 y = 3 + 5x 附近生成随机点

X= np.arange(0,5,0.1)

Z= [3 + 5 * xfor xin X]

Y= [np.random.normal(z,0.5)for zin Z]

plt.plot(X, Y,'ro')

plt.show()

样本点如图所示:

2017711115557770.png?201761111568

拟合直线

设 y = a0 + a1*x,我们利用最小二乘法的正则方程组来求解未知系数 a0 与 a1。

2017711115627031.png?2017611115634

numpy 的 linalg 模块中有一个 solve 函数,它可以根据方程组的系数矩阵和方程右端构成的向量来求解未知量。

1

2

3

4

5

6

7

8

9

10

11

12

13

def linear_regression(x, y):

N= len(x)

sumx= sum(x)

sumy= sum(y)

sumx2= sum(x**2)

sumxy= sum(x*y)

A= np.mat([[N, sumx], [sumx, sumx2]])

b= np.array([sumy, sumxy])

return np.linalg.solve(A, b)

a0, a1= linear_regression(X, Y)

绘制直线

此时,我们已经得到了拟合后的直线方程系数 a0 和 a1。接下来,我们绘制出这条直线,并与样本点做对比。

1

2

3

4

5

6

7

# 生成拟合直线的绘制点

_X= [0,5]

_Y= [a0+ a1* xfor xin _X]

plt.plot(X, Y,'ro', _X, _Y,'b', linewidth=2)

plt.title("y = {} + {}x".format(a0, a1))

plt.show()

拟合效果如下:

2017711115720521.png?2017611115727

二、最小二乘法拟合曲线

生成样本点

与生成直线样本点相同,我们在曲线 y = 2 + 3x + 4x^2 附近生成服从正态分布的随机点,作为拟合曲线的样本点。

1

2

3

4

5

6

7

8

9

10

import numpy as np

import matplotlib.pyplot as plt

# y = 2 + 3x + 4x^2

X= np.arange(0,5,0.1)

Z= [2 + 3 * x+ 4 * x** 2 for xin X]

Y= np.array([np.random.normal(z,3)for zin Z])

plt.plot(X, Y,'ro')

plt.show()

样本点如图所示:

2017711115756009.png?201761111583

拟合曲线

设该曲线的方程为 y = a0 + a1*x + a2*x^2,同样,我们通过正则方程组来求解未知量 a0、a1 和 a2。

2017711115815130.png?2017611115822

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

# 生成系数矩阵A

def gen_coefficient_matrix(X, Y):

N= len(X)

m= 3

A= []

# 计算每一个方程的系数

for iin range(m):

a= []

# 计算当前方程中的每一个系数

for jin range(m):

a.append(sum(X** (i+j)))

A.append(a)

return A

# 计算方程组的右端向量b

def gen_right_vector(X, Y):

N= len(X)

m= 3

b= []

for iin range(m):

b.append(sum(X**i* Y))

return b

A= gen_coefficient_matrix(X, Y)

b= gen_right_vector(X, Y)

a0, a1, a2= np.linalg.solve(A, b)

绘制曲线

我们根据求得的曲线方程,绘制出曲线的图像。

1

2

3

4

5

6

7

# 生成拟合曲线的绘制点

_X= np.arange(0,5,0.1)

_Y= np.array([a0+ a1*x+ a2*x**2 for xin _X])

plt.plot(X, Y,'ro', _X, _Y,'b', linewidth=2)

plt.title("y = {} + {}x + {}$x^2$ ".format(a0, a1, a2))

plt.show()

拟合效果如下:

2017711115900938.png?201761111596

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

原文链接:http://www.codebelief.com/article/2017/04/matplotlib-demonstrate-least-square-regression-process/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值