概率时间序列,观察数据的概率(似曾相识)

1 投票
1 回答
852 浏览
提问于 2025-04-15 12:23

大家好,感谢你们关注这个问题。我记得在大学时做过下面的事情,但现在忘记具体的解决方法了。有没有人能给我指个方向?

我有一组时间序列数据(我们用三组数据来举例)。这些数据是按时间顺序排列的(比如,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 个回答

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)

撰写回答