【Python自然语言处理】隐马尔可夫模型中维特比(Viterbi)算法解决商务选择问题实战(附源码 超详细必看)

本文涉及的产品
NLP自然语言处理_基础版,每接口每天50万次
NLP 自学习平台,3个模型定制额度 1个月
NLP自然语言处理_高级版,每接口累计50万次
简介: 【Python自然语言处理】隐马尔可夫模型中维特比(Viterbi)算法解决商务选择问题实战(附源码 超详细必看)

需要源码请点赞关注收藏后评论区留言私信~~~

一、统计分词

统计分词基本逻辑是把每个词语看做由单字组成,利用统计学原理计算连接字在不同文本中出现的次数,以此判断相连字属于特定词语的概率。

二、隐马尔可夫模型

当一个随机过程在给定现在状态及所有过去状态情况下,其未来状态的条件概率分布仅依赖于当前状态,那么此随机过程通常称之为马尔可夫过程。隐马尔可夫模型(Hidden Markov Model:HMM)是含有隐含且未知参数的马尔可夫过程。

下图表示了隐马尔可夫模型隐藏变量和观测变量相互之间的依赖关系,在任意时刻,观测变量仅仅依赖于隐藏变量,与其他隐藏状态变量和观测变量的取值没有直接关联,同时,特定时刻隐藏状态仅依赖于紧邻上一时刻隐藏状态,与其他状态无关

三、商务问题描述

假定某公司销售竞赛指导委员会从n个部门选取员工参加销售业务竞赛,每个部门有m类不同销售能力的员工组成,初始状态下随机选择一个部门后再随机挑选一名职工,职工的类型可以观测,但职工所在的部门为未知信息,第一名员工选择完后,继续按照随机概率选择下一个部门和下一名员工,依次循环知道选择的员工数量满足竞赛人员挑选要求为止

在这个实例中,隐马尔可夫模型可以表示为

1:部门状态信息 n

2:员工的销售能力状态 m

3:从一个部门迁移到另一个部门的转移概率

4:从特定部门选择特定类型的员工概率

5:初始概率分布

隐马尔可夫模型重点解决的问题包括

1:如何确定观测序列的生成概率

2:观测序列已知的前提下 如何优化参数并最大化观测序列的生成概率

3:如何优化隐藏状态序列 从而实现输出期望值观测序列

四、维特比算法

维特比算法主要用于解决优化隐藏状态序列从而实现输出和期望值观测序列的问题

维特比算法的基本逻辑:

(1)如果最短(或概率最大)路径P经过特定节点G,那么从这条路径起点S到节点G的子路径M,是起点S到节点G之间的最短路径。

(2)从起点S到终点E路径必定经过i时刻的某个状态,如果记录起点S到该状态所有节点的最短路径集合,整体最短路径必经过集合中的某一条。

(3)假定从状态i到状态i+1,起点S到状态i各节点的最短路径已知,计算S到i+1状态的节点的最短路径可以分解为从S到i状态的最短路径,以及从i状态节点到i+1状态节点的最短路径。

下面是利用维特比算法解决上面的商务问题的结果

由结果可知 最优化的部门选择序列应该是先从第二个部门开始,其次是第一个部门,最后是第三个部门(索引从0开始)

五、代码

部分代码如下 需要全部代码请点赞关注收藏后评论区留言私信~~

import numpy as np
#维特比算法
def viterbi_algorithm(H, B, rho, O):
  #隐马尔科夫模型隐藏状态数 N=3,总共有三个班级,分别用0,1,2表示
    N = np.shape(H)[0] 
    #观测序列时间序列
    T = np.shape(O)[0]
    #特定时刻隐藏状态对应最优状态序列概率 
    mu = np.zeros((T,N))
    #特定时刻隐藏状态对应最优状态前导序列概率 
    index = np.zeros((T,N))
    for t in range(T):
        if 0 == t:
            mu[t] = np.multiply(rho.reshape((1, N)), np.array(B[:,O[t]]).reshape((1, N)))
            continue
        for i in range(N):
            temp = np.multiply(np.multiply(mu[t-1], H[:,i]), B[i, O[t]])
            mu[t,i] = max(temp)
            index[t][i] = np.argmax(temp)
    hs = np.zeros((T,))
    t_range = -1 * np.array(sorted(-1*np.arange(T)))
    for t in t_range:
        if T-1 == t:
            hs[t] = np.argmax(mu[t])
        else:
            hs[t] = index[t+1, int(hs[t+1])]
    print('最优隐藏状态序列为:', hs)
    return hs
def Viterbi_init():
    #H是隐藏状态转移概率分布
 )
    #初始状态概率分布
    rho = np.array([[0.2],
                    [0.4],
                    [0.4]])
    #学生的计算机水平观测序列:0-低水平,1-高水平
    O = np.array([[1],
                  [1],
                  [0]]) 
    viterbi_algorithm(H,B,rho,O)
if __name__=='__main__':
    Viterbi_init()

创作不易 觉得有帮助请点赞关注收藏~~~

 

相关文章
|
2月前
|
Python
用python进行视频剪辑源码
这篇文章提供了一个使用Python进行视频剪辑的源码示例,通过结合moviepy和pydub库来实现视频的区间切割和音频合并。
63 2
|
14天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
56 8
|
14天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
47 7
|
1月前
|
自然语言处理 PyTorch 算法框架/工具
掌握从零到一的进阶攻略:让你轻松成为BERT微调高手——详解模型微调全流程,含实战代码与最佳实践秘籍,助你应对各类NLP挑战!
【10月更文挑战第1天】随着深度学习技术的进步,预训练模型已成为自然语言处理(NLP)领域的常见实践。这些模型通过大规模数据集训练获得通用语言表示,但需进一步微调以适应特定任务。本文通过简化流程和示例代码,介绍了如何选择预训练模型(如BERT),并利用Python库(如Transformers和PyTorch)进行微调。文章详细说明了数据准备、模型初始化、损失函数定义及训练循环等关键步骤,并提供了评估模型性能的方法。希望本文能帮助读者更好地理解和实现模型微调。
69 2
掌握从零到一的进阶攻略:让你轻松成为BERT微调高手——详解模型微调全流程,含实战代码与最佳实践秘籍,助你应对各类NLP挑战!
|
26天前
|
自然语言处理 算法 搜索推荐
NLP中TF-IDF算法
TF-IDF(词频-逆文档频率)是一种用于信息检索与数据挖掘的加权技术,通过评估词语在文档中的重要性来过滤常见词语,保留关键信息。本文介绍了TF-IDF的基本概念、公式及其在Python、NLTK、Sklearn和jieba中的实现方法,并讨论了其优缺点。TF-IWF是TF-IDF的优化版本,通过改进权重计算提高精度。
54 1
|
1月前
|
自然语言处理 Java 编译器
为什么要看 Python 源码?它的结构长什么样子?
为什么要看 Python 源码?它的结构长什么样子?
26 2
|
1月前
|
Python
源码解密 Python 的 Event
源码解密 Python 的 Event
40 1
|
1月前
|
数据采集 前端开发 Python
Python pygame 实现游戏 彩色 五子棋 详细注释 附源码 单机版
Python pygame 实现游戏 彩色 五子棋 详细注释 附源码 单机版
71 0
|
1月前
|
存储 算法 安全
ArrayList简介及使用全方位手把手教学(带源码),用ArrayList实现洗牌算法,3个人轮流拿牌(带全部源码)
文章全面介绍了Java中ArrayList的使用方法,包括其构造方法、常见操作、遍历方式、扩容机制,并展示了如何使用ArrayList实现洗牌算法的实例。
17 0
|
2月前
|
自然语言处理 算法
NLP之距离算法Levenshtein
NLP之距离算法Levenshtein
下一篇
无影云桌面