zoukankan      html  css  js  c++  java
  • 图模型初识

    图模型初识

    认识

    图模型, 分为两种, 有向图模型(direct model) vs 无向图模型. 通常对于有向图模型, 我们也称为 Beyesian Network (贝叶斯网络)

    有向图

    假设一个常见的有向图, 通常是根据业务场景提前所定义好的(变量间的关系已知):

    a -> c; b-> c;

    c -> d; d -> e

    也表达了一种先后关系

    对于这样的有向图来说, 是非常容易写出其 联合概率 的:

    (p(a,b,c,d,e) = p(a) p(b) p(c|a,b) p(d|c) p(e|d))

    好像理解了为啥条件概率要 用 "|", 左侧写结论, 右侧写条件....因为很符合常识呀, 从左到右...

    通过这种条件概率的方式还是比较好表示这种图元素关系的, 再比如:

    a -> c; b -> c;

    c -> e; d -> e;

    同样的方法来表示其联合概率为:

    (p(a,b,c,d,e) = p(a) p(b) p(c|a,b) p(e|c, d))

    无向图

    举个小的案例, 就图像分割吧.

    图像的其实就是一个个的像素点, 可能明显地能分成3簇, 或者4簇, 不确定, 根据像素点间的距离来"聚类", 越相邻则当做一类, 这样无序地连接起来就是有一个无向图的过程呀, 然后就将图片分割成几个"大块"了.

    假设有这样一个无向图:

    a --- c

    a ----b ----d ----e

    f ---d; f ---e

    同样, 这个联合概率, 应该咋写呢? 不能用条件概率了, 因为没有方向不明确了.

    对于此种情况, 可以定义一个能量函数 (energy function), 它其实意味着, 不同变量之间, 共同出现的概率大小 或是 紧密度 或 相关性有多少.

    基于此, 可以对无向图进行一个变量划分, 分为一簇一簇的(两两相连), 具体怎么分也是看什么假设的. 就假设吧上面的案例分为 3个簇:

    a, b, c

    b, d

    d, e, f

    则相对于将 (p(a, b, c, d, e, f)) 这个联合概率分解为:

    (phi_1(a,b,c) * phi_2 (b, d) * phi_3 (d,e,f))

    (phi) 可以看作是用来衡量变量之间的紧密度的, 越大就越紧密呀

    也就是 a, b, c, d, e, f 的 紧密度 跟 这 3个 (phi) 的模块 紧密度是相关的, 因此将其相乘 但, 需注意的一点是, 可以将 (phi_1, phi_2, phi_3) 看作是 score_1, score_2, score_3, 但不等于概率哦, 然而, 我们的需求,又是要求出概率, 因此问题在于, 如何将 score 变为我们要的概率呢?

    其实, 就类似于 古典概型 就好了呀. 把每部分加总起来得到一个 总体值, 然后计算部分的占比,作为概率即可, 令:

    (z = sum limits _{a,b,c,d,e,f} phi_1(a,b,c) * phi_2 (b, d) * phi_3 (d,e,f))

    则:

    (p(a, b, c, d, e, f) = frac {1}{z} phi_1(a,b,c) * phi_2 (b, d) * phi_3 (d,e,f))

    通常这个过程也被叫做 Normalization (正规化, 归一化) 的过程, 或者叫 Partition Function.

    这里有一个难点是如何 计算 z ? 如果是离散型, 通常用 动态规划, 连续型, 就用一些近似的估计. 因此可以发现, 在求联合概率的时候,

    • 有向图是通过局部的概率来"拼接"到一起
    • 无向图是根据 score 函数来"拼接"到一起, score 又不是概率, 需要用 z 这种 归一化 来转换

    无向图的核心在于 如何定义 score 函数, 不同的score函数,得到的结果也不同的

    栗子: 定义 score

    假设有一个无向图, 就三角形3个顶点 a, b, c

    为了更直观, 就假设 a, b, c 代表3个不同的人, 需求是看这个 3个老铁, 组队打篮球竞争力如何(概率 0-1)

    然后就相对于一个特征提取

    • a, b, c 是否是一个学院 --> 提取特征 --> f1
    • a, b, c 是否打不同的位置 --> 提取特征 --> f2
    • a, b, c 是否经常一起打球 --> 提取特征 --> f3

    定义 score(a, b, c), 其实就看不同模型的, 比如可以这样

    (score(a, b, c) = w_1 f_1 + w_2 f_2 + w_3 f_3)

    也可以像 CRF 模型那样定义:

    (log score(a, b, c) = sum limits _i w_i f_i)

    这一类也称为 log linear model 如典型的 逻辑回归, CRF 等.

    无向图完全取决于如何定义 score 函数, 从而训练出不同的模型.

    • Naive Beyes 是一个有向图(联合/条件概率) , 当转为无向图, 则 变为了 Logistic Regression
    • HMM (隐马尔可夫) 是一个有向图, 当转为无向图是, 则 变为了 Linear - chain CRFs
    • 贝叶斯网络 -> 无向后 -> General CRFs

    对于无向图其实没有绝对的 分割块的方法, 这也取决于你如何定义, 比如, 我就要以拆分为 配对的形式, 同样是上面的图而言:

    (p(a, b, c, d, e) = frac {1}{z} phi_1(a, c) phi_2(b, c) phi_3(a, b) phi_4(b, d) phi_5(a, c) phi_6(f, d) phi_7(f, e))

    没有固定的方式哦, 完全取决我们的理解和假设. 这个过程是一个提取特征 的过程, 这里的 a, b, c, e, e, f 可以看作是实例(样本) 不是特征变量.

    有向图 vs 无向图

    • 有向图 是 Local Normalization 即归一化是作用在 局部的 (因为, 条件概率嘛, 依赖局部)
    • 无向图 是 Global Normalization 即归一化是作用在 全局的 (因为, z 的求解设计所有的变量, 全局的呀)

    对于模型的影响, 通俗理解就是, 有向图,是类似一个贪心算法, 每次只寻找局部的一个最优解. 而无向图则相当于考虑全局, 会更全面一点.

    这篇呢, 目的就是为了初步认识一下图模型, 同时给 HMM 和 CRF 模型提前预热一波, 至于无向图, 后面再重新来认识一波 逻辑回归就清楚了呀, 不要着急.

  • 相关阅读:
    【强化学习】python 实现 q-learning 例二
    【强化学习】python 实现 q-learning 例一
    python棋类游戏编写入门
    推荐几个表格工具
    【Java并发编程实战】----- AQS(四):CLH同步队列
    【Java并发编程实战】----- AQS(三):阻塞、唤醒:LockSupport
    【Java并发编程实战】----- AQS(二):获取锁、释放锁
    【Java并发编程实战】----- AQS(一):简介
    【Java并发编程实战】-----“J.U.C”:CLH队列锁
    【Java并发编程实战】-----“J.U.C”:CAS操作
  • 原文地址:https://www.cnblogs.com/chenjieyouge/p/12099764.html
Copyright © 2011-2022 走看看