用ruby写的wikipedia上的维特比算法

维特比算法可以解决隐马尔科夫模型的最可能状态序列问题。

wikipedia上关于维特比算法,提供了一个python的例子,原文地址如下

http://zh.wikipedia.org/wiki/%E7%BB%B4%E7%89%B9%E6%AF%94%E7%AE%97%E6%B3%95

鉴于最近正在学习ruby,就把这个算法从python迁移到ruby,这两个语言的语法很接近,所以,前移过去没有什么难度,希望使用代码之前先了解一下维特比算法的基础理论。

 #
#encoding:utf-8
puts ‘This is Viterbi‘
$states = [:Healthy, :Fever]
#puts "length: #{$states.length}"
$obervastions = [:normal, :cold, :dizzy]

$start_probability = {Healthy: 0.6, Fever: 0.4}
# puts $start_probability[$states[0]]

$transition_probability = {
    Healthy: {Healthy: 0.7, Fever: 0.3},
    Fever: {Healthy: 0.4, Fever: 0.6},
}

$emission_probability = {
    Healthy: {normal: 0.5, cold: 0.4, dizzy: 0.1},
    Fever: {normal: 0.1, cold: 0.3, dizzy: 0.6}
}

def print_dptable(v)
  puts ‘    ‘
  for i in 0..v.length
    puts "%7d" % i
  end

  for y in v[0].keys
    puts "%5s" % y
    for t in 0...v.length
      puts "%.7s" % ("%f" % v[t][y])
    end
  end
end

def viterbi(obs, states, start_p, trans_p, emit_p)
  v = [{}]
  path = {}

# Initialize base cases (t == 0)
  states.each { |y|
    v[0][y] = start_p[y] * emit_p[y][obs[0]]
    path[y] = [y]
  }

# Run Viterbi for t > 0
  for t in 1...obs.length
    v << {}
    newpath = {}

    for y in states

      prob, state = states.map { |y0|
      [v[t-1][y0] * trans_p[y0][y] * emit_p[y][obs[t]], y0] }.max
      v[t][y] = prob
      newpath[y] = path[state] + [y]
    end

    # Don‘t need to remember the old paths
    path = newpath
  end

  print_dptable v
  prob, state = states.map { |y| [v[obs.size - 1][y], y] }.max
  return prob, path[state]
end

def example
  viterbi $obervastions,
          $states,
          $start_probability,
          $transition_probability,
          $emission_probability
end

puts example

用ruby写的wikipedia上的维特比算法

时间: 2024-10-11 16:26:12

用ruby写的wikipedia上的维特比算法的相关文章

wex5 实战 手写签名与上传

之前做过一个物流演示模块,有一个功能没做完,就是收件人收货后,可以手写签名并上传,替代传统纸张的签名.今天终于做完了. 一 效果演示: 后台图片上传成功 二 设计思路: 运用canvas插件jq-signature,制作手写签名,并通过二进制流方式上传图片 三 代码实现: 1 .下载引入插件jq-signature 手写签名插件,网上有很多,经过多种插件的逐步尝试,只有插件jq-signature达到了我想要的效果; 原因有二:1,支持手机触摸,web,鼠标.其它有的不支持手机触摸. 2,直接转

写一个Windows上的守护进程(5)文件系统重定向

写一个Windows上的守护进程(5)文件系统重定向 在Windows上经常操作文件或注册表的同学可能知道,有“文件系统/注册表重定向”这么一回事.大致来说就是32位程序在64位的Windows上运行时,操作系统会把对System32文件夹的访问重定向到SysWow64下,把对HKEY_LOCAL_MACHINE\SOFTWARE的访问重定向到HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node下.当然不止这些路径和注册表.详情请查看MSDN:https://msdn.

写一个Windows上的守护进程(1)开篇

写一个Windows上的守护进程(1)开篇 最近由于工作需要,要写一个守护进程,主要就是要在被守护进程挂了的时候再把它启起来.说起来这个功能是比较简单的,但是我前一阵子写了好多现在回头看起来比较糟糕的代码,所以就想这次写的顺眼一点.写完后发现,诶,还可以哟.于是就总结总结. 一.大致需求 1. 功能——当被守护进程挂掉后再次启动它 2. 可配置需要守护的进程 二.通盘考虑 1. 为了避免重复造轮子,况且有的轮子可能自己也造不出来,上boost库 2. 为了能够获得较高的权限和能够开机自动启动,将

写一个Windows上的守护进程(4)日志其余

写一个Windows上的守护进程(4)日志其余 这次把和日志相关的其他东西一并说了. 一.vaformat C++日志接口通常有两种形式:流输入形式,printf形式. 我采用printf形式,因为流输入不好控制格式. printf形式要求日志接口支持不定长参数,我没有直接在日志实现类里边支持不定长参数,而是只接受一个字符串参数,可以参见第一篇. 为什么呢? 如果要成为不定长参数,就是这样 bool log_string(const LOG_LEVEL level, const char* fi

ASP.NET MVC应用程序把文字写在图片上

原文:ASP.NET MVC应用程序把文字写在图片上 Insus.NET实现这篇<MVC把随机产生的字符串转换为图片>http://www.cnblogs.com/insus/p/3624235.html 之后,把字符串转换为图片,不如尝试,把字符串写在一张图片之上.好像有点添加水印的意思. 如果你了解此篇,实现水印的功能也自然懂得了. 参考下面方法,是核心的功能函数,传入文本,以及图片,返回的是Bitmap: 创建控件器,编写两个Action: 接下来,创建视图: 演示: ASP.NET M

写一个Windows上的守护进程(6)Windows服务

写一个Windows上的守护进程(6)Windows服务 守护进程因为要开机启动,还要高权限,所以我就把它做成Windows服务了. 关于Windows服务的官方文档,大家可以看https://msdn.microsoft.com/en-us/library/windows/desktop/ms686953(v=vs.85).aspx. 总的来说,服务的行为区别于普通应用程序的地方有以下几点: 1. 一般来说,服务是运行于System用户下的,当然也可以自己指定.也就是说服务可以在无用户登录的情

写一个Windows上的守护进程(3)句柄的管理

写一个Windows上的守护进程(3)句柄的管理 在Windows中编程,跟HANDLE打交道是家常便饭.为了防止忘记CloseHandle,我都是使用do-while-false手法: void f() { HANDLE h = NULL; do { } while (false); if (h) { CloseHandle(h); h = NULL; } } HANDLE一多,就得写好几段长得一样的清理代码,比较麻烦.仔细一想,这个其实很容易写一个关闭器——在出作用域时自动关闭: class

写一个Windows上的守护进程(8)获取进程路径

写一个Windows上的守护进程(8)获取进程路径 要想守护某个进程,就先得知道这个进程在不在.我们假设要守护的进程只会存在一个实例(这也是绝大部分情形). 我是遍历系统上的所有进程,然后判断他们的路径和要守护的进程是否一致,以此来确定进程是否存在. 遍历进程大家都知道用CreateToolhelp32Snapshot系列API,但是他们最后取得的是进程exe名称,不是全路径,如果仅依靠名称就可以达到目的也就罢了,但是有的时候还是得取到全路径,这样会更靠谱一些. 那么问题来了,如何取到进程全路径

写一个Windows上的守护进程(7)捕获异常并生成dump

写一个Windows上的守护进程(7)捕获异常并生成dump 谁都不能保证自己的代码不出bug.一旦出了bug,最好是崩溃掉,这样很快就能被发现,若是不崩溃,只是业务处理错了,就麻烦了,可能很长时间之后才能被发现. 那么如果崩溃掉,怎么查错呢? 写过Windows驱动的同学应该知道,一旦崩溃,系统会生成dump文件,然后就可以根据dump文件.pdb文件.源码用windbg分析了.应用层的程序同样可以在崩溃的时候生成dump文件,只是没人帮你完成这个步骤,得自己动手. 1. API 这里涉及到的