最小二乘法拟合直线的Python代码

19

我有一个由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时遇到了问题。谢谢!


1
这可能是一个不错的起点:http://stackoverflow.com/questions/19017301/how-do-i-multiply-lists-together-using-a-function - agentp
@george 我以前看过zip函数,但从未真正理解它的作用。那个链接中的示例很好地展示了zip的功能,我相信会有所帮助。 - Astronerd326
4个回答

40

如果您只需要一条线,那么最简单的方法是使用 scipy.stats.linregress

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

Link to docs


20

如果我理解你的问题正确的话,你有两个数据集 xy,你想进行最小二乘拟合。

你不需要自己编写算法,scipy.optimize 中的 curve_fit 应该能满足你的需求,尝试一下:


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


1
一个使用仅numpy的简单解决方案如下:
import numpy as np

slope, intercept = np.polyfit(X, Y, deg=1)

0

您正在尝试对两个列表xy(或自身)进行乘法运算,但在Python中未定义。您需要编写自己的函数来执行逐个元素的列表乘法,或使用numpy.multiply。例如,如果您想要对x和y进行逐元素乘法操作:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接