2014-03-07 19 views
6

我有一个由X和Y坐标组成的散点图。我想使用适合直线的最小平方来获得最佳拟合线。如果(x_1,y_1),...(x_n,y_n)是测量的数据对,则最佳直线是y = A + Bx。如果(x_1,y_2)最小平方适合直线python代码

这里是我的代码在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

+0

@乔治我已经查看过zip功能,但从未真正承担过它的功能。该链接中的示例很好地展示了zip的功能,我相信它会有所帮助。 – Astronerd326

回答

10

如果我正确理解你的问题,你有两个数据集x和要执行最小二乘法拟合y

你不必亲自编写算法,curve_fitscipy.optimize应该做你想要什么,尝试:

from scipy.optimize import curve_fit 

def f(x, A, B): # this is your 'straight line' y=f(x) 
    return A*x + B 

A,B = curve_fit(f, x, y)[0] # your data x, y to fit 

AB将是直线

的斜率和截距更多详细信息和示例,请参阅: http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html#scipy.optimize.curve_fit

1

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

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

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

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

Link to docs