python中matplotlib实现最小二乘法拟合的过程详解

前言

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

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

一、最小二乘法拟合直线

1、拟合直线

生成样本点

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

import numpy as np
import matplotlib.pyplot as plt

X = np.arange(0, 5, 0.1)
Z = [3 + 5 * x for x in X]
Y = [np.random.normal(z, 0.5) for z in Z]

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

样本点如图所示:

python中matplotlib实现最小二乘法拟合的过程详解

拟合直线

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

python中matplotlib实现最小二乘法拟合的过程详解

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

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。接下来,我们绘制出这条直线,并与样本点做对比。


_X = [0, 5]
_Y = [a0 + a1 * x for x in _X]

plt.plot(X, Y, 'ro', _X, _Y, 'b', linewidth=2)
plt.title("y = {} + {}x".format(a0, a1))
plt.show()

拟合效果如下:

python中matplotlib实现最小二乘法拟合的过程详解

2、最小二乘法拟合曲线

生成样本点

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

import numpy as np
import matplotlib.pyplot as plt

X = np.arange(0, 5, 0.1)
Z = [2 + 3 * x + 4 * x ** 2 for x in X]
Y = np.array([np.random.normal(z,3) for z in Z])

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

样本点如图所示:

python中matplotlib实现最小二乘法拟合的过程详解

拟合曲线

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

python中matplotlib实现最小二乘法拟合的过程详解

def quadratic_fitting(X, Y, m):
    N = len(X)
    A = []
    b = []

    for i in range(m+1):
        b.append(sum(X ** i * Y))

        a = []
        for j in range(m+1):
            a.append(sum(X ** (i + j)))
        A.append(a)
    return np.linalg.solve(A, b)

 a0, a1, a2 = quadratic_fitting(X, Y, 2)

绘制曲线

绘制曲线

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

_X = np.arange(0, 5, 0.1)
_Y = np.array([a0 + a1*x + a2*x**2 for x in _X])

plt.plot(X, Y, 'ro', _X, _Y, 'b', linewidth=2)
plt.title("y = {} + {}x + {}$x^2$ ".format(a0, a1, a2))
plt.show()

拟合效果如下:

python中matplotlib实现最小二乘法拟合的过程详解

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

3、完成代码

def Lleast_squares_fitting():
    pass

def cubic_polynomial():
    pass

import numpy as np
import matplotlib.pyplot as plt

def linear_fitting(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)

def line_polynomial():

    X = np.arange(0, 5, 0.1)
    Z = [3 + 5 * x for x in X]
    Y = [np.random.normal(z, 0.5) for z in Z]

    a0, a1 = linear_fitting(X, Y)
    _X = [0, 5]
    _Y = [a0 + a1 * x for x in _X]

    plt.plot(X, Y, 'ro', _X, _Y, 'b', linewidth=2)
    plt.title("y = {} + {}x".format(a0, a1))

def quadratic_fitting(X, Y, m):
    N = len(X)
    A = []
    b = []

    for i in range(m+1):
        b.append(sum(X ** i * Y))

        a = []
        for j in range(m+1):
            a.append(sum(X ** (i + j)))
        A.append(a)
    return np.linalg.solve(A, b)

def quadratic_polynomial():

    X = np.arange(0, 5, 0.1)
    Z = [2 + 3 * x + 4 * x ** 2 for x in X]
    Y = np.array([np.random.normal(z, 3) for z in Z])

    a0, a1, a2 = quadratic_fitting(X, Y, 2)

    _X = np.arange(0, 5, 0.1)
    _Y = np.array([a0 + a1 * x + a2 * x ** 2 for x in _X])
    plt.plot(X, Y, 'ro', _X, _Y, 'b', linewidth=2)
    plt.title("y = {} + {}x + {}$x^2$ ".format(a0, a1, a2))

if __name__ == '__main__':

    quadratic_polynomial()
    plt.show()

Original: https://blog.csdn.net/weixin_45414444/article/details/120311747
Author: cyb_cqu
Title: python中matplotlib实现最小二乘法拟合的过程详解



相关阅读

Title: Python:opencv画点、圆、线、多边形、矩形

简介:机器学习视觉方向一般都需要在图像中添加标注框,标注框有着很大的用处,特别是对图像中某些需要关注的特征起到圈定的效果,方便对特征选择进行处理。

相关攻略:

机器学习:基本流程
Python:调用摄像头使用cv2库录制视频
Python:视频拆分成一帧一帧的图片
Python:利用cv2模块识别手势Python:利用cv2模块对图片进行灰度转换
Python:利用cv2模块对照片进行多个人脸检测
Python:使用cv2模块进行人脸识别Demo
Python:处理cv2模块putText中文无法识别问题
Python:使用cv2模块快速生成素描

画点:

cv2.circle(img, 点坐标, 点大小, 颜色, 边框线条大小)

画圆:

cv2.circle(img, 圆心坐标, 半径, 颜色, 边框线条大小)

画线:

cv2.line(img, (起始坐标), (结束坐标), color=(255, 0, 0), thickness=边框线条大小)

画多边形:如三角形

cv2.line(img, (200, 200), (200, 300), color=(255, 0, 255), thickness=2)
cv2.line(img, (200, 300), (300, 300), color=(255, 0, 255), thickness=2)
cv2.line(img, (300, 300), (200, 200), color=(255, 0, 255), thickness=2)

画矩形:

cv2.rectangle(img, (左上角), (右下角), color=(0, 0, 255), thickness=2)

源码:


import cv2.cv2 as cv2

img = cv2.imread(r"a.png")

point_size = 1
point_color = (0, 0, 255)
thickness = 2

point = (100, 50)
cv2.circle(img, point, point_size, point_color, thickness)

circle_point = (100, 100)
cv2.circle(img, circle_point, 20, point_color, thickness)

cv2.line(img, (0, 0), (100, 100), color=(255, 0, 0), thickness=2)

cv2.line(img, (200, 200), (200, 300), color=(255, 0, 255), thickness=2)
cv2.line(img, (200, 300), (300, 300), color=(255, 0, 255), thickness=2)
cv2.line(img, (300, 300), (200, 200), color=(255, 0, 255), thickness=2)

cv2.rectangle(img, (715, 415), (830, 600), color=(0, 0, 255), thickness=2)

cv2.imshow("img", img)
cv2.imwrite("label_data.png", img)
cv2.waitKey(4000)
cv2.destroyAllWindows()

运行结果:

python中matplotlib实现最小二乘法拟合的过程详解

微信公众号:玩转测试开发
欢迎关注,共同进步,谢谢!

python中matplotlib实现最小二乘法拟合的过程详解

Original: https://blog.csdn.net/hzblucky1314/article/details/123896460
Author: 玩转测试开发
Title: Python:opencv画点、圆、线、多边形、矩形

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/328132/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

最近整理资源【免费获取】:   👉 程序员最新必读书单  | 👏 互联网各方向面试题下载 | ✌️计算机核心资源汇总