大数据之道 HMM系列

一:HMM解码问题

(1)给定一个观察序列O=O1O2...OT,和模型μ=(A,B,π),如何快速有效地选择在一定意义下“最优”的状态序列Q=q1q2...qT,使该状态最好地解释观察序列。

(2)最可能的隐藏状态序列(Finding most probable sequence of hidden states);对于一个特殊的隐马尔科夫模型(HMM)及一个相应的观察序列,我们常常希望能找到生成此序列最可能的隐藏状态序列。

二:实例篇

(1)假设连续观察3天的海藻湿度为(Dry,Damp,Soggy),求这三天最可能的天气情况。天气只有三类(Sunny,Cloudy,Rainy),而且海藻湿度和天气有一定的关系。

已知:

1. 隐藏的状态:Sunny,Cloudy, Rainy;海藻湿度有四类{Dry,Dryish,Damp,Soggy }

2. 观察状态序列:{Dry, Damp, Soggy };

3. 初始状态序列:Sunny(0.63),Cloudy(0.17),Rainy(0.20);

4. 状态转移矩阵

Sunny
       Cloudy   Rainy

Sunny 0.5
        0.375  0.125

Cloudy 0.25
0.125 0.625

Rainy 0.25
0.375 0.375

Cloudy(昨天)->Sunny(今天)的概率是0.25;

Sunny(昨天)->Rainy(今天)的概率是0.125.

5. 混淆矩阵(海藻湿度与天气的相关性):

Dry
         Dryish Damp
Soggy

Sunny 0.6
        0.2         0.15
0.05

Cloudy 0.25
0.25 0.25
0.25

Rainy 0.05
0.10 0.35
0.50

(2)计算方法:

由HMM可知,Day2的天气仅取决于Day1;Day3的天气又只取决于Day2的天气。

step1:Day1由于是初始状态,我们分别求

P(Day1-Sunny)=0.63*0.6;

P(Day1-Cloudy)=0.17*0.25;

P(Day1-Rain)=0.20*0.05;

Choose max{ P(Day1-Sunny) , P(Day1-Cloudy),P(Day1-Rainy)}, 得到P(Day1-Sunny)最大,得出第1天Sunny的概率最大。

step2: Day2的天气又取决于Day1的天气状况,同时也受Day2观察的海藻情况影响。

P(Day2-Sunny)= max{ P(Day1-Sunny)*0.5, P(Day1-Cloudy)*0.25,  P(Day1-Rainy)*0.25} *0.15;

P(Day2-Cloudy)= max{ P(Day1-Sunny)*0.375,  P(Day1-Cloudy)*0.125, P(Day1-Rainy)*0.625} *0.25;

P(Day2-Rainy)= max{ P(Day1-Sunny)*0.125,  P(Day1-Cloudy)*0.625 , P(Day1-Rainy)*0.375} *0.35;

Choosemax{ P(Day2-Sunny) , P(Day2-Cloudy), P(Day2-Rainy)},得到P(Day2-Rainy)最大,得出第2天Rainy的概率最大。

故{Sunny,Rainy}是前两天最大可能的天气序列。

step3: Day3的天气又取决于Day2的天气状况,同时也受Day3观察的海藻情况影响。

P(Day3-Sunny)= max{ P(Day2-Sunny)*0.5, P(Day2-Cloudy)*0.25,  P(Day2-Rainy)*0.25} *0.05;

P(Day3-Cloudy)= max{ P(Day2-Sunny)*0.375,  P(Day2-Cloudy)*0.125, P(Day2-Rainy)*0.625} *0.25;

P(Day3-Rainy)= max{ P(Day2-Sunny)*0.125,  P(Day2-Cloudy)*0.625, P(Day2-Rainy)*0.375} *0. 05;

Choosemax{ P(Day3-Sunny) , P(Day3-Cloudy), P(Day3-Rainy)},得到 P(Day3-Rainy)最大,得出第3天Rainy的概率最大。

(3)代码实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* 题目描述:给定一个观察序列O=O1O2...OT,和模型μ=(A,B,π),
如何快速有效地选择在一定意义下“最优”的状态序列Q=q1q2...qT,
使该状态最好地解释观察序列。
下面a是状态转移矩阵; b是发射矩阵,list 是观察序列;
*/
const int HID_STATUSES = 3;  // 隐藏的状态个数
const int VIS_ST = 4;        // 观察到的实际所有可能的情况(状态)个数
const int N = 3;             // 观察的天数(序列长度)
int main()
{
    float a[HID_STATUSES][HID_STATUSES] = {{0.5,0.375,0.125},{0.25,0.125,0.625},{0.25,0.375,0.375}};//状态转移矩阵
    float b[HID_STATUSES][VIS_ST] = {{0.6,0.2,0.15,0.05},{0.25,0.25,0.25,0.25,},{0.05,0.10,0.35,0.50,}};//b是发射矩阵
    float ini[HID_STATUSES] = {0.63,0.17,0.20};// 初始的
    float result[N][HID_STATUSES];
    int list[N] = {0,2,3};// 测试用的观察到的状态序列,4天的观测值;由于就有2中观察状态,所以用
    // 0 和 1 区分,实际中应该是input的,以及观察的天数也是input的或者read file
    int max[N][HID_STATUSES];
    float tmp;
    int i,j,k;
    //step1:Initialization,其中{0.2,0.4,0.4} 是π
    for(i=0;i<HID_STATUSES;++i)
    {
        result[0][i] = ini[i]*b[i][list[0]];
    }

    int count = 1, max_node;// count 是list的下标,从1开始,第一天是step1已经初始化
    float max_v;
    //step2:归纳运算 ,i 从1开始,应为step1已经初始化了
    for (i=1; i<N; i++)
    {
        for(j=0; j<HID_STATUSES; j++)
        {
            tmp = result[i-1][0] * a[0][j] * b[j][list[count]];
            max[i][j] = 0;
            for(k=1; k<HID_STATUSES; k++)
            {
                if(result[i-1][k] * a[k][j] * b[j][list[count]] > tmp)
                {
                    tmp = result[i-1][k] * a[k][j]* b[j][list[count]];
                    max[i][j] = k;
                }
               result[i][j] = tmp;
            }
            max_v = result[N-1][0];
            max_node = 0;
            for (k=1; k<HID_STATUSES; k++)
            {
                if(result[N-1][k] > max_v)
                {
                    max_v = result[N-1][k];
                    max_node = k;
                }
            }
        }
        count += 1;
    }
    //step3:终结
   for (i=0; i<N; i++)
    {
        for(j=0; j<HID_STATUSES; j++)
        {
            printf("%d %d     %f\n",i+1,j+1,result[i][j]);

        }
    }
    printf("Pmax= %f\n", max_v);
    printf("step%d: %d   \n",N,max_node+1);
    //step4:回溯
    for(k=N-1; k>=1; k--)
    {
        printf("step%d: %d  \n",k, max[k][max_node]+1);
        max_node = max[k][max_node];
    }
    return 0;
}

(4)运行结果:

时间: 2024-10-29 00:19:46

大数据之道 HMM系列的相关文章

大数据之道 HMM系列&lt;二&gt;(成长)

一:HMM解码问题 (1)编程深处无非就是算法和结构,以及各种架构和版本的管理(如Git管理),因此作为程序员算法这一关是绕不过去的: (2)关于算法,个人比较崇尚的一本书是<算法导论>和ACM实战系类的算法培训: (3)对于自然语言处理领域或者部分机械学习领域的算法,HMM模型是非常经典的算法之一,非常适合初学者学习和研究: (4)HMM模型μ=(A,B,π),的状态是不可见的,我们看到的仅仅是状态表现出来的观察值和状态概率函数. 二:HMM简介(u = {N,M,A,B,pai} ---&

世界杯中的大数据之道

让世界球迷翘首以盼的世界杯,在热情的桑巴舞和全世界球迷的欢呼中如期而至.在此期间,无论是资深球迷还是伪球迷,甚至是压根不看球的普通人,对于世界杯,都必然提及一二,这俨然成为了世界的节日,一个万众期待的狂欢party.随着移动互联的高度普及和发展,“社交足球”似乎踢得比世界杯还火热,各种渠道,各种工具,让世界杯也不可避免的跨入了“大数据时代”. 数据与世界杯的关系,除了球员的射门次数.传球次数.球队全场控球率等技术统计,还能怎样体现呢?用数据来展示球队,回顾比赛历史,区别球员表现已习以为常,但这些

好程序员大数据教程分享Scala系列之Option_偏函数_String

好程序员大数据教程分享Scala系列之Option_偏函数_StringOption类型在Scala中Option类型样例类用来表示可能存在或也可能不存在的值(Option的子类有Some和None).Some包装了某个值,None表示没有值. object OptionDemo {def main(args: Array[String]) {val map = Map("a" -> 1, "b" -> 2)val v = map.get("b

好程序员大数据教程分享Scala系列之模式匹配和样例类

好程序员大数据教程分享Scala系列之模式匹配和样例类1.样例类在Scala中样例类是一中特殊的类,样例类是不可变的,可以通过值进行比较,可用于模式匹配.定义一个样例类:1.构造器中每一个参数都是val,除非显示地声明为var 2.伴生对象提供apply ,让你不使用new关键字就能构造出相应的对象case class Point(x: Int, y: Int)创建样例类对象:val point = Point(1, 2)val anotherPoint = Point(1, 2)val yet

《大数据的“道”“术”“释”》----读书摘录+思考

大家不要忘记以道御术,只有明确什么是优秀的数据分析,才能使这些武器发挥出效力!                       -----题记 这本书是看到我老师(大数据营销课)的朋友圈推荐才买的,看了一下目录,比较喜欢.就认真的读了下去,这不是一本讲什么是大数据的书,而是一本为什么要用到大数据分析的书.这本书的好处是讲为什么,而不是讲是什么?是什么好讲,为什么难讲?同时,这本书符合我看书,买书的习惯.因为现代社会,知识碎片化,我们每天接收到的信息大量,如何甄别对于我们来说是尤其重要的,感觉也特别适

大数据之环境准备系列 ——第二篇 新装VMware 虚拟机 网络配置(NAT模式)

新安装虚拟机,需要配置网络环境,才可以使用ssh客户端(如xshell)远程登录 和 虚拟机访问Internet. 一. WMware 软件配置 WMware版本号:11.0.0 build-2305329 1  进入虚拟网络配置界面 菜单栏,点击编辑,之后点击 虚拟网络配置器(N),进入虚拟网络配置界面 2 配置NAT网卡 (1)从上部列表选择 类型为NAT 模式的虚拟网卡 (2)VMnet信息 部分 点击 NAT 设置,设置网关IP (3)配置虚拟网络编辑窗口其他内容,子网IP 和 子网掩码

遇见大数据可视化:基础研究

近日星巴克与微信推出的社交礼品功能"用星说",可以说刷遍了朋友圈.无论你爱不爱喝咖啡,星巴克似乎都成为了一种文化象征.上班族青睐,小清新喜欢,基本上大家看到绿色的人鱼标志就能马上认出它来. 虽然一直也有喝咖啡的习惯,但至今不知道星巴克菜单版上列的[摩卡].[拿铁].[美式].[卡布奇诺]等等有什么区别.直到看到下列图,才很直观的了解到每个咖啡类别的区别是什么. 类似上图示,针对内容复制,难以形象表达的信息,通过图形简单清晰地向受众呈现出来,这种图称之为信息图. 信息图 信息图本身是一个

大数据架构和模式(一)——大数据分类和架构简介

概述 大数据可通过许多方式来存储.获取.处理和分析.每个大数据来源都有不同的特征,包括数据的频率.量.速度.类型和真实性.处理并存储大数据时,会涉及到更多维度,比如治理.安全性和策略.选择一种架构并构建合适的大数据解决方案极具挑战,因为需要考虑非常多的因素. 这个 “大数据架构和模式” 系列提供了一种结构化和基于模式的方法来简化定义完整的大数据架构的任务.因为评估一个业务场景是否存在大数据问题很重要,所以我们包含了一些线索来帮助确定哪些业务问题适合采用大数据解决方案. 从分类大数据到选择大数据解

大数据架构和模式(三)——理解大数据解决方案的架构层

摘要:大数据解决方案的逻辑层可以帮助定义和分类各个必要的组件,大数据解决方案需要使用这些组件来满足给定业务案例的功能性和非功能性需求.这些逻辑层列出了大数据解决方案的关键组件,包括从各种数据源获取数据的位置,以及向需要洞察的流程.设备和人员提供业务洞察所需的分析. 概述 这个 “大数据架构和模式” 系列的 第 2 部分 介绍了一种评估大数据解决方案可行性的基于维度的方法.如果您已经使用上一篇文章中的问题和提示分析了自己的情况,并且已经决定开始构建新的(或更新现有的)大数据解决方案,那么下一步就是