马尔科夫链预测,Python实现

–记录自己学习的步伐,点滴的生活,以后学习和复习使用。纯手打,代码不抄袭。–
在这里插入图片描述
来源百度百科,具体定义和性质可以查看百度百科的内容。马尔科夫链
或者看一下下面的这个文章,也是翻译转载过来的。偷渡一下:[译] 用 Python 实现马尔可夫链的初级教程

用概率数学公式表示如下:
Pr( Xn+1 = x | X1 = x1, X2 = x2, …, Xn = xn) = Pr( Xn+1 = x | Xn = xn)

就是说 Xn+1 的概率只和之前的 Xn 的概率有关。所以只需要知道上一个状态就可以确定现在状态的概率分布,满足条件独立(也就是说:只需要知道现在状态就可以确定下一个状态,而之前的所有状态,都不会影响)。

例1:
某计算机机房的一台计算机经常出现故障,研究者每隔15分钟观察一次计算机的运行状态,手机了24小时的数据,用1表示正常,0表示不正常。数据如下:

str1 = 
"1110010011111110011110111111001111111110001101101111011011010111101110111101111110011011111100111"

假定这就是无规律,白噪声的序列,我也没有做过白噪声检验,反正就用这个例子做了。
现在有四种情况,分别是:

第一步1之后出现下一步0,表示为10
第一步1之后出现1,表示为11
0之后出现0,表示为00
0之后出现1,表示为01

那么要预测下一个时间点将会出现的状态。
首先要计算上面4中情况一共出现多少次,然后才能计算概率。
比如111,里面出现11的情况有两次,而不是一次。这就要做循环统计了。
统计出每一个多少,然后做转移矩阵。样式跟下面这个类似

0 1
0
1

其中index上面的0表示当前的一步,就第一步,columns上面的0表示下一步。也不是绝对的要这种形式,只要自己看得懂就行,自己有个习惯,并记住也能让别人看懂就好。


# 计算ab在s中出现的次数
def find_count(s,ab):
    ab_sum = 0
    for i in range(0,len(s)-1):
        if s[i:i+2] == ab:ab_sum+=1
    return ab_sum

# 转移矩阵
def str_count_df(s):
    # 获得里面不重复的元素
    unique_items = np.unique(list(s))
    # 获得不重复元素个数
    n = unique_items.size
    # 默认行是这一次的,列是下一次的。类容是他们的转换情况
    df_ = pd.DataFrame(index=unique_items,columns=unique_items)
    for i in unique_items:
        for j in unique_items:
            df_.loc[i,j] = find_count(s,i+j)
    return df_

# 转移矩阵,概率
def str_count_df_p(s):
    # 获得里面不重复的元素
    unique_items = np.unique(list(s))
    # 获得不重复元素个数
    n = unique_items.size
    # 默认行是这一次的,列是下一次的。类容是他们的转换情况
    df_ = pd.DataFrame(index=unique_items,columns=unique_items)
    for i in unique_items:
        for j in unique_items:
            df_.loc[i,j] = find_count(s,i+j)
    df_ = df_.div(df_.sum(axis=1),axis='index')
    return df_

上面两个转移矩阵代码是一样的,只不过最后返回值不一样,一个是转换成概率了,一个没转。
用上面的函数,将str1带进去就会得到转移矩阵
在这里插入图片描述
表示0→1共发生18次,以此类推…
在这里插入图片描述
表示如果当前是0,那么下一个是0的概率为30.77%,下一步为1的概率为69.23%。
每一行的和是1.这好理解的。
对当前数据,最后一个为1,那么预测下一步,有74.3%的概率不发生故障。


上面的方法不仅仅局限于两个类别的0和1,任何类别的转换都可以。
比如下面的观测系统数据:

str2 = "4321431123212344331113321222442323112431"

带入也可直接得到转移矩阵
在这里插入图片描述


这计算的都是一步转移概率矩阵。

如果是两步转移矩阵,就是一步转移矩阵的二次方。三步转移矩阵就是三次方,n步就是n次方

这是数学上已经证明过的。


现在我们假设下一步出现1,2,3,4的概率为 [0.1,0.3,0.2,0.4]
那么第二步出现的概率就可以算出来,用第一次的乘以转移矩阵:

#上面的转移矩阵为 df_2
np.array([0.1,0.3,0.2,0.4]).dot(np.array(df_2,dtype=np.float64)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值