首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python:从一组数字中寻找趋势

Python:从一组数字中寻找趋势
EN

Stack Overflow用户
提问于 2012-04-07 03:56:05
回答 7查看 56.4K关注 0票数 37

我在Python中有一个数字列表,如下所示:

代码语言:javascript
复制
x = [12, 34, 29, 38, 34, 51, 29, 34, 47, 34, 55, 94, 68, 81]

从这些数字中找出趋势的最佳方法是什么?我对预测下一个数字不感兴趣,我只想输出多组数字的趋势,以便我可以比较趋势。

编辑:的趋势,我的意思是,我想要一个数字表示是增加还是减少,以及以什么速度。我对数学不是很在行,所以可能会有一个恰当的名字来描述它!

编辑2:看起来我真正想要的是线性最佳拟合的系数。在Python中实现这一点的最佳方法是什么?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-04-07 04:23:55

可能你的意思是,你想把这些数字画在一个图上,然后找到一条穿过它们的直线,在那里这条线和数字之间的总距离是最小的?这称为线性回归。

代码语言:javascript
复制
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)的梯度和中断值,您将能够外推数组结束后的线:

代码语言:javascript
复制
extrapolatedtrendline=[a*index + b for index in range(20)] //replace 20 with desired trend length
票数 30
EN

Stack Overflow用户

发布于 2012-04-07 04:33:11

Keith提供的链接或Riaz提供的答案可能会帮助您获得多边形拟合,但始终建议使用库(如果可用),对于手头的问题,numpy提供了一个名为polyfit的奇妙的多项式拟合函数。您可以使用polyfit在任何次数的方程式上拟合数据。

下面是一个使用numpy拟合y=ax+b形式的线性方程中的数据的示例

代码语言:javascript
复制
>>> 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
>>> 

类似地,二次拟合将是

代码语言:javascript
复制
>>> print "{0}x^2 + {1}x + {2}".format(*z)
0.311126373626x^2 + 0.280631868132x + 25.6892857143
>>> 
票数 24
EN

Stack Overflow用户

发布于 2012-04-07 04:04:58

以下是获取增加/减少趋势的一种方法:

代码语言:javascript
复制
>>> 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中的值从一个索引到另一个索引减少。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10048571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档