Временной ряд вероятностей, наблюдаемые вероятности данных (дежа вю) - PullRequest
1 голос
/ 20 июня 2009

окей, ребята ... спасибо за просмотр этого вопроса. Я помню, как делал следующее в колледже, но забыл точное решение. Любой желающий направиться в правильном направлении.

У меня есть временной ряд данных (мы будем использовать три) из 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. Из ряда данных я создаю серию диапазонов X с шириной Z для каждого ряда данных. (например, наблюдения obsOne: bin1 = [<-108, -108] bin2 = [-108, -26] bin3 = [-26, 55] ... binX = [136,> 136]

Шаг 3. Теперь создайте таблицу со всеми возможными комбинациями в ряду данных. Таким образом, если бы у меня было 4 бина и 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 + 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), всегда расширяться, так что это мягкое ограничение.

1 Ответ

1 голос
/ 20 июня 2009

Вы говорите о чем-то подобном?

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...