1

好的,伙计们...感谢您查看这个问题。我记得在大学里做了以下事情,但是我忘记了确切的解决方案。任何接受者都要朝着正确的方向前进。

我有一个 N 的时间序列数据(我们将使用三个)。数据序列按时间顺序是连续的(例如 obsOne[1] 与 obsTwo[1] 和 obsThree[1] 一起发生)

obsOne[47, 136, -108, -15, 22, ...], obsTwo[448, 321, 122, -207, 269, ...], obsThree[381, 283, 429, -393, 242, ...]

第 2 步。从数据系列中,我为每个数据系列创建了一系列宽度为 Z 的 X 范围箱。(例如观察 obsOne:bin1 = [<-108, -108] bin2 = [-108, -26] bin3 = [-26, 55] ... binX = [136, > 136]

步骤 3。现在创建一个包含数据系列所有可能组合的表。因此,如果我有 4 个 bin 和 3 个数据系列,所有组合将总计 4x4x4 = 64 个可能的结果。(例如 row1 = obsOne bin1 + obsTwo bin1 + obsThree bin1, row2 = obsOne bin1 + obsTwo bin1 + obsThree bin2, ... row5 = obsOne bin1 + obsTwo bin1 + obsThree binX, row6 = obsOne bin1 + obsTwo bin2 + obsThree bin1, row7 = obsOne bin1 + obsTwo bin1 + obsThree bin2, row9 = obsOne bin1 + obsTwo bin2 + obsThree binX, ...)

第 4 步。我现在回到数据系列,找出数据系列中的每一行在表格中的位置,并计算观察次数。(例如 obsOne[2] obsTwo[2] obsThree[2] = 表上的第 30 行,obsOne[X] obsTwo[X] obsThree[X] = 表上的第 52 行。

第 5 步。然后我只取表中具有正匹配的行,计算有多少观察落在该行上,除以数据系列中的观察总数,这给了我在观察数据上该范围的概率。

我为这个基本问题道歉,而不是数学专家。很多年前我已经这样做了。我忘记了我用的是哪种方法,它比这种漫长的(古老的“手工”)方法要快得多。当时我没有使用 python,它是 c++ 中的其他一些专有包。我想看看是否有什么东西可以用python(现在是python商店)解决这个问题,总是可以扩展,所以它是软约束。

4

1 回答 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)
于 2009-06-20T19:10:47.640 回答