下段内容与标题无关可跳过
连续上班八天终于可以休息了。赶紧来总结一下。
在用维特比算法实现词性标注的时候,发现以前写的模块找不到了,这是一个一直发生的事情,这些天下定觉醒要改了。

不久前看过一句话,造飞机容易,修飞机难,以前一有一些想法就写成代码,不喜欢画思维导图,整个过程全放在脑子里,然后短时间内敲完代码,成就感十足。基本上过两三天吧原来的思路消失了,要读懂代码得花些时间,发现BUG了要改也不是很难,然后代码变长了,再过个几个礼拜吧,一看大篇幅的代码,没什么思路,几行注释,头大就不想去维护,再过一段时间吧可能这段代码都忘记放哪了。概括一下来说就是菜。

前一阵子开始做项目了,痛定思痛,开始大批量的写注释,老实说效果有但不是很明显,遇到要改的BUG,还得沉下心去读,可能就是懒吧。最近有开始尝试改变下代码风格,也希望能看到这篇文章的程序猿,能够去多注重如何搞笑的维护代码,而不是图快的干。

**

正文开始

**
现在讲教学的文章,多如牛毛,我也就不写了,下面是几篇好文章的链接,我只写一些问题的解答。
学习viterbi算法的
https://blog.csdn.net/athemeroy/article/details/79339546

要理解viterbi主要看两张图。
Viterbi算法及在HMM中的应用
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190103134239107.png
此图出自上面的博客。

像这样的网络,要求出从A到E的最快路线

我们先来看看贪心算法怎么走

从A走到B有三条路分别要花6分钟,7分钟,5分钟,贪心算法就会走5分钟,然后从B3走到C,再选最优4分钟,这是贪心算法。那么这样会带来什么问题,我从A走到B3选了最快的5分钟的路线,但是夸张点来说从B3走到C需要5个小时,6个小时,7个小时(夸张一下并不是上图的数据),然后我从A走到B2虽然需要7分钟,但是我从B2走到C有1分钟,2分钟,3分钟这三条路,所以这时候贪心算法就不起作用了。

概括来说就是我要走哪条路不仅取决于从A到B的路,还有从B到C,从C到D,我可以是从A到B最快但这样不一定是从B到C最快,综合下来最快才是全局最优,viterbi要解决的真是这么一个问题,当然你可以选择枚举每一条路径然后选最快的,这是一个最靠谱的方法,但是效率太低。

那么viterbi怎么实现全局最优的,看下图
Viterbi算法及在HMM中的应用
从A走到E要路过BCD是不是,好我们虽然不知道怎么样最快才能到达D1,D2,D3但是如果我们知道最快走到D1需要多少时间,最快走到D2,D3需要多少时间,然后根据4,8,5是不是可以计算出最快的方法。那么viterbi其实做的就是记录每一层最优的路径。

比如说 贪心算法,从A到B,它仅仅找了最快的五分钟,而viterbi做了什么呢,它找的是走到B1最快多少,走到B2最快多少,走到B3最快多少,那么以此类推一层层找到D这里,你是不是就能求出最优解了。计算量有但是没有枚举每一条路径这么多,因为如果你不是走到下一个节点的最优方法的话,我就把你抛弃了,这样就不会去计算你带来的新的分叉,还有这些新的分叉带来的分叉。

HMM

看这篇讲的很好
https://www.cnblogs.com/skyme/p/4651331.html
看完实操一下,晴天下雨下雨是正确的,我看到评论有人说应该是晴天晴天下雨,他们错就错在找的不是全局最优,而是当前最优。

说了这么多这些东西有什么用呢?

上文的晴天下雨可能还不够强有力,我们再来一个通俗易懂的例子。

obs = [ '找你聊天', '找你聊天', '我没生气' ]
sta = [ '开心', '生气' ]
stp = { '开心':0.8, '生气':0.2 }
trp = { '开心':{'开心':0.8, '生气':0.2}, '生气':{'开心':0.4, '生气':0.6} }
emp = { '开心':{'找你聊天':0.6, '回复冷淡':0.1, '我没生气':0.3}, '生气':{'找你聊天':0.1, '回复冷淡':0.6, '我没生气':0.3} }

女朋友有三个动作,主动找你聊天,回复冷淡,和说“我没生气啊“
隐藏的状态是两个 开心 和 生气
好那么问题来了,我没生气啊,当女朋友说出这句话的时候如何判断她到底生气还是开心。

其实跟晴天下雨是一个问题。

首先我们人为的猜测一下,当女朋友主动找你聊天,过了一会又主动找你聊天,然后一向警惕的你察觉到了什么,问了女朋友一句你生气了吗,女朋友说我没生气,
量化来表述就是上面的obs
那么HMM结合viterbi带来的结果是

Viterbi算法及在HMM中的应用
我们可以看到结果是女朋友这句我没生气是真没生气。也符合客观认知。

那再来换一种情况
女朋友主动找你聊天,然后回复冷淡,然后对没错一向警惕的你察觉到了什么,问了女朋友一句你生气了吗,女朋友说我没生气,
好那么问题来了,到底生气了吗,我感觉好像生气了。

Viterbi算法及在HMM中的应用
对机器也告诉你确实生气了。

不过这里生气没生气完全取决于你的转移概率和发射概率,但是如果有大量的数据,要得出这几个数字并不困难,标注出来就很麻烦了。

分类:

技术点:

相关文章: