C#实现马尔科夫模型例子
已知条件:三个缸N状态,每个缸中不同颜色球的个数M状态值,时间轴T,观察值序列O
参数:状态值序列,转移概率序列
求:概率
后台代码如下
const int N = , M = ;//N状态,M状态值 (0橙色,1绿色,2蓝色,3黄色)
public int[] O = { , , , , , , , };//观察值序列
public double[,] A = new double[N, N];//初始一个三行三列的二维数组(状态转移概率)
public double[,] B = new double[N, M];//初始一个三行四列的二维数组(观察值的概率矩阵)
public double[] PI = { 1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0 };//初始化概率
#region 获取观察值概率
/// <summary>
/// 获取观察值概率
/// </summary>
public void GetB()
{
//第一缸球的颜色
double[] one = { , , , };
//第二缸球的颜色
double[] two = { , , , };
//第一缸球的颜色
double[] three = { , , , };
//每个缸中球的总数量
int[] count = { , , };
for (int i = ; i < ; i++)
{
B[, i] = one[i] / count[];
B[, i] = two[i] / count[];
B[, i] = three[i] / count[];
}
}
#endregion #region 获取概率P值 zhy
/// <summary>
/// 获取概率P值
/// </summary>
/// <param name="Q">状态值序列(0第一个缸,1第二个缸,2第三个缸)</param>
/// <param name="A">转移概率</param>
/// <returns></returns>
public double GetP(string Q, string A)
{
GetA(A);
GetB();
int[] q = GetQ(Q);
//时间轴
int T = ;
//初始概率Q[0]:第一缸, O[0]:第一个球
double p = PI[q[]] * B[q[], O[]];
for (int i = ; i < T; i++)
{
//this.A:q[i-1]取上一个刚,q[i]取当前缸,然后获得转移概率
//B:q[i]取当前缸,O[i]取缸中哪个颜色的球
p *= this.A[q[i - ], q[i]] * B[q[i], O[i]];
}
return p;
}
#endregion #region 获取状态值序列 zhy
/// <summary>
/// 获取状态值序列
/// </summary>
/// <param name="Q">状态值字符串</param>
/// <returns>状态值数组</returns>
public int[] GetQ(string Q)
{
int[] q = null;
if (Q.TrimEnd(',').IndexOf(',') > )
{
//获得状态序列
string[] zhuangtai = Q.TrimEnd(',').Split(',');
q = new int[zhuangtai.Length];
for (int i = ; i < zhuangtai.Length; i++)
{
q[i] = Convert.ToInt32(zhuangtai[i]);
}
}
else
{
q = new int[];
q[] = Convert.ToInt32(Q);
}
return q;
}
#endregion #region 获取转移概率序列 zhy
/// <summary>
/// 获取转移概率序列
/// </summary>
/// <param name="A">转移概率字符串</param>
public void GetA(string A)
{
if (A.TrimEnd(',').IndexOf(',') > )
{
string[] gailv = A.TrimEnd(',').Split(',');
//获取A的转移概率的二维数组
for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{
this.A[i, j] = Convert.ToDouble(gailv[ * i + j]);
}
}
}
}
#endregion
html如下:
<span>请输入状态值序列 : </span><input type="text" id="zhuangtaizhi" value="0,2,1,1,2,0,0,1" /><span> 多个值请使用","隔开(0第一缸,1第二缸,2第三缸)</span><br /><br />
<span> a11-a13 :</span>
<input type="text" id="a11_a13" value="0.25,0.45,0.2" /><span> 请输入第一缸的转移概率以","隔开,三值相加等于1</span><br /><br />
<span> a21-a23 :</span>
<input type="text" id="a21_a23" value="0.1,0.85,0.15" /><span> 请输入第二缸的转移概率以","隔开,三值相加等于1</span><br /><br />
<span> a31-a33 :</span>
<input type="text" id="a31_a33" value="0.14,0.55,0.31" /><span> 请输入第三缸的转移概率以","隔开,三值相加等于1</span><br /><br />
<input type="button" value="计算" onclick="count()" />
<div style="display:none;" id="jieguo">
<span>概率为:</span><span id="gailv"></span>
</div>
js如下
function count() {
var zhuangtaizhi = $.trim($("#zhuangtaizhi").val());
var a11_a13 = $.trim($("#a11_a13").val());
var a21_a23 = $.trim($("#a21_a23").val());
var a31_a33 = $.trim($("#a31_a33").val());
if (zhuangtaizhi == "") {
alert("请输入状态值序列");
return;
}
if (a11_a13 == "") {
alert("请输入a11-a13的转移概率");
return;
}
if (a21_a23 == "") {
alert("请输入a21-a23的转移概率");
return;
}
if (a21_a23 == "") {
alert("请输入a21-a23的转移概率");
return;
}
var zhuanyigailv = a11_a13 + "," + a21_a23 + "," + a31_a33;
$.post("/YinMa/GetP", { Q: zhuangtaizhi, A: zhuanyigailv }, function (msg) {
$("#gailv").html(msg);
$("#jieguo").show();
});
}
纯本人手写,转载请注明出处
C#实现马尔科夫模型例子的更多相关文章
- 基于隐马尔科夫模型(HMM)的地图匹配(Map-Matching)算法
文章目录 1. 1. 摘要 2. 2. Map-Matching(MM)问题 3. 3. 隐马尔科夫模型(HMM) 3.1. 3.1. HMM简述 3.2. 3.2. 基于HMM的Map-Matchi ...
- 隐马尔科夫模型HMM学习最佳范例
谷歌路过这个专门介绍HMM及其相关算法的主页:http://rrurl.cn/vAgKhh 里面图文并茂动感十足,写得通俗易懂,可以说是介绍HMM很好的范例了.一个名为52nlp的博主(google ...
- HMM隐马尔科夫模型
这是一个非常重要的模型,凡是学统计学.机器学习.数据挖掘的人都应该彻底搞懂. python包: hmmlearn 0.2.0 https://github.com/hmmlearn/hmmlearn ...
- 隐马尔科夫模型(HMM)的概念
定义隐马尔科夫模型可以用一个三元组(π,A,B)来定义:π 表示初始状态概率的向量A =(aij)(隐藏状态的)转移矩阵 P(Xit|Xj(t-1)) t-1时刻是j而t时刻是i的概率B =(bij) ...
- 隐马尔科夫模型,第三种问题解法,维比特算法(biterbi) algorithm python代码
上篇介绍了隐马尔科夫模型 本文给出关于问题3解决方法,并给出一个例子的python代码 回顾上文,问题3是什么, 下面给出,维比特算法(biterbi) algorithm 下面通过一个具体例子,来说 ...
- 隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率
隐马尔科夫模型HMM(一)HMM模型 隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率 隐马尔科夫模型HMM(三)鲍姆-韦尔奇算法求解HMM参数(TODO) 隐马尔科夫模型HMM(四)维特比算法 ...
- 隐马尔科夫模型HMM(一)HMM模型
隐马尔科夫模型HMM(一)HMM模型基础 隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率 隐马尔科夫模型HMM(三)鲍姆-韦尔奇算法求解HMM参数(TODO) 隐马尔科夫模型HMM(四)维特比 ...
- 隐马尔科夫模型HMM(四)维特比算法解码隐藏状态序列
隐马尔科夫模型HMM(一)HMM模型 隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率 隐马尔科夫模型HMM(三)鲍姆-韦尔奇算法求解HMM参数 隐马尔科夫模型HMM(四)维特比算法解码隐藏状态 ...
- 用hmmlearn学习隐马尔科夫模型HMM
在之前的HMM系列中,我们对隐马尔科夫模型HMM的原理以及三个问题的求解方法做了总结.本文我们就从实践的角度用Python的hmmlearn库来学习HMM的使用.关于hmmlearn的更多资料在官方文 ...
随机推荐
- Python学习日记之读取中文目录
unicode # -*- coding:utf-8 -*- import os import shutil ins="E:\\学习资料" dir=unicode(ins,'utf ...
- HDU_3732_(多重背包)
Ahui Writes Word Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- jmeter接口测试小结
摘自:http://www.cnblogs.com/houzhizhe/p/6839736.html JMeter做http接口压力测试 测前准备 用JMeter做接口的压测非常方便,在压测之前我们需 ...
- java_线程创建的两种方法
线程创建的方法有两种: 一 继承Thread类: public class ThreadTest { public static void main(String[] args) { //4)在mai ...
- React-native SyntaxError: Unexpected token ...
更新 node.js 版本到 v6.11.1. https://github.com/facebook/react-native/issues/15040
- 最高的奖励 - 优先队列&贪心 / 并查集
题目地址:http://www.51cpc.com/web/problem.php?id=1587 Summarize: 优先队列&贪心: 1. 按价值最高排序,价值相同则按完成时间越晚为先: ...
- mysql5.7报Access denied for xxx@localhost 的解决
使用root用户登录mysql数据库若如下报错 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using passwor ...
- TestNG忽略测试
用@Test(enabled = false) 声明需要被忽略执行的测试方法 package com.janson; import org.testng.annotations.Test; publi ...
- linux od-输出文件的八进制、十六进制等格式编码的字节
博主推荐:获取更多 linux文件内容查看命令 收藏:linux命令大全 od命令用于输出文件的八进制.十六进制或其它格式编码的字节,通常用于显示或查看文件中不能直接显示在终端的字符. 常见的文件为文 ...
- C语言二叉树的创建、(先中后序)遍历以及存在的问题
#include<stdlib.h> #include<stdio.h> #define True 1 #define False 0 typedef char TElemTy ...