4.预测模型,马尔可夫链

非常纠结,在网上搜马尔可夫出来的都是隐马尔科夫模型

可是我查到的文献提到的都是Markov chain,是马尔可夫链。

我参考隐马尔可夫模型介绍中的马尔可夫过程自己实现了一个马尔可夫链,按我自己的理解做的,不知道是不是真正的马尔可夫链。

马尔可夫过程就是几个状态按一个转移概率矩阵做转移。这个转移概率就是问题中心,我们可以直接用输入序列统计出一个转移概率。

如果是一个往复运动,例如钟摆,左边状态是0,中间是1,右边是2,那么序列就是01210121012101201210121···

马尔可夫假设有一条是下一状态只取决于当前状态,如果当前状态是1,接下来是0或2的概率各占一半。

我们可以稍微扩展一下,用当前状态和上一状态决定下一状态,之前统计出的是一个二维矩阵,现在是三维,就这么简单。

我感觉对轨迹预测这个题目来说这样预测时考虑到的因素除了当前位置还有运动方向。

下面是代码,运行效果很不理想,后面改进

class MarkovChains:
    def __init__(self):
        self.count=0;
        self.arry=[];
    #list输入数字序列,输入其他内容的字典编码在外面完成
    def train(self,list):
        max = 0;
        for item in list:
            if item>max:
                max=item
        self.count=max+1
        for i in range(self.count):
            list2=[]
            for j in range(self.count):
                list2.append([0]*self.count)
            self.arry.append(list2)
        for j in range(list.__len__()-2):
            self.arry[list[j]][list[j+1]][list[j+2]]+=1;
        #print(self.arry)
    #预测返回值是统计数量,只能比较大小,不是概率
    def predict(self,list_previous,list_now,list_next):
        return (self.arry[list_previous][list_now][list_next])

markov=MarkovChains()
list=[24,26,24,7,14,12,14,12,24,26,24,26,24,26,24,26,24,26,24,26,24,26,24,21,12,7,12,14,24,26,24,26,24,26,24,14,12,7,12,14,12,14,24,26,24,7,26,7,24,26,24,26,24,26,24,14,12,14,24,21,7,21,24,21,24,14,12,7,24,21,24,7,12,7,12,7,26,24,26,24,26,24,26,14,7,12,14,24,26,24,26,24,26,24,26,24,21,24,26,24,21,24,21,26,24,21,24,21,24,21,19,21,19,12,21,7,24,21,24,26,16,21,16,7,12,7,12,7,21,24,21,24,21,24,21,24,21,24,21,24,7,12,7,21,7,16,24,26,24,26,21,24,21,24,26,24,21,24,14,12,7,14,7,24,17,20,7,20,19,20,19,20,7,13,7,20,7,76,14,12,14,12,16,12,16,28,29,28,27,29,28,14,19,12,7,24,12,14,35,24,7,38,39,32,42,32,35,38,42,38,24,26,14,39,7,14,12,7,12,14,12,7,32,39,32,39,26,39,14,36,28,36,40,36,7,36,7,12,7,36,28,19,36,32,28,12,19,7,12,7,19,7,19,32,7,32,7,13,22,12,19,12,19,14,32,25,22,25,13,22,7,13,7,25,7,22,25,7,25,1,2,5,4,2,4,2,3,2,3,1,2,7,6,3,2,3,2,3,2,3,2,3,7,3,47,50,47,50,47,50,46,50,47,50,47,51,47,35,21,12,7,14,12,7,35,41,35,24,21,14,20,29,33,29,31,29,31,29,31,33,29,7,13,7,17,7,31,29,31,29,31,29,31,20,31,29,31,29,13,7,20,17,7,13,31,29,43,42,43,42,45,42,44,46,40,43,31,40,31,45,43,45,31,44,41,44,42,41,42,41,12,35,14,21,7,40,41,35,41,43,42,43,40,19,12,19,14,40,36,28,36,40,33,37,33,28,33,28,33,40,33,40,36,7,14,12,7,14,28,19,28,7,28,7,58,59,58,55,58,55,59,45,26,32,39,42,45,32,7,12,14,12,14,7,59,58,59,7,57,54,49,54,49,52,49,52,49,59,52,49,59,60,27,30,27,30,27,34,16,39,32,26,43,7,14,7,12,14,48,53,56,48,56,53,43,7,59,60,59,60,49,59,60,59,60,59,60,59,60,59,60,59,60,55,45,59,7,14,12,7,19,28,33,15,18,15,18,7,12,14,33,29,23,29,25,7,15,38,14,24,18,15,18,15,18,15,18,15,18,15,10,9,18,15,18,15,18,15,7,8,7,8,7,18,15,18,7,8,7,8,18,7,18,15,18,15,18,15,18,15,18,8,7,8,7,11,9,10,9,7,12,7,12,35,21,61,62,63,61,50,63,66,63,66,67,65,63,70,68,69,67,68,71,64,63,64,72,73,74,73,74,64,63,64,75]
#生成隐马尔可夫需要的序列格式
"""strstr="["
for i in list:
    strstr=strstr+"["+str(i)+"],"
print(strstr)"""

markov.train(list)
probList=[]
for i in range(markov.count):
    probList.append(markov.predict(63,64,i))
#print (str(probList))
print(markov.count)
print(probList.index(max(probList)))




  • 6
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值