前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >机器学习算法(五)之隐马尔可夫算法代码

机器学习算法(五)之隐马尔可夫算法代码

作者头像
千与编程
发布2023-04-28 13:40:55
2560
发布2023-04-28 13:40:55
举报
文章被收录于专栏:公众号:千与编程

隐马尔科夫模型代码编写:

在上一次写完了隐马尔科夫模型的算法理论部分,总结而言,隐马尔科夫是用来研究隐藏的时序逻辑关系,在隐马尔科夫模型中,前后联系与关系要求比较严格,如果发生顺序的调换,则观测变量就会发生改变。

《统计学习方法》第十章隐马尔可夫模型,课后习题10.1,这是很多博客上的经典解答问题,盒子里拿球顺序的预测。

对于给定盒子与球组成隐马尔科夫模型

A, B为两个概率矩阵,分别列出如下:

设T=4,O=(红色,白色,红色,白色),使用后向算法计算P(O)。以下为隐马尔科夫模型的核心计算代码;

隐马尔科夫模型后向算法代码:

代码语言:javascript
复制
def backward(self, Q, V, A, B, O, PI):  # 后向算法
        N = len(Q)  # 可能存在的状态数量
        M = len(O)  # 观测序列的大小
        betas = np.ones((N, M))  # beta
        for i in range(N):
            print('beta%d(%d)=1' % (M, i))
        for t in range(M - 2, -1, -1):
            indexOfO = V.index(O[t + 1])  # 找出序列对应的索引
            for i in range(N):
                betas[i][t] = np.dot(
                    np.multiply(A[i], [b[indexOfO] for b in B]),
                    [beta[t + 1] for beta in betas])
                realT = t + 1
                realI = i + 1
                print(
                    'beta%d(%d)=[sigma a%djbj(o%d)]beta%d(j)=(' %
                    (realT, realI, realI, realT + 1, realT + 1),
                    end='')
                for j in range(N):
                    print(
                        "%.2f*%.2f*%.2f+" % (A[i][j], B[j][indexOfO],
                                             betas[j][t + 1]),
                        end='')
                print("0)=%.3f" % betas[i][t])
        # print(betas)
        indexOfO = V.index(O[0])
        P = np.dot(
            np.multiply(PI, [b[indexOfO] for b in B]),
            [beta[0] for beta in betas])
        print("P(O|lambda)=", end="")
        for i in range(N):
            print(
                "%.1f*%.1f*%.5f+" % (PI[0][i], B[i][indexOfO], betas[i][0]),
                end="")
        print("0=%f" % P)

将题目中已知条件转为代码的input;

代码语言:javascript
复制
Q = [1, 2, 3]
V = ['红', '白']
A = [[0.5, 0.2, 0.3], [0.3, 0.5, 0.2], [0.2, 0.3, 0.5]]
B = [[0.5, 0.5], [0.4, 0.6], [0.7, 0.3]]
O = ['红', '白', '红', '白']    #习题10.1的例子
PI = [[0.2, 0.4, 0.4]]

代码运行计算概率;

其实本题目所使用的是后向计算方法,有兴趣的读者可以试试维比特计算方法,或者前向计算方法。参考的资料也很多。隐马尔科夫现在逐渐被LSTM等深度学习办法代替,不过明白算法的理论还是还有帮助的。

参考资料

  1. https://github.com/fengdu78/lihang-code
  2. 百度百科——隐马尔科夫模型
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 千与编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档