隐马尔科夫模型C#类库调用示例


[c-sharp] view plaincopyprint?
  1. using System;  
  2. using Splash;  
  3.   
  4. namespace SplashCheck  
  5. {  
  6.     class TestHMMCS  
  7.     {  
  8.         enum Weather { Sunny, Cloudy, Rainy };  // 隐藏状态(天气)   
  9.         enum Seaweed { Dry, Dryish, Damp, Soggy };  // 观察状态(海藻湿度)   
  10.   
  11.         static void Main(string[] args)  
  12.         {  
  13.             // 测试前向算法和后向算法   
  14.             CheckForwardAndBackward();  
  15.             Console.WriteLine();  
  16.   
  17.             // 测试维特比算法   
  18.             CheckViterbi();  
  19.             Console.WriteLine();  
  20.   
  21.             // 测试HMM学习算法   
  22.             CheckBaumWelch();  
  23.         }  
  24.   
  25.         // 测试前向算法和后向算法   
  26.         static void CheckForwardAndBackward()  
  27.         {  
  28.             // 状态转移矩阵   
  29.             Double[,] A = {  
  30.                 {0.500, 0.375, 0.125},  
  31.                 {0.250, 0.125, 0.625},  
  32.                 {0.250, 0.375, 0.375}  
  33.             };  
  34.   
  35.             // 混淆矩阵   
  36.             Double[,] B =   
  37.             {  
  38.                 {0.60, 0.20, 0.15, 0.05},  
  39.                 {0.25, 0.25, 0.25, 0.25},  
  40.                 {0.05, 0.10, 0.35, 0.50}  
  41.             };  
  42.   
  43.             // 初始概率向量   
  44.             Double[] PI = { 0.63, 0.17, 0.20 };  
  45.   
  46.             // 观察序列   
  47.             Int32[] OB = { (Int32)Seaweed.Dry, (Int32)Seaweed.Damp, (Int32)Seaweed.Soggy };  
  48.   
  49.             // 初始化HMM模型   
  50.             HMM hmm = new HMM(A.GetLength(0), B.GetLength(1));  
  51.             hmm.A = A;  
  52.             hmm.B = B;  
  53.             hmm.PI = PI;             
  54.   
  55.             // 观察序列的概率   
  56.             Console.WriteLine("------------前向算法:双精度运算-----------------");  
  57.             Double Probability = hmm.Forward(OB);  
  58.             Console.WriteLine("Probability =" + Probability.ToString("0.###E+0"));  
  59.             Console.WriteLine();  
  60.   
  61.             // 观察序列的概率   
  62.             Console.WriteLine("------------后向算法:双精度运算-----------------");  
  63.             Probability = hmm.Backward(OB);  
  64.             Console.WriteLine("Probability =" + Probability.ToString("0.###E+0"));  
  65.         }         
  66.   
  67.         // 测试维特比算法   
  68.         static void CheckViterbi()  
  69.         {  
  70.             // 状态转移矩阵   
  71.             Double[,] A = {  
  72.                 {0.500, 0.250, 0.250},  
  73.                 {0.375, 0.125, 0.375},  
  74.                 {0.125, 0.675, 0.375}  
  75.             };  
  76.   
  77.             // 混淆矩阵   
  78.             Double[,] B =   
  79.             {  
  80.                 {0.60, 0.20, 0.15, 0.05},  
  81.                 {0.25, 0.25, 0.25, 0.25},  
  82.                 {0.05, 0.10, 0.35, 0.50}  
  83.             };  
  84.   
  85.             // 初始概率向量   
  86.             Double[] PI = { 0.63, 0.17, 0.20 };  
  87.   
  88.             // 观察序列   
  89.             Int32[] OB = { (Int32)Seaweed.Dry, (Int32)Seaweed.Damp, (Int32)Seaweed.Soggy, (Int32)Seaweed.Dryish, (Int32)Seaweed.Dry };  
  90.   
  91.             // 初始化HMM模型   
  92.             HMM hmm = new HMM(A.GetLength(0), B.GetLength(1));  
  93.             hmm.A = A;  
  94.             hmm.B = B;  
  95.             hmm.PI = PI;             
  96.   
  97.             // 找出最有可能的隐藏状态序列   
  98.             Double Probability;  
  99.   
  100.             Console.WriteLine("------------维特比算法:双精度运算-----------------");  
  101.             Int32[] Q = hmm.Viterbi(OB, out Probability);  
  102.             Console.WriteLine("Probability =" + Probability.ToString("0.###E+0"));  
  103.             foreach (Int32 Value in Q)  
  104.             {  
  105.                 Console.WriteLine(((Weather)Value).ToString());  
  106.             }  
  107.             Console.WriteLine();  
  108.   
  109.             Console.WriteLine("------------维特比算法:对数运算-----------------");  
  110.             Q = hmm.ViterbiLog(OB, out Probability);  
  111.             Console.WriteLine("Probability =" + Probability.ToString("0.###E+0"));  
  112.             foreach (Int32 Value in Q)  
  113.             {  
  114.                 Console.WriteLine(((Weather)Value).ToString());  
  115.             }      
  116.         }  
  117.   
  118.         static void CheckBaumWelch()  
  119.         {  
  120.             // 状态转移矩阵   
  121.             Double[,] A = {  
  122.                 {0.500, 0.250, 0.250},  
  123.                 {0.375, 0.125, 0.375},  
  124.                 {0.125, 0.675, 0.375}  
  125.             };  
  126.   
  127.             // 混淆矩阵   
  128.             Double[,] B =   
  129.             {  
  130.                 {0.60, 0.20, 0.15, 0.05},  
  131.                 {0.25, 0.25, 0.25, 0.25},  
  132.                 {0.05, 0.10, 0.35, 0.50}  
  133.             };  
  134.   
  135.             // 初始概率向量   
  136.             Double[] PI = { 0.63, 0.17, 0.20 };  
  137.   
  138.             // 观察序列   
  139.             Int32[] OB = { (Int32)Seaweed.Dry, (Int32)Seaweed.Damp, (Int32)Seaweed.Soggy, (Int32)Seaweed.Dryish, (Int32)Seaweed.Dry };  
  140.   
  141.             // 初始化HMM模型   
  142.             HMM hmm = new HMM(A.GetLength(0), B.GetLength(1));  
  143.   
  144.             // 数组克隆,避免损坏原始数据   
  145.             hmm.A = (Double[,])A.Clone();  
  146.             hmm.B = (Double[,])B.Clone();  
  147.             hmm.PI = (Double[])PI.Clone();  
  148.   
  149.             // 前向-后向算法   
  150.             Console.WriteLine("------------Baum-Welch算法-----------------");  
  151.             Double LogProbInit, LogProbFinal;  
  152.             Int32 Iterations = hmm.BaumWelch(OB, out LogProbInit, out LogProbFinal);  
  153.             Console.WriteLine("迭代次数 = {0}", Iterations);  
  154.             Console.WriteLine("初始概率 = {0}", Math.Exp(LogProbInit));  
  155.             Console.WriteLine("最终概率 = {0}", Math.Exp(LogProbFinal));  
  156.             Console.WriteLine();  
  157.   
  158.             // 打印学习后的模型参数   
  159.             Console.WriteLine("新的模型参数:");  
  160.             Console.WriteLine("PI");  
  161.             for (Int32 i = 0; i < hmm.N; i++)  
  162.             {  
  163.                 if(i == 0)  
  164.                     Console.Write(hmm.PI[i].ToString("0.000"));  
  165.                 else  
  166.                     Console.Write(" " + hmm.PI[i].ToString("0.000"));  
  167.             }  
  168.             Console.WriteLine();  
  169.             Console.WriteLine();  
  170.   
  171.             Console.WriteLine("A");  
  172.             for (Int32 i = 0; i < hmm.N; i++)  
  173.             {  
  174.                 for (Int32 j = 0; j < hmm.N; j++)  
  175.                 {  
  176.                     if (j == 0)  
  177.                         Console.Write(hmm.A[i, j].ToString("0.000"));  
  178.                     else  
  179.                         Console.Write(" " + hmm.A[i, j].ToString("0.000"));  
  180.                 }  
  181.                 Console.WriteLine();  
  182.             }              
  183.             Console.WriteLine();  
  184.   
  185.             Console.WriteLine("B");  
  186.             for (Int32 i = 0; i < hmm.N; i++)  
  187.             {  
  188.                 for (Int32 j = 0; j < hmm.M; j++)  
  189.                 {  
  190.                     if (j == 0)  
  191.                         Console.Write(hmm.B[i, j].ToString("0.000"));  
  192.                     else  
  193.                         Console.Write(" " + hmm.B[i, j].ToString("0.000"));  
  194.                 }  
  195.                 Console.WriteLine();  
  196.             }  
  197.             Console.WriteLine();  
  198.         }  
  199.     }  
  200. }  


转载:http://blog.csdn.net/jhqin/article/details/6535013#

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352622.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

芯片,开源,数学,计算机

近代数学好像没什么数学定理是中国人命名的&#xff0c;有也是凤毛麟角是广泛意义上的华人命名的。开源Linux内核好像也没有几行代码是中国人贡献的&#xff0c;通用CPU芯片美帝的&#xff0c;计算机美帝发明的&#xff0c;内存/硬盘/显示器&#xff0c;三星台湾造。20年前我大…

C#之继承

本文意在巩固基础知识&#xff0c;并不是对其进行深入剖析&#xff0c;如若对各位高手没有什么作用&#xff0c;请绕过。本文为原创文&#xff0c;所有示例均是博主测试过的&#xff0c;欢迎大家批评指正&#xff0c;如有转载请标明出处&#xff0c;谢谢。继承、封装和多态是面…

python的requests模块功能_python中requests模块的使用方法

本文实例讲述了python中requests模块的使用方法。分享给大家供大家参考。具体分析如下&#xff1a; 在HTTP相关处理中使用python是不必要的麻烦&#xff0c;这包括urllib2模块以巨大的复杂性代价获取综合性的功能。相比于urllib2,Kenneth Reitz的Requests模块更能简约的支持完整…

ODPS技术架构及应用实践

《程序员》杂志2014年10月刊《凌云》云计算大数据阿里云ODPShadoop摘要&#xff1a;ODPS是分布式的海量数据处理平台&#xff0c;提供了丰富的数据处理功能和灵活的编程框架。本文从ODPS面临的挑战、技术架构、Hadoop迁移到ODPS、应用实践注意点等方面带领我们初步了解了ODPS的…

ssh,scp带密码操作

1、远程执行&#xff0c;带密码参数 sshpass 安装命令&#xff1a; yum install sshpass 执行命令&#xff1a; sshpass -p "mima" ssh rootlocalhost --------参数小写p&#xff0c;密码mima 2、非22端口 ssh -p 9062 111.111.111…

junit 测试 dao_JUnit测试Spring Service和DAO(带有内存数据库)

junit 测试 dao这篇文章描述了如何为Spring Web Application的Services和DAO实现JUnit测试。 它建立在Spring MVC-Service-DAO-Persistence Architecture Example的基础上 。 从Github的Spring-Web-JPA-Testing目录中可以找到该示例。 提醒 测试装置 –固定状态&#xff0c;用…

C++判断文件夹是否存在

判断文件夹是否存在一、判断文件夹是否存在&#xff1a; 1.用CreateDirectory(".//FileManege",NULL);如果文件夹FileManege不存在&#xff0c;则创建。 2.或者if(_access(".//FileManege",0)-1)&#xff0c;表示FileManege不存在。 3.或者…

ODPS MR开发 WordCount

参考&#xff1a; ODPS初始篇--客户端配置和使用&#xff1a;http://blog.itpub.net/26613085/viewspace-1327313/ odps dship客户端使用&#xff1a;http://blog.itpub.net/26613085/viewspace-1328434/ 有了上面两篇文章&#xff0c;就可以使用ODPS的客户端&#xff1b;使用O…

跨域设置

# 参考&#xff1a; https://blog.csdn.net/linzi1994/article/details/82724429 https://www.cnblogs.com/ShaunChen/p/5998800.html# 配置详解&#xff1a; # 跨域设置 CORS_ORIGIN_ALLOW_ALL True # 允许所有域名 CORS_ALLOW_CREDENTIALS True # 允许获取cookie CORS_UR…

kdb q介绍

Q起源Kx systems公司的创始人之一Arthur Whitney在2003年研发了列式数据库KDB和它的操作语言q。q也可以写成Q。设计之初&#xff0c;q语言要做到简洁&#xff0c;高效和富表达性。 q的起源受到多种语言的启示。包括APL、LISP和函数式编程。 APL是一个向量语言&#xff0c;所以…

mysql多大_洞悉MySQL底层架构:游走在缓冲与磁盘之间

提起MySQL&#xff0c;其实网上已经有一大把教程了&#xff0c;为什么我还要写这篇文章呢&#xff0c;大概是因为网上很多网站都是比较零散&#xff0c;而且描述不够直观&#xff0c;不能系统对MySQL相关知识有一个系统的学习&#xff0c;导致不能形成知识体系。为此我撰写了这…

odps新手上路之安装Eclipse开发环境

只看楼主更多操作楼主 发表于: 2014-11-07—本帖被 亮伟 执行取消精华操作(2014-11-27)—准备工作&#xff1a;登录阿里云官网&#xff0c;开通odps服务。创建一个odps的project。安装odps的客户端&#xff0c;具体的方法见 传送门下载Eclipse并解压缩。建议到官网上下载。作…

mfc对话框在不同计算机上显示不全

出现&#xff2d;&#xff26;&#xff23;对话框在不同计算机上显示不全的或者显示大小不一样的活可以调整电脑的分辨率也可以在创建对话框时根据分辨率来调整控件。

c++二进制转十进制_二进制,八进制,十进制,十六进制转换详解~

点 击 上 方 蓝 字 关 注 我 们 哦 ^-^本文思维导图&#xff1a;1.数制&#xff1a;用一组固定的数字和一套统一的规则来表示数目的方法称为数制。进位计数制的要素&#xff1a;①、数码&#xff1a;用来表示进制数的元素。二进制&#xff1a;0,1。八进制&#xff1a;0,1,2,3,4…

复习第三章多态

第三章 多态 本章需要掌握的东西 掌握多态的优势和应用场合答&#xff1a;多态的优势可以减少代码量&#xff0c;更加清晰明了。&#xff0c;应用场合为&#xff0c;一个事物需要做多种事情的时候需要用到多态。 2.掌握父类和子类之间的类型转换 答&#xff1a;父类引用转向子…

java堆 数据结构 堆_Java中的紧凑堆外结构/组合

java堆 数据结构 堆在上一篇文章中&#xff0c;我详细介绍了代码对主内存的访问方式的含义。 从那时起&#xff0c;我就在Java中可以做什么以实现更可预测的内存布局提出了很多疑问。 有些模式可以使用数组支持的结构来应用&#xff0c;我将在另一篇文章中讨论。 这篇文章将探讨…

Unix环境高级编程学习笔记(七) 多线程

线程概述 线程&#xff08;thread&#xff09;技术早在60年代就被提出&#xff0c;但真正应用多线程到操作系统中去&#xff0c;是在80年代中期&#xff0c;solaris是这方面的佼佼者。传统的Unix也支持线程的概念&#xff0c;但是在一个进程&#xff08;process&#xff09;中只…

testflight开发者已将您从测试计划中移除_使用 TestFlight 测?试 App

目前市面上对于iOS开发的签名样式大致分为三种&#xff1a; a、企业签 依赖于苹果企业级开发者账号b、超级签 依赖于苹果个人开发者账号c、tf签 TestFlight Beta 版测试让您可以分发您 App 的 Beta 版构建版本给测试员并收集反馈。您可以在您的 App Store Connect 帐户中一次为…

MFC操作ini文件方法

转自&#xff1a;http://blog.csdn.net/rayborn1105/article/details/8192142 一个不错的接口&#xff1a;http://blog.csdn.net/qq575787460/article/details/8185339 在我们的程序设计中经常需要对一些参数进行配置&#xff0c;配置好后还要在下一次启动仍然有效&#xff0c;…

Java 8流中的数据库CRUD操作

在开始使用新工具时要克服的最大障碍是让您着手处理小事情。 到目前为止&#xff0c;您可能对新的Java 8 Stream API的工作方式充满信心&#xff0c;但是您可能尚未将其用于数据库查询。 为了帮助您开始使用Stream API创建&#xff0c;修改和读取SQL数据库&#xff0c;我整理了…