我在Python中有一个数字列表,如下所示:
x = [12, 34, 29, 38, 34, 51, 29, 34, 47, 34, 55, 94, 68, 81]
从这些数字中找出趋势的最佳方法是什么?我对预测下一个数字不感兴趣,我只想输出多组数字的趋势,以便我可以比较趋势。
编辑:的趋势,我的意思是,我想要一个数字表示是增加还是减少,以及以什么速度。我对数学不是很在行,所以可能会有一个恰当的名字来描述它!
编辑2:看起来我真正想要的是线性最佳拟合的系数。在Python中实现这一点的最佳方法是什么?
发布于 2012-04-07 04:23:55
可能你的意思是,你想把这些数字画在一个图上,然后找到一条穿过它们的直线,在那里这条线和数字之间的总距离是最小的?这称为线性回归。
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
趋势线不太可能通过您的原始点,但它将尽可能接近直线可以获得的原始点。使用此趋势线(a,b)的梯度和中断值,您将能够外推数组结束后的线:
extrapolatedtrendline=[a*index + b for index in range(20)] //replace 20 with desired trend length
发布于 2012-04-07 04:33:11
Keith提供的链接或Riaz提供的答案可能会帮助您获得多边形拟合,但始终建议使用库(如果可用),对于手头的问题,numpy提供了一个名为polyfit的奇妙的多项式拟合函数。您可以使用polyfit在任何次数的方程式上拟合数据。
下面是一个使用numpy拟合y=ax+b形式的线性方程中的数据的示例
>>> data = [12, 34, 29, 38, 34, 51, 29, 34, 47, 34, 55, 94, 68, 81]
>>> x = np.arange(0,len(data))
>>> y=np.array(data)
>>> z = np.polyfit(x,y,1)
>>> print "{0}x + {1}".format(*z)
4.32527472527x + 17.6
>>>
类似地,二次拟合将是
>>> print "{0}x^2 + {1}x + {2}".format(*z)
0.311126373626x^2 + 0.280631868132x + 25.6892857143
>>>
发布于 2012-04-07 04:04:58
以下是获取增加/减少趋势的一种方法:
>>> x = [12, 34, 29, 38, 34, 51, 29, 34, 47, 34, 55, 94, 68, 81]
>>> trend = [b - a for a, b in zip(x[::1], x[1::1])]
>>> trend
[22, -5, 9, -4, 17, -22, 5, 13, -13, 21, 39, -26, 13]
在结果列表trend
中,trend[0]
可以解释为从x[0]
到x[1]
的增加,trend[1]
将是从x[1]
到x[2]
的增加,等等。trend
中的负值意味着x
中的值从一个索引到另一个索引减少。
https://stackoverflow.com/questions/10048571
复制相似问题