【问题标题】:Least-Squares Fit to a Straight Line python code最小二乘拟合直线 python 代码
【发布时间】:2014-03-07 02:27:46
【问题描述】:

我有一个由 X 和 Y 坐标组成的散点图。我想使用最小二乘法拟合直线来获得最佳拟合线。

最小二乘拟合直线是指:如果 (x_1,y_1),....(x_n,y_n) 是测量的数据对,则最佳直线是 y = A + Bx。

这是我在 python 中的代码:

 # number of points is 50
 A = (sum(x**2)*sum(y) - sum(x)*sum(x*y)) / (50*sum(x**2) - (sum(x))**2)
 B = (50*sum(x*y) - sum(x)*sum(y)) / (50*sum(x**2) - (sum(x))**2)
 print (A,B)

这看起来是否正确,我在打印 A 和 B 时遇到问题。谢谢!

【问题讨论】:

  • 这对你来说可能是一个好的开始stackoverflow.com/questions/19017301/…
  • @george 我以前研究过 zip 函数,但从未真正了解它的作用。该链接中的示例很好地展示了 zip 的作用,我相信它会有所帮助。

标签: python plot


【解决方案1】:

如果你只想要一行,最简单的是scipy.stats.linregress

from scipy import stats
slope, intercept, r_value, p_value, std_err = stats.linregress(x,y)

Link to docs

【讨论】:

    【解决方案2】:

    如果我正确理解了您的问题,您有两个数据集 xy 要在其中执行最小二乘拟合。

    算法不用自己写,curve_fit from scipy.optimize 应该做你想做的,试试吧:

    from scipy.optimize import curve_fit
    
    def f(x, A, B): # this is your 'straight line' y=f(x)
        return A*x + B
    
    popt, pcov = curve_fit(f, x, y) # your data x, y to fit
    

    其中popt[0]popt[1] 将是直线的斜率和截距。

    有关更多详细信息和示例,请参阅: http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html#scipy.optimize.curve_fit

    【讨论】:

      【解决方案3】:

      您正在尝试将两个列表相乘 xy(或单独),但它没有在 Python 中定义。您要么需要编写自己的函数来执行列表逐个元素的乘法,要么使用numpy.multiply。例如,如果你想做 x 和 y 的元素乘法,

      import numpy as np
      xy = np.multiply(x,y)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-29
        • 2014-03-05
        • 1970-01-01
        • 2017-02-24
        • 2020-10-02
        • 1970-01-01
        • 2013-01-21
        相关资源
        最近更新 更多