一、BIC算法
在贝叶斯网中,BIC算法是衡量贝叶斯网“有效性”的标准。BIC算法的目的是找到一个能以最短编码长度描述训练数据的模型。
BIC算法的公式如下:
其中,
def draw_net_as_bic(self):
"""按照BIC算法构建贝叶斯网,贪心法,最小化BIC"""
step = 0
while step <= self.max_step:
bic_pre = self.calculate_bic()
bic_best = bic_pre
point_list_pre = self.copy_point_list(self.point_list)
point_list_best = self.copy_point_list(self.point_list)
# 对单个结点遍历修改、删除、增加连线,寻找一个最佳方式,暂时没有好的思路
# 思路1:从属性0到属性6逐个遍历,每次遍历最多只改变结点的一条连线
for i in range(data.attrs_count):
# 能做的只有,增加、删除 1 个子
parents_index = self.point_list[i]['from'].copy()
children_index = self.point_list[i]['to'].copy()
# 增加一个子
for j in range(data.attrs_count):
if j != i and j not in parents_index and j not in children_index:
# 保证不是自己、不是父、不是旧子
self.add_line(i, j)
bic_new = self.calculate_bic()
if bic_new < bic_best:
# 记录最好情况