概率时间序列,观察数据的概率(似曾相识)
大家好,感谢你们关注这个问题。我记得在大学时做过下面的事情,但现在忘记具体的解决方法了。有没有人能给我指个方向?
我有一组时间序列数据(我们用三组数据来举例)。这些数据是按时间顺序排列的(比如,obsOne[1] 和 obsTwo[1] 还有 obsThree[1] 是同时发生的)。
obsOne[47, 136, -108, -15, 22, ...], obsTwo[448, 321, 122, -207, 269, ...], obsThree[381, 283, 429, -393, 242, ...]
第二步:从这些数据中,我为每组数据创建一系列宽度为 Z 的区间(也叫“箱子”)。比如对于 obsOne 的观察值:箱子1 = [<-108, -108],箱子2 = [-108, -26],箱子3 = [-26, 55],...,箱子X = [136, > 136]。
第三步:现在我创建一个表格,列出所有可能的组合。假设我有4个箱子和3组数据,那么所有组合的总数就是 4x4x4 = 64 种可能的结果。比如,第一行 = obsOne 的箱子1 + obsTwo 的箱子1 + obsThree 的箱子1,第二行 = obsOne 的箱子1 + obsTwo 的箱子1 + obsThree 的箱子2,... 第五行 = obsOne 的箱子1 + obsTwo 的箱子1 + obsThree 的箱子X,等等。
第四步:我回到数据系列中,找出每一行在表格中对应的位置,并计算每个观察值出现的次数。比如,obsOne[2]、obsTwo[2]、obsThree[2] = 表格中的第30行,obsOne[X]、obsTwo[X]、obsThree[X] = 表格中的第52行。
第五步:我只保留表格中那些有正匹配的行,计算落在该行的观察值数量,然后用这个数量除以数据系列中的总观察值数量,这样就得到了该范围内观察数据的概率。
抱歉问这个基础的问题,我不是数学专家。很多年前我做过这个,但忘了用什么方法了,那时候的方法比现在这种“手动”的方式快多了。当时我没有用 Python,而是用了一些其他的 C++ 专有软件。我想看看有没有什么可以用 Python 来解决这个问题的工具(现在我们是用 Python 的团队),如果能扩展的话,那就更好了。
1 个回答
你是在说像这样的东西吗?
from __future__ import division
from collections import defaultdict
obsOne= [47, 136, -108, -15, 22, ]
obsTwo= [448, 321, 122, -207, 269, ]
obsThree= [381, 283, 429, -393, 242, ]
class BinParams( object ):
def __init__( self, timeSeries, X ):
self.mx= max(timeSeries )
self.mn= min(timeSeries )
self.Z=(self.mx-self.mn)/X
def index( self, sample ):
return (sample-self.mn)//self.Z
binsOne= BinParams( obsOne, 4 )
binsTwo= BinParams( obsTwo, 4 )
binsThree= BinParams( obsThree, 4 )
counts= defaultdict(int)
for s1, s2, s3 in zip( obsOne, obsTwo, obsThree ):
posn= binsOne.index(s1), binsTwo.index(s2), binsThree.index(s3)
counts[posn] += 1
for k in counts:
print k, counts[k], counts[k]/len(counts)