def linreg(X, Y):
"""
return a,b in solution to y = ax + b such that root mean square distance between trend line and original points is minimized
"""
N = len(X)
Sx = Sy = Sxx = Syy = Sxy = 0.0
for x, y in zip(X, Y):
Sx = Sx + x
Sy = Sy + y
Sxx = Sxx + x*x
Syy = Syy + y*y
Sxy = Sxy + x*y
det = Sxx * N - Sx * Sx
return (Sxy * N - Sy * Sx)/det, (Sxx * Sy - Sx * Sxy)/det
x = [12, 34, 29, 38, 34, 51, 29, 34, 47, 34, 55, 94, 68, 81]
a,b = linreg(range(len(x)),x) //your x,y are switched from standard notation
y = [12, 34, 29, 38, 34, 51, 29, 34, 47, 34, 55, 94, 68, 81]
N = len(y)
x = range(N)
B = (sum(x[i] * y[i] for i in xrange(N)) - 1./N*sum(x)*sum(y)) / (sum(x[i]**2 for i in xrange(N)) - 1./N*sum(x)**2)
A = 1.*sum(y)/N - B * 1.*sum(x)/N
print "%f + %f * x" % (A, B)
你的意思可能是你想把这些数字画在一张图上,然后在图上找到一条直线,在直线和数字之间的总距离是最小的?这叫做线性回归
趋势线不太可能穿过原始点,但它将尽可能接近直线可以得到的原始点。使用该趋势线(a,b)的梯度和截距值,您将能够推断出超过数组末尾的线:
你可以做一个least squares fit的数据。
使用this page中的公式:
它会打印最佳拟合线的起始值和增量。
Keith提供的链接或Riaz提供的答案可能有助于获得poly-fit,但如果有的话,总是建议使用库,对于手头的问题,numpy提供了一个极好的多项式拟合函数,名为polyfit。可以使用polyfit将数据拟合到任意程度的方程上。
下面是一个使用numpy将数据拟合为y=ax+b形式的线性方程的示例
类似地,二次拟合将是
相关问题 更多 >
编程相关推荐