🏈指点迷津 | Brief🎯要点
🎯概率论和图论数学形式和图结构 | 🎯数学形式、图结构和代码验证贝叶斯分类器算法:🖊多类型:朴素贝叶斯,求和朴素贝叶斯、高斯朴素贝叶斯、树增强贝叶斯、贝叶斯网络增强贝叶斯和半朴素贝叶斯 | 🖊多维型:贝叶斯链 | 🖊分层型:贝叶斯网络和链式分类器复合式 | 🖊数学形式、图结构和代码验证贝叶斯分类器算法 | 🎯数学形式、图结构和代码验证隐马尔可夫模型算法 | 🎯数学形式、图结构和代码验证马尔可夫随机场模型算法 | 🎯数学形式、图结构和代码验证贝叶斯网络算法:🖊学习树和有向无环图:Chow-Liu 算法、PC 算法 | 🎯数学形式、图结构和代码验证马尔可夫决策过程算法
🎯算法实现: 🖊结构学习算法:爬坡搜索、树搜索、最大-最小爬坡,穷举搜索 | 🖊参数学习算法:最大似然、贝叶斯估计器、期望最大化 | 🖊概率推理算法:变量消除、置信传播、最大乘积线性规划、取样方式 | 🖊因果推理算法:执行操作、调整套
🎯GPU多线程并行概率模型 | 🎯激光通信和-积消息传递算法模拟调制
📜Python和R和MATLAB图形模型用例
📜Python | R | MATLAB群体消息和遗传病筛选多元统计模型
📜Python神经模型评估微分方程图算法
🍪语言内容分比
🍇Python图挖掘潜在关系
PC 算法利用对撞机和有向无环图的原理来挖掘潜在的前后关系,从而快速消除数据集中的不相关链接。然而,由此产生的因果图通常是完整的部分有向无环图,其特点是边缘方向不确定,而不是确定的有向无环图。
在我的方法中,我使用 PC 算法生成一个图,然后利用 NetworkX 的 is_directed
和 is_directed_acyclic_graph
函数来确定该图是否符合有向无环图的条件。通常情况下,我们不会直接获得有向无环图。为了解决不确定的边,我们可以依靠人工干预或先验知识,尽管这需要额外的努力。
探索从酒类数据集开始,包含 178 个条目和 15 个不同的特征,如酒精、苹果酸和类黄酮。
import utils, pc_algorithm, random, copy, statistics
import pandas as pd
import numpy as np
import networkx as nx
from itertools import product
from pgmpy.estimators import BicScore
data = utils.get_data_from_ucirepo(109)
data.info()
labels = data.columns.tolist()
data = np.array(data)
我使用自定义 PC 算法生成完整的部分有向无环图。
graph, sepetated_set = pc_algorithm.pc_get_graph(data)
cpdag_graph = pc_algorithm.pc_apply_rules(graph, sepetated_set)
然后使用 NetworkX 的有向图将完整的部分有向无环图转换为网络图。在此表示中,方向未确定的边标记为红色,突出显示图从完整的部分有向无环图到非有向无环图状态的转变。
network_graph = nx.DiGraph(cpdag_graph)
pos = nx.kamada_kawai_layout(network_graph)
print("Is Directed?: " + str(nx.is_directed(network_graph)))
print("Is DAG?: " + str(nx.is_directed_acyclic_graph(network_graph)))
undirected_edges = {frozenset(i) for i in network_graph.edges() if network_graph.has_edge(*i[::-1])}
edge_colors = ["red" if frozenset(edge) in undirected_edges else "gray" for edge in network_graph.edges()]
nx.draw(network_graph, pos,
edge_color = edge_colors,
width=1,
linewidths = 1,
node_size = 600,
font_size = 6,
node_color="pink",
alpha=0.9,
labels=dict(zip(range(len(labels)), labels)))
当此类边的数量可控时,我们可以从完整的部分有向无环图中枚举所有可能的有向无环图。在本例中,从 128 个潜在配置中,出现了 60 个有效的 有向无环图。
possible_edges = list(product([0, 1], repeat = len(undirected_edges)))
print("All posiible graphs: " + str(len(possible_edges)))
dags = []
for i in possible_edges:
network = nx.DiGraph(cpdag_graph)
for j, k in enumerate(i):
l = [*list(undirected_edges)[j]][0]
m = [*list(undirected_edges)[j]][1]
network.remove_edge(l, m)
network.remove_edge(m , l)
if k == 0:
network.add_edge(l, m)
else:
network.add_edge(m , l)
if nx.is_directed_acyclic_graph(network):
dags.append(network)
print("All DAGs: " + str(len(dags))
下一步是确定这些可能性中最适合的有向无环图。这是使用贝叶斯信息准则实现的,该准则使用 pgmpy 的 BicScore 计算。BIC 得分最低的有向无环图可能是我们数据集底层因果结构的最准确表示。
bic_calculator = BicScore(pd.DataFrame(data))
bics = [bic_calculator.score(i) for i in dags]
nx.draw(dags[bics.index(min(bics))], pos,
edge_color = edge_colors,
width=1,
linewidths = 1,
node_size = 600,
font_size = 6,
node_color = "pink",
alpha=0.9,
labels=dict(zip(range(len(labels)), labels)))
通过这一探索,我们展示了如何将 PC 算法与 NetworkX 结合起来有效地识别复杂数据集中的潜在前后关系。