翻译自【https://www.cs.ubc.ca/~schmidtm/Software/UGM/small.html】

在这个demo中,我们使用一个非常简单的无向图模型(UGM)来表示一个简单的概率场景,来说明怎样把模型应用于无向图中,怎样在模型里实现解码,推理以及采样。

学生作弊案

这里有四个学生需要做两场多项选择的测试,Cathy,Heather,Mark和Allison。第一场测试中,四名学生被分在了不同的房间。由于Heather和Alllison平时学习认真,因此在这场测试中获得了90%的正确率;而学习不认真的Cathy和Mark则只有25%的准确率。

我们可以假设,学生答对某个题目的概率是和该题无关的(学生答题准确率并非因为题目难度不同,Allison和Heather也并没有因为平时总是一起学习而犯下相同的错误)。如果我们假设在该情况下有100道独立的题目,那么结果有可能如下所示:

这里每一行代表一个题目,每一列代表学生中的某一个,从左到右顺序分别是Cathy(1),Heather(2),Mark(3)和Allison(4)。蓝色表示答案正确,红色表示答案错误。

在第二场考试中,这四名学生被分到了同一个考场。座位顺序为Cathy-Heather-Mark-Allison,相邻的学生之间可以看到彼此的答案。Cathy和Mark认为Allison和Heather认真准备了该厂考试(确实如此),Allison和Heather认为Cathy和Mark也认真学习了(实际上并没有),因此,每个人都认为身边的同学的答案都可能是正确的。下面是我们为该模型构建的图:

由于每个人都可以看见自己临近同学的答案,并且认为该答案包含了一些和该问题相关的信息,因此,该学生的答案不再独立,有了依赖。世界死啊好难过,所有学生的答案都是相互依赖的。尽管Mark和Cathy并不相邻,但是由于他们都坐在Heather附近,因此他们的答案也是相互历来的,因此在图中存在这一条连接这两个节点的路径。在UGMs中,我们说,如果两个节点中存在一条路径,那么这两个变量就是互相依赖的。因此在当前问题中(实际上在很多实际应用中),没有变量是独立的。

但是,尽管没有一个变量是独立的,但是问题中仍然存在条件独立性。比如,如果我们知道了Heather的答案作为给定条件,那么Mark和Cathy的答案会独立于这个给定的信息。在UGMs中,如果我们移除了某个条件变量之后这两个变量互相独立,那么我们说两个变量是条件独立的。在当前问题中,我们移除了Heather这个节点之后,Mark和Cathy之间就再无关联了。

成对的无向图模型

考虑到上文所述依赖和条件依赖,我们使用成对的UGM构建一个模型。

在成对的UGMs中,对于某个特定任务中的所有变量xi的联合概率可以使用一组非负势函数的归一化乘积来表示如下:

对于每一个节点i,和每一条边e,都有一个势函数。在该例中,节点表示独立的学生(‘Cathy’,‘Heather’,‘Mark’,‘Allison’),在相邻节点之间则定义了边连接(‘Cathy-Heather’,‘Heather-Mark’,‘Mark-Allison’)。注意,这里仅在有直接连接的节点之间设置了边,通过中间变量进行连接的节点之间没有边连接。

节点势函数ϕi\phi_{i}ϕi​,对于每一个随机变量XiX_iXi​的可能值都给出了一个非负的权值。比如我们可以设定ϕi(′wrong′)=0.75\phi_{i}('wrong')=0.75ϕi​(′wrong′)=0.75,ϕi(′right′)=0.25\phi_{i}('right')=0.25ϕi​(′right′)=0.25,这表示节点1为‘wrong’的状态的相比于为‘right’的状态有着更高的势。同样,边势函数ϕe\phi_eϕe​给出了对于边XejX_{e_j}Xej​​和XekX_{e_k}Xek​​的所有组合的非负权重。比如在上述案例中,相邻的学生之间有着更高的可能性会给出相同的答案,因此,当XejX_{e_j}Xej​​和XekX_{e_k}Xek​​相同时我们会给出该边更大的势。

归一化常数项ZZZ是个标量值,使得该联合概率分布和为1,即

该归一化常数项保证了模型定义了一个有效的概率分布。

给定了图结构和势,UGM包含了三个任务的函数:
1.Decoding解码:找到有着最高概率的变量联合配置
2.Inference推理:计算归一化项ZZZ,以及每种状态下每个变量的概率
3.Sampling采样:根据概率分布生成每个变量的联合配置

UGM同样也包括了参数

估计函数,计算势的任务能够最大化数据集的似然。后面的demo中会对其进行介绍,本demo中我们假设势函数已经给定。

边结构

在使用任何UGM姐都的第一步都是定义边结构,因为边结构保存了图结构的信息。为了生成边结构,我们简单将该函数命名为UGM_makeEdgeStruct,有两个参数:邻接矩阵以及每个变量的状态数。在该案例中,我们有4个节点,每个节点有两种状态(‘right’和’wrong’)。邻接矩阵为对称矩阵,如果节点i和节点j之间有连接的话,那么矩阵中的元素(i,j)值置为1。在Matlab里,我们定义边缘结构如下:

//construct the edgeStruct
nNodes = 4;
nStates = 2;
adj = zeros(nNodes,nNodes);
adj(1,2) = 1;
adj(2,1) = 1;
adj(2,3) = 1;
adj(3,2) = 1;
adj(3,4) = 1;
adj(4,3) = 1;
edgeStruct = UGM_makeEdgeStruct(adj,nStates);

edgeStruct的定义是为了解决以下三个问题:
1.通过edgeStruct.nStates查找一个节点的关联状态数
2.通过edgeStruct.edgeEnds查找一条边关联的所有节点
3.通过UGM_getEdges查找一个节点关联的所有边
edgeStruct.nStates是一个简单矢量,用于表示每个节点的状态数。在该案例中,该矢量表示为:

//状态矢量
edgeStruct.nStates
ans =2222

即每个节点都有两种状态。

edgeStruct.edgeEnds矩阵是一个边数x2的矩阵,每一行给出了每条边的两个节点。在该案例中,该矩阵表示如下:

edgeStruct.edgeEnds
ans =1     22     33     4

指定边2,可以获得与其相关的节点,即

edge = 2;
edgeStruct.edgeEnds(edge,:)
ans =2     3

函数UGM_getEdges使用edgeStruct.V 和edgeStruct.E矢量指针来快速实现相反操作。即我们可以根据给定节点来找到与其相连的边:

n = 3;
edges = UGM_getEdges(n,edgeStruct)
edges =23

由上述说明,我们可以使用下述操作来获得某个节点的相邻节点:

nodes = edgeStruct.edgeEnds(edges,:);
nodes(nodes ~= n)
ans =24

上述说明和节点3相邻的节点是2和4。

nodePot

在无向图模型中,节点势是存储在一个nNodes x nStates的矩阵中的,该矩阵叫做nodePot。

edgePot

UGM代码中使用一个nStates x nStates的矩阵来表示边势函数,该矩阵叫做edgePot。对于每条边,edgePot给出了一个nStates x nStates的表格来说明两个节点的状态混合表示。在该案例中,我们认为相邻的两个节点有着相同状态的势是不同状态的势的两倍,如下:

n1\n2 right wrong
right 2/6 1/6
wrong 1/6 1/6

和节点势类似,我们可以对其进行全局归一化,将其写为如下形式:

maxState = max(edgeStruct.nStates);
edgePot = zeros(maxState,maxState,edgeStruct.nEdges);
for e = 1:edgeStruct.nEdgesedgePot(:,:,e) = [2 1 ; 1 2];
end

Decoding

decoding任务是找到最有可能的配置。
对应于表格中的prodPot列里最大的值。即根据几个势能够得到的具有最大概率的节点状态排列。这个最大概率是通过对于所有排列进行归一化计算所得的。

Inference

inference任务则是找到归一化常量Z,以及独立节点为某个独立状态时的边界概率。

比如,我们这里定义一个inference任务为计算Mark得到正确答案的频率(how often)?第一次测试中,这个数值为25%。在第二次测试中,我们将所有Mark答案正确的排列的prodPot值相加然后除以Z来进行归一化。这里得到的值为0.49/因此,Mark在测试2中得到正确答案的概率是测试1中的将近2倍。Cathy也一样,她的边界概率增长到0.36。她没能达到和Mark一样大的增长是因为她只有一个学霸邻居,同理,Allison和Heather的边界概率均有所下降。

这里我们需要理解decoding和inference的区别。在decoding的计算中,四人最可能的答案排列中,Mark是得到了正确的答案,但是,在inference中,我们知道,Mark是有51%的概率出错的。这说明,最可能的结果排列可能并不总是和最可能出现的状态一致的。

一个小的UGM的Demo相关推荐

  1. 一个小实例——借书Demo

    一个小实例--借书Demo Step 1 布局文件 Step 2 初始化控件 Step 3 初始化数据 第一步 创建数据model 第二步 初始化数据 Step 4 添加监听器 实现基本功能 Step ...

  2. java线程间通信:一个小Demo完全搞懂

    版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.从一个小Demo说起 上篇我们聊到了Java多线程的同步 ...

  3. Esp8266 进阶之路20 【高级篇】深入学习esp8266的esp now模式组网,仿机智云做一个小网关,实现无需网络下轻松彼此连接通讯交互数据。(附带Demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...

  4. springboot mybatis easyui 整合的一个小demo

    springboot mybatis easyui 整合的一个小demo 这是最终完成界面 话不多说 开整! 这是项目结构 数据库 表结构和数据库 (有点乱 之前本来是个正经图书表的 = =.) /* ...

  5. cuda编程与gpu并行计算(三):一个小demo了解cuda基本语法

    gpu程序的一般步骤 CPU分配空间给GPU(cudaMalloc) CPU复制数据给GPU(cudaMemcpy) CPU加载kernels给GPU做计算(Kernel核: 可以理解为C/C++中的 ...

  6. windows环境下使用clion引入eigen库并实现一个小demo

    本文仅作个人记录用,之前未接触过C++,也没有使用过clion和cmake,不喜勿喷. 首先下载clion,mingw并配置相关环境,安装cmake,这部分比较简单,没有遇到什么问题. 接下来新建一个 ...

  7. java线程间通信_java线程间通信:一个小Demo完全搞懂

    版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.从一个小Demo说起 上篇我们聊到了Java多线程的同步 ...

  8. cocos 时间函数需要什么引用_Cocos实战篇[3.4]——仿COC的一个小Demo总结

    [唠叨] 今天结束了本学期任务最为艰巨的项目实训课程,由于项目组里其他成员基本都已经找到实习了,然后他们都去实习了.只留下我和一个小伙伴在一起搞项目实训的小游戏.经过一个月与小伙伴的配合开发,做了一个 ...

  9. 电商总结(八)如何打造一个小而精的电商网站架构

    前面写过一些电商网站相关的文章,这几天有时间,就把之前写得网站架构相关的文章,总结整理一下.把以前的一些内容就连贯起来,这样也能系统的知道,一个最小的电商平台是怎么一步步搭建起来的.对以前的文章感兴趣 ...

最新文章

  1. 容器,对象生命周期管理的基石
  2. 遗传算法对于神经网络的优生优育
  3. conda create -n python 3.6_conda创建python环境
  4. 03_MyBatis基本查询,mapper文件的定义,测试代码的编写,resultMap配置返回值,sql片段配置,select标签标签中的内容介绍,配置使用二级缓存,使用别名的数据类型,条件查询ma
  5. leetcode 395. Longest Substring with At Least K Repeating Characters| 395. 至少有 K 个重复字符的最长子串(分治法)
  6. [PAT乙级]1007 素数对猜想
  7. ORACLE1.8-序列
  8. if or函数套用_excel常用函数用法解析第二篇——SUMPRODUCT、AND、OR、IF函数
  9. 《算法图解》高清PDF版
  10. Java网络聊天室系统的设计与实现
  11. 虚拟机ip地址怎么设置
  12. android Logcat打印格式说明
  13. 取消Excel里面全部超级链接
  14. SQL(oracle)常用命令
  15. 微信朋友圈分享、QQ分享
  16. PhotoShopCS6安装及其破解【带资源免费】
  17. Java实现动态切换数据源
  18. 雷环捷:回溯中国早期人工智能哲学研究
  19. c++课设 _ 保卫萝卜
  20. Linux下安装tuned以使用tuned-adm命令优化Linux系统性能

热门文章

  1. 微信点击链接:debugx5.qq.com提示您使用的不是x5内核
  2. theHarvester使用
  3. 游戏任务设计(4):Puzzle、Challenge和任务叙事
  4. 哔哩哔哩php开发工作怎么样,[上海] [哔哩哔哩]-努力寻求[PHP /C++/Andro/iOS/前端开发工程师]-会是你吗?...
  5. 如何学习微信公众平台开发?
  6. php中文的正则表达式_php 正则表达式匹配中文汉字
  7. Android 仿照微信查看大图
  8. @Value 读取 map
  9. WebDAV之葫芦儿·派盘+纯纯写作
  10. java 删除 指定图片_java删除服务器上指定图片