简单的说就是自己给pgmpy模型添加新的功能,这里目标,实现方法,经验总结
在运行的时候就发现了问题,是因为源代码导入的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对象。
- 凡是可作用于for循环的对象都是Iterable类型;
- 生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是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方法,并传递观测节点和证据节点
- 输出返回的结果
网友评论