马尔可夫模型的条件概率

2024-06-02 08:30:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我的数据集包括31天的每日降雨量记录(零表示无雨,非零输入表示有雨)。我需要计算4种不同情况下的条件概率,如下所述:

  1. 雨天。。。。雨天
  2. 雨天。。。非雨天
  3. 非雨天。。。雨天
  4. 非雨天。。。非雨天

请有人给我建议如何计算上述情况的条件概率

数据集和示例脚本如下所示:

import numpy as np # Processing Array
import scipy.stats # Computing Statistic
import scipy.linalg # Linear Algebra
import matplotlib.pyplot as plt # Drawing Graph

C_prep = np.array( [0.00, 0.04, 0.84, 0.00, 0.00, 
                    0.00, 0.02, 0.05, 0.01, 0.09,
                    0.18, 0.04, 0.04, 0.00, 0.06,
                    0.03, 0.04, 0.00, 0.00, 0.33,
                    0.02, 0.01, 0.33, 0.08, 0.00,
                    0.00, 0.00, 0.00, 0.01, 0.01,
                    0.13])

Tags: 数据import脚本示例asnp记录情况
2条回答

这就是您想要的解决方案:
请注意transitions可以是一个简单的列表;不需要numpy阵列

transitions = [0.00, 0.04, 0.84, 0.00, 0.00,
               0.00, 0.02, 0.05, 0.01, 0.09,
               0.18, 0.04, 0.04, 0.00, 0.06,
               0.03, 0.04, 0.00, 0.00, 0.33,
               0.02, 0.01, 0.33, 0.08, 0.00,
               0.00, 0.00, 0.00, 0.01, 0.01,
               0.13]

# first create the 2 states of interest
transitions = [1 if x > 0 else 0 for x in transitions]

n = 1 + max(transitions)  # number of states

M = [[0] * n for _ in range(n)] # create matrix for probabilities

for (i, j) in zip(transitions, transitions[1:]):
    M[i][j] += 1

# now convert to probabilities:
for row in M:
    s = sum(row)
    if s > 0:
        row[:] = [f / s for f in row]
        
print(M)
>>> [[0.5454545454545454, 0.45454545454545453], 
     [0.21052631578947367, 0.7894736842105263]]

每个单元格表示一个条件概率,即转移概率:a)无雨->;没有雨等

这将遍历列表并进行检查

import numpy as np
C_prep = np.array( [0.00, 0.04, 0.84, 0.00, 0.00, 
                    0.00, 0.02, 0.05, 0.01, 0.09,
                    0.18, 0.04, 0.04, 0.00, 0.06,
                    0.03, 0.04, 0.00, 0.00, 0.33,
                    0.02, 0.01, 0.33, 0.08, 0.00,
                    0.00, 0.00, 0.00, 0.01, 0.01,
                    0.13])
sit1 = 0; sit2 = 0; sit3 = 0; sit4 = 0 #situations 1,2,3,4
'''
sit1 is rainy day .... rainy day
sit2 is rainy day ... non-rainy day
sit3 is non-rainy day ... rainy-day
sit4 is non-rainy day ... non-rainy-day
'''
for c, v in enumerate(C_prep):
    if c == len(C_prep) - 1: 
        break
    next_val = C_prep[c+1]
    '''now check for all the four possible solutions, i.e. if num is 0 and if the 
    next num is 0'''
    if v == float(0) and next_val == float(0):
        sit1 += 1
    elif v == float(0) and next_val != float(0):
        sit2 += 1
    elif v != float(0) and next_val == float(0):
        sit3 += 1
    elif v != float(0) and next_val != float(0):
        sit4 += 1
print(sit1, sit2, sit3, sit4)

相关问题 更多 >