机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理;“广”在分析多个机器学习模型:决策树、支持向量机、贝叶斯与马尔科夫决策、强化学习等。
详情:机器学习强基计划(附几十种经典模型源码合集)
概率图模型的知识体系非常庞大,在机器人、计算机视觉、推荐系统等领域应用广泛且难度较高,本专栏作为机器学习入门教程重点讲解概率图的基础概念。
本节介绍什么是概率图以及机器学习中的图论基础。
表示、推断和学习是构建智能系统的三个关键组件
机器学习模型都涉及上述三大组件中的至少一种。
概率图模型(Probabilistic Graphical Model, PGM)是以概率论、图论为理论基础,以局部随机变量条件独立性为核心,统一表示、推断、学习三大智能组件的灵活框架。
概率图模型用节点表示一个或一组随机变量,节点之间的边表示随机变量间的概率依赖关系。
贝叶斯网络
;马尔科夫随机场
概率图模型的主要技术总结如下。
图论中的图与欧式几何的概念不同,其主要用于表征某类具体事物及这些事物间的联系。图论的内容非常丰富,不可能通过一篇文章涵盖,以下通过思维导图
的方式介绍最基础的概念,帮助大家快速入门。
无向图(Undirected Graph)定义为一个有序二元组,记为 G = ( V , E ) G=\left( V,E \right) G=(V,E),其中
无向图的基本概念总结如下:
有向图(Directed Graph)基本定义与无向图一致,也是一个有序二元组 G = ( V , E ) G=\left( V,E \right) G=(V,E),只是 E E E中元素称为弧,且对于边 e = < u , v > e=\left< u,v \right> e=⟨u,v⟩,顶点 u u u称为边 e e e的起点或始点, v v v称为边 e e e的终点。
有向图的基本概念总结如下:
树是连通的无圈图,其基本概念总结如下:
基本方法继承自networkx
库,不重复造轮子,但可以扩充或复写一些概率图的方法,比networkx
库更适配机器学习模型,今后算法实验都采用这种方式。
class DAG(nx.DiGraph):
def __init__(self, graph=None):
super(DAG, self).__init__(graph)
# DAG要求是无环图
cycles = []
try:
cycles = list(nx.find_cycle(self))
except nx.NetworkXNoCycle:
pass
else:
out_str = "Cycles are not allowed in a DAG."
out_str += "\nEdges indicating the path taken for a loop: "
out_str += "".join([f"({u},{v}) " for (u, v) in cycles])
raise ValueError(out_str)
添加节点
def addNode(self, node, weight=None):
super(DAG, self).add_node(node, weight=weight)
添加边
def addEdge(self, u, v, weight=None):
super(DAG, self).add_edge(u, v, weight=weight)
network
不提供这种方法,需要我们自己实现。
def plotGraph(self, highlight=None):
from graphviz import Digraph
nodeAttr = dict(
align='left',
fontsize='10',
ranksep='0.1',
height='0.2'
)
graph = Digraph(node_attr=nodeAttr, graph_attr=dict(size="12,12"))
edges = self.edges()
for u, v in edges:
graph.edge(u, v)
# 需要高亮的节点
if highlight:
for node in highlight:
graph.node(node, style='filled', fillcolor='#b693fe')
saveDir = os.path.abspath(os.path.join(__file__, "../../cache"))
graph.view(filename='graph', directory=saveDir)
采用专门的绘图引擎可视化,不管是实验还是科研都非常有用。
完整代码联系下方博主名片获取
更多精彩专栏: