美文网首页
4-pgmpy-扩展推理方法

4-pgmpy-扩展推理方法

作者: 梦想成为小仙女 | 来源:发表于2019-04-06 20:37 被阅读0次

    简单的说就是自己给pgmpy模型添加新的功能,这里目标,实现方法,经验总结

    3.jpg

    在运行的时候就发现了问题,是因为源代码导入的product包没有了

    0.重点

    • 迭代器
    • 可迭代对象
      一类是集合数据类型,如list、tuple、dict、set、str等;
      一类是generator,包括生成器和带yield的generator function。
      这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
      可以使用isinstance()判断一个对象是否是Iterable对象:
      ---------廖雪峰
    • 迭代器
      而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。
      可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
      可以使用isinstance()判断一个对象是否是Iterator对象:
      ---------廖雪峰
    • 可迭代对象和迭代器的关系
      • 生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
        把list、dict、str等Iterable变成Iterator可以使用iter()函数:
      • Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。
        Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。
        • 凡是可作用于for循环的对象都是Iterable类型;
          凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
          集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
    • 元祖(python)
      元组(tuple)与列表类似,不同之处在于元组的元素不能修改。元组写在小括号 () 里,元素之间用逗号隔开。
      元组中的元素类型也可以不相同
    • 列表(python)
      List(列表) 是 Python 中使用最频繁的数据类型。
      列表可以完成大多数集合类的数据结构实现。列表中元素的类型可以不相同,它支持数字,字符串甚至可以包含列表(所谓嵌套)。
      列表是写在方括号([])之间、用逗号分隔开的元素列表。
      和字符串一样,列表同样可以被索引和截取,列表被截取后返回一个包含所需元素的新列表。
    • 集合(python)
      集合(set)是一个无序的不重复元素序列。
      可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
      ------菜鸟教程
      Python 3.x中的set特征与数学中类似。我们之前学过list、tuple以及dict。其实,set与dict大致相同,但set没有Value,只有key。因此,set只是一组key的集合。由于key不能重复,所以,在set中,没有重复的key。
      -------SmallWZQ
    • 生成器
      通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
      所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
      --------廖雪峰

    一.目标

    这里我们要给pgmpy添加新的推理算法,我们会将模型参数边缘化得到需要的查询结果

    二.实现方法

    1.一个简单的精确推理算法
    - itertools库的chain方法
    
    image.png
    - *self.factors.values()
    http://pgmpy.org/factors.html#module-pgmpy.factors.discrete.DiscreteFactor
    self.factors是字典结构的数据,key(节点):[该节点的相关因子]
    - factor_product:
    image.png
    - factor_reduce
    image.png
    - normalize:
    image.png
    - DiscreteFactor:
    image.png
    - marginalize:
    image.png
    - state:
    image.png
    - set
    image.png
    简单的说就是传入贝叶斯模型,观测节点和证据节点,然后执行一下操作:
    1.将所有参数数组合并成一个迭代器(可以简单的理解为将所有参数竖着排列)
    2.然后将所有值进行笛卡尔积运算得到联合概率分布
    3.设置联合概率分布中的证据节点,对其进行降级
    4.对降级后的结果进行归一化处理
    5.得到除去观察节点和证据节点
    6.对剩下的节点进行边缘化处理
    7.返回一个只有观测节点和已知证据节点的条件概率分布
    2.定义一个模型

    简单的说分为三步

    • 创建模型结构
    • 定义节点条件概率表
    • 将条件概率表与模型结合
    3.在定义的模型上推理

    简单的说分为三步

    • 将定义好的模型传递给刚刚创建的类
    • 调用类中的query方法,并传递观测节点和证据节点
    • 输出返回的结果

    三.总结

    相关文章

      网友评论

          本文标题:4-pgmpy-扩展推理方法

          本文链接:https://www.haomeiwen.com/subject/iobppqtx.html