代码之家  ›  专栏  ›  技术社区  ›  Jonas Byström

最小二乘法拟合二维线

  •  1
  • Jonas Byström  · 技术社区  · 7 年前

    import numpy as np
    import matplotlib.pyplot as plt
    a = np.array([1,2,3,4,6,7])
    b = np.array([5,4,3,2,-2,-1])
    k,m = np.polyfit(a,b,1)
    plt.scatter(a,b)
    plt.plot([0,10],[m,10*k+m])
    plt.show()
    

    enter image description here

    但我想改用原始python代码。我的数学太生疏了,但如果能用几行代码来完成,我真的很感谢你的帮助!

    1 回复  |  直到 7 年前
        1
  •  2
  •   randomir    7 年前

    simple linear regression 基于最小化二次误差,纯Python实现非常简单(检查±和以上链接上的等式):

    def linear_fit(x, y):
        """For set of points `(xi, yi)`, return linear polynomial `f(x) = k*x + m` that
        minimizes the sum of quadratic errors.
        """
        meanx = sum(x) / len(x)
        meany = sum(y) / len(y)
        k = sum((xi-meanx)*(yi-meany) for xi,yi in zip(x,y)) / sum((xi-meanx)**2 for xi in x)
        m = meany - k*meanx
        return k, m
    

    对于您的示例输入:

    >>> x = [1,2,3,4,6,7]
    >>> y = [5,4,3,2,-2,-1]
    >>> linear_fit(x, y)
    (-1.1614906832298135, 6.285714285714285)