Построение неоднородной по времени цепочки Маркова в Python - PullRequest
0 голосов
/ 26 февраля 2019

использование функции поиска не помогло мне найти решение для моей проблемы, поэтому я и создал этот пост.

Прежде всего, я довольно новичок в Python и, следовательно, мои знания ограничены.

Я анализирую набор данных, который основан на дневниках использования времени.Таким образом, столбцы представляют временные шаги (tb1_1 - tb1_144), в то время как строки представляют соответствующего человека, заполнившего журнал (более 60 тыс. Наблюдений).Кроме того, значение в каждой ячейке представляет активность, выполняемую для каждого временного шага.(например, 1 = спящий и т. д.) Набор данных выглядит следующим образом:

dataset

Для моего анализа я хочу создать профили активности на основеинформация, полученная из записей дневника с использованием неоднородных по времени цепей Маркова, которые графически будут выглядеть так:

activity profile

Я уже рассмотрел многочисленные примерыКак рассчитать цепи Маркова в Python.Однако ни один из этих примеров не учитывает, что для каждого временного шага t новые исходные матрицы перехода должны быть получены из начального набора данных.

Я был бы очень рад, если бы кто-то мог помочь мне в этом.

Спасибо, Феликс

----- ОБНОВЛЕНИЕ ---------

После нескольких попыток я наконец понял, как построить динамическийматрицы.Пожалуйста, найдите код ниже.Если кто-нибудь знает, как его сократить, не стесняйтесь комментировать:)

# generate transition probability matrices
matrix_drei_personen_haus_winter_weekday_ft_master= np.empty(shape=(144, 14, 14))

def a1(x,y):
    try:
        return x/y
    except ZeroDivisionError:
        return 0 

for i in range (0,144):
    for j in range (1,15):
        for m in range (1,15):
        a=a1(len(drei_personen_haus_winter_weekday_ft_master[(drei_personen_haus_winter_weekday_ft_master.iloc[:,i]==j)&(drei_personen_haus_winter_weekday_ft_master.iloc[:,i+1]==m)]),len(drei_personen_haus_winter_weekday_ft_master[drei_personen_haus_winter_weekday_ft_master.iloc[:,i]==j]))
        matrix_drei_personen_haus_winter_weekday_ft_master[i,j-1,m-1]=a






#create discrete heterogeneous Markov-chain

def activity_forecast(steps):
    # Choose the starting state
    activityToday = "4"
    print("Start state: " + activityToday)
    # Shall store the sequence of states taken. So, this only has the starting state for now.
    activityList = [activityToday]
    i = 0
    while i != steps:

    #create sequence of activities

    if activityToday == "1":
        change = np.random.choice(transitionName[0],replace=True,p=matrix_drei_personen_haus_winter_weekday_ft_master[i,0,:])

        if change == "11":
            activityList.append("1")
            pass
        elif change == "12":
            activityToday = "2"
            activityList.append("2")
        elif change == "13":
            activityToday = "3"
            activityList.append("3")
        elif change == "14":
            activityToday = "4"
            activityList.append("4")
        elif change == "15":
            activityToday = "5"
            activityList.append("5")
        elif change == "16":
            activityToday = "6"
            activityList.append("6")
        elif change == "17":
            activityToday = "7"
            activityList.append("7")
        elif change == "18":
            activityToday = "8"
            activityList.append("8")
        elif change == "19":
            activityToday = "9"
            activityList.append("9")
        elif change == "0110":
            activityToday = "10"
            activityList.append("10")
        elif change == "0111":
            activityToday = "11"
            activityList.append("11")
        elif change == "0112":
            activityToday = "12"
            activityList.append("12")
        elif change == "0113":
            activityToday = "13"
            activityList.append("13")
        else:
            activityToday = "14"
            activityList.append("14")
    elif activityToday == "2":
        change = np.random.choice(transitionName[1],replace=True,p=matrix_drei_personen_haus_winter_weekday_ft_master[i,1,:])

        if change == "22":
            activityList.append("2")
            pass
        elif change == "21":
            activityToday = "1"
            activityList.append("1")
        elif change == "23":
            activityToday = "3"
            activityList.append("3")
        elif change == "24":
            activityToday = "4"
            activityList.append("4")
        elif change == "25":
            activityToday = "5"
            activityList.append("5")
        elif change == "26":
            activityToday = "6"
            activityList.append("6")
        elif change == "27":
            activityToday = "7"
            activityList.append("7")
        elif change == "28":
            activityToday = "8"
            activityList.append("8")
        elif change == "29":
            activityToday = "9"
            activityList.append("9")
        elif change == "210":
            activityToday = "10"
            activityList.append("10")
        elif change == "211":
            activityToday = "11"
            activityList.append("11")
        elif change == "112":
            activityToday = "12"
            activityList.append("12")
        elif change == "213":
            activityToday = "13"
            activityList.append("13")
        else:
            activityToday = "14"
            activityList.append("14")            
    elif activityToday == "3":
        change = np.random.choice(transitionName[2],replace=True,p=matrix_drei_personen_haus_winter_weekday_ft_master[i,2,:])

        if change == "33":
            activityList.append("3")
            pass
        elif change == "31":
            activityToday = "1"
            activityList.append("1")
        elif change == "32":
            activityToday = "2"
            activityList.append("2")
        elif change == "34":
            activityToday = "4"
            activityList.append("4")
        elif change == "35":
            activityToday = "5"
            activityList.append("5")
        elif change == "36":
            activityToday = "6"
            activityList.append("6")
        elif change == "37":
            activityToday = "7"
            activityList.append("7")
        elif change == "38":
            activityToday = "8"
            activityList.append("8")
        elif change == "39":
            activityToday = "9"
            activityList.append("9")
        elif change == "310":
            activityToday = "10"
            activityList.append("10")
        elif change == "311":
            activityToday = "11"
            activityList.append("11")
        elif change == "312":
            activityToday = "12"
            activityList.append("12")
        elif change == "313":
            activityToday = "13"
            activityList.append("13")
        else:
            activityToday = "14"
            activityList.append("14")            
    elif activityToday == "4":
        change = np.random.choice(transitionName[3],replace=True,p=matrix_drei_personen_haus_winter_weekday_ft_master[i,3,:])

        if change == "44":
            activityList.append("4")
            pass
        elif change == "42":
            activityToday = "2"
            activityList.append("2")
        elif change == "43":
            activityToday = "3"
            activityList.append("3")
        elif change == "41":
            activityToday = "1"
            activityList.append("1")
        elif change == "45":
            activityToday = "5"
            activityList.append("5")
        elif change == "46":
            activityToday = "6"
            activityList.append("6")
        elif change == "47":
            activityToday = "7"
            activityList.append("7")
        elif change == "48":
            activityToday = "8"
            activityList.append("8")
        elif change == "49":
            activityToday = "9"
            activityList.append("9")
        elif change == "310":
            activityToday = "10"
            activityList.append("10")
        elif change == "411":
            activityToday = "11"
            activityList.append("11")
        elif change == "412":
            activityToday = "12"
            activityList.append("12")
        elif change == "413":
            activityToday = "13"
            activityList.append("13")
        else:
            activityToday = "14"
            activityList.append("14")            
    elif activityToday == "5":
        change = np.random.choice(transitionName[4],replace=True,p=matrix_drei_personen_haus_winter_weekday_ft_master[i,4,:])

        if change == "55":
            activityList.append("5")
            pass
        elif change == "52":
            activityToday = "2"
            activityList.append("2")
        elif change == "53":
            activityToday = "3"
            activityList.append("3")
        elif change == "54":
            activityToday = "4"
            activityList.append("4")
        elif change == "51":
            activityToday = "1"
            activityList.append("1")
        elif change == "56":
            activityToday = "6"
            activityList.append("6")
        elif change == "57":
            activityToday = "7"
            activityList.append("7")
        elif change == "58":
            activityToday = "8"
            activityList.append("8")
        elif change == "59":
            activityToday = "9"
            activityList.append("9")
        elif change == "510":
            activityToday = "10"
            activityList.append("10")
        elif change == "511":
            activityToday = "11"
            activityList.append("11")
        elif change == "512":
            activityToday = "12"
            activityList.append("12")
        elif change == "513":
            activityToday = "13"
            activityList.append("13")
        else:
            activityToday = "14"
            activityList.append("14")            
    elif activityToday == "6":
        change = np.random.choice(transitionName[5],replace=True,p=matrix_drei_personen_haus_winter_weekday_ft_master[i,5,:])

        if change == "66":
            activityList.append("6")
            pass
        elif change == "62":
            activityToday = "2"
            activityList.append("2")
        elif change == "63":
            activityToday = "3"
            activityList.append("3")
        elif change == "64":
            activityToday = "4"
            activityList.append("4")
        elif change == "65":
            activityToday = "5"
            activityList.append("5")
        elif change == "61":
            activityToday = "1"
            activityList.append("1")
        elif change == "67":
            activityToday = "7"
            activityList.append("7")
        elif change == "68":
            activityToday = "8"
            activityList.append("8")
        elif change == "69":
            activityToday = "9"
            activityList.append("9")
        elif change == "610":
            activityToday = "10"
            activityList.append("10")
        elif change == "611":
            activityToday = "11"
            activityList.append("11")
        elif change == "612":
            activityToday = "12"
            activityList.append("12")
        elif change == "613":
            activityToday = "13"
            activityList.append("13")
        else:
            activityToday = "14"
            activityList.append("14")            
    elif activityToday == "7":
        change = np.random.choice(transitionName[6],replace=True,p=matrix_drei_personen_haus_winter_weekday_ft_master[i,6,:])

        if change == "77":
            activityList.append("7")
            pass
        elif change == "72":
            activityToday = "2"
            activityList.append("2")
        elif change == "73":
            activityToday = "3"
            activityList.append("3")
        elif change == "74":
            activityToday = "4"
            activityList.append("4")
        elif change == "75":
            activityToday = "5"
            activityList.append("5")
        elif change == "76":
            activityToday = "6"
            activityList.append("6")
        elif change == "71":
            activityToday = "1"
            activityList.append("1")
        elif change == "78":
            activityToday = "8"
            activityList.append("8")
        elif change == "79":
            activityToday = "9"
            activityList.append("9")
        elif change == "710":
            activityToday = "10"
            activityList.append("10")
        elif change == "711":
            activityToday = "11"
            activityList.append("11")
        elif change == "712":
            activityToday = "12"
            activityList.append("12")
        elif change == "713":
            activityToday = "13"
            activityList.append("13")
        else:
            activityToday = "14"
            activityList.append("14")            
    elif activityToday == "8":
        change = np.random.choice(transitionName[7],replace=True,p=matrix_drei_personen_haus_winter_weekday_ft_master[i,7,:])

        if change == "88":
            activityList.append("8")
            pass
        elif change == "82":
            activityToday = "2"
            activityList.append("2")
        elif change == "83":
            activityToday = "3"
            activityList.append("3")
        elif change == "84":
            activityToday = "4"
            activityList.append("4")
        elif change == "85":
            activityToday = "5"
            activityList.append("5")
        elif change == "86":
            activityToday = "6"
            activityList.append("6")
        elif change == "87":
            activityToday = "7"
            activityList.append("7")
        elif change == "81":
            activityToday = "1"
            activityList.append("1")
        elif change == "89":
            activityToday = "9"
            activityList.append("9")
        elif change == "810":
            activityToday = "10"
            activityList.append("10")
        elif change == "811":
            activityToday = "11"
            activityList.append("11")
        elif change == "812":
            activityToday = "12"
            activityList.append("12")
        elif change == "813":
            activityToday = "13"
            activityList.append("13")
        else:
            activityToday = "14"
            activityList.append("14")            
    elif activityToday == "9":
        change = np.random.choice(transitionName[8],replace=True,p=matrix_drei_personen_haus_winter_weekday_ft_master[i,8,:])

        if change == "99":
            activityList.append("9")
            pass
        elif change == "92":
            activityToday = "2"
            activityList.append("2")
        elif change == "93":
            activityToday = "3"
            activityList.append("3")
        elif change == "94":
            activityToday = "4"
            activityList.append("4")
        elif change == "95":
            activityToday = "5"
            activityList.append("5")
        elif change == "96":
            activityToday = "6"
            activityList.append("6")
        elif change == "97":
            activityToday = "7"
            activityList.append("7")
        elif change == "98":
            activityToday = "8"
            activityList.append("8")
        elif change == "91":
            activityToday = "1"
            activityList.append("1")
        elif change == "910":
            activityToday = "10"
            activityList.append("10")
        elif change == "911":
            activityToday = "11"
            activityList.append("11")
        elif change == "912":
            activityToday = "12"
            activityList.append("12")
        elif change == "913":
            activityToday = "13"
            activityList.append("13")
        else:
            activityToday = "14"
            activityList.append("14")            
    elif activityToday == "10":
        change = np.random.choice(transitionName[9],replace=True,p=matrix_drei_personen_haus_winter_weekday_ft_master[i,9,:])

        if change == "1010":
            activityList.append("10")
            pass
        elif change == "102":
            activityToday = "2"
            activityList.append("2")
        elif change == "103":
            activityToday = "3"
            activityList.append("3")
        elif change == "104":
            activityToday = "4"
            activityList.append("4")
        elif change == "105":
            activityToday = "5"
            activityList.append("5")
        elif change == "106":
            activityToday = "6"
            activityList.append("6")
        elif change == "107":
            activityToday = "7"
            activityList.append("7")
        elif change == "108":
            activityToday = "8"
            activityList.append("8")
        elif change == "109":
            activityToday = "9"
            activityList.append("9")
        elif change == "101":
            activityToday = "1"
            activityList.append("1")
        elif change == "1011":
            activityToday = "11"
            activityList.append("11")
        elif change == "1012":
            activityToday = "12"
            activityList.append("12")
        elif change == "1013":
            activityToday = "13"
            activityList.append("13")
        else:
            activityToday = "14"
            activityList.append("14")            
    elif activityToday == "11":
        change = np.random.choice(transitionName[10],replace=True,p=matrix_drei_personen_haus_winter_weekday_ft_master[i,10,:])

        if change == "1111":
            activityList.append("11")
            pass
        elif change == "112":
            activityToday = "2"
            activityList.append("2")
        elif change == "113":
            activityToday = "3"
            activityList.append("3")
        elif change == "114":
            activityToday = "4"
            activityList.append("4")
        elif change == "115":
            activityToday = "5"
            activityList.append("5")
        elif change == "116":
            activityToday = "6"
            activityList.append("6")
        elif change == "117":
            activityToday = "7"
            activityList.append("7")
        elif change == "118":
            activityToday = "8"
            activityList.append("8")
        elif change == "119":
            activityToday = "9"
            activityList.append("9")
        elif change == "1110":
            activityToday = "10"
            activityList.append("10")
        elif change == "111":
            activityToday = "1"
            activityList.append("1")
        elif change == "1112":
            activityToday = "12"
            activityList.append("12")
        elif change == "1113":
            activityToday = "13"
            activityList.append("13")
        else:
            activityToday = "14"
            activityList.append("14")            
    elif activityToday == "12":
        change = np.random.choice(transitionName[11],replace=True,p=matrix_drei_personen_haus_winter_weekday_ft_master[i,11,:])

        if change == "1212":
            activityList.append("12")
            pass
        elif change == "122":
            activityToday = "2"
            activityList.append("2")
        elif change == "123":
            activityToday = "3"
            activityList.append("3")
        elif change == "124":
            activityToday = "4"
            activityList.append("4")
        elif change == "125":
            activityToday = "5"
            activityList.append("5")
        elif change == "126":
            activityToday = "6"
            activityList.append("6")
        elif change == "127":
            activityToday = "7"
            activityList.append("7")
        elif change == "128":
            activityToday = "8"
            activityList.append("8")
        elif change == "129":
            activityToday = "9"
            activityList.append("9")
        elif change == "1210":
            activityToday = "10"
            activityList.append("10")
        elif change == "1211":
            activityToday = "11"
            activityList.append("11")
        elif change == "121":
            activityToday = "1"
            activityList.append("1")
        elif change == "1213":
            activityToday = "13"
            activityList.append("13")
        else:
            activityToday = "14"
            activityList.append("14")            
    elif activityToday == "13":
        change = np.random.choice(transitionName[12],replace=True,p=matrix_drei_personen_haus_winter_weekday_ft_master[i,12,:])

        if change == "1313":
            activityList.append("13")
            pass
        elif change == "132":
            activityToday = "2"
            activityList.append("2")
        elif change == "133":
            activityToday = "3"
            activityList.append("3")
        elif change == "134":
            activityToday = "4"
            activityList.append("4")
        elif change == "135":
            activityToday = "5"
            activityList.append("5")
        elif change == "136":
            activityToday = "6"
            activityList.append("6")
        elif change == "137":
            activityToday = "7"
            activityList.append("7")
        elif change == "138":
            activityToday = "8"
            activityList.append("8")
        elif change == "139":
            activityToday = "9"
            activityList.append("9")
        elif change == "1310":
            activityToday = "10"
            activityList.append("10")
        elif change == "1311":
            activityToday = "11"
            activityList.append("11")
        elif change == "1312":
            activityToday = "12"
            activityList.append("12")
        elif change == "131":
            activityToday = "1"
            activityList.append("1")
        else:
            activityToday = "14"
            activityList.append("14")            
    elif activityToday == "14":
        change = np.random.choice(transitionName[13],replace=True,p=matrix_drei_personen_haus_winter_weekday_ft_master[i,13,:])

        if change == "1414":
            activityList.append("14")
            pass
        elif change == "142":
            activityToday = "2"
            activityList.append("2")
        elif change == "143":
            activityToday = "3"
            activityList.append("3")
        elif change == "144":
            activityToday = "4"
            activityList.append("4")
        elif change == "145":
            activityToday = "5"
            activityList.append("5")
        elif change == "146":
            activityToday = "6"
            activityList.append("6")
        elif change == "147":
            activityToday = "7"
            activityList.append("7")
        elif change == "148":
            activityToday = "8"
            activityList.append("8")
        elif change == "149":
            activityToday = "9"
            activityList.append("9")
        elif change == "1410":
            activityToday = "10"
            activityList.append("10")
        elif change == "1411":
            activityToday = "11"
            activityList.append("11")
        elif change == "1412":
            activityToday = "12"
            activityList.append("12")
        elif change == "1413":
            activityToday = "13"
            activityList.append("13")
        else:
            activityToday = "1"
            activityList.append("1")   

    i += 1  
print("Possible states: " + str(activityList))
print("End state after "+ str(steps) + " steps: " + activityToday)

# Function that forecasts the possible state for the next 144 steps
activity_forecast(143)
...