字典对象到Pydot的决策树

ono*_*ono 6 python dictionary machine-learning decision-tree pydot

我有一个字典对象:

menu = {'dinner':{'chicken':'good','beef':'average','vegetarian':{'tofu':'good','salad':{'caeser':'bad','italian':'average'}},'pork':'bad'}}
Run Code Online (Sandbox Code Playgroud)

我试图使用pydot与"菜单"数据创建一个图表(决策树).

'晚餐'将是顶级节点,其价值(鸡肉,牛肉等)低于它.参考链接,图形函数有两个参数; 源和节点.

它看起来像这样:

"王"将是"晚餐","主"将是"鸡肉","牛肉"等.

我的问题是:如何访问值中的键?要从这些数据创建一个树,我觉得我需要创建一个循环,检查是否有特定键的值并绘制它.我不确定如何调用任何字典对象的值(如果它不一定被称为'晚餐'或具有尽可能多的元素.).

有关如何绘制图表的任何建议吗?

gre*_*ess 12

使用递归函数

您可能需要考虑使用递归函数(如visit下面的代码中所示,这样您就可以处理一般的嵌套字典.在此函数中,您希望传递一个parent参数来跟踪您的传入节点.请注意,您isinstance用来检查键的字典值是否是自己的字典,在这种情况下,您需要visit递归调用.

import pydot

menu = {'dinner':
            {'chicken':'good',
             'beef':'average',
             'vegetarian':{
                   'tofu':'good',
                   'salad':{
                            'caeser':'bad',
                            'italian':'average'}
                   },
             'pork':'bad'}
        }

def draw(parent_name, child_name):
    edge = pydot.Edge(parent_name, child_name)
    graph.add_edge(edge)

def visit(node, parent=None):
    for k,v in node.iteritems():
        if isinstance(v, dict):
            # We start with the root node whose parent is None
            # we don't want to graph the None node
            if parent:
                draw(parent, k)
            visit(v, k)
        else:
            draw(parent, k)
            # drawing the label using a distinct name
            draw(k, k+'_'+v)

graph = pydot.Dot(graph_type='graph')
visit(menu)
graph.write_png('example1_graph.png')
Run Code Online (Sandbox Code Playgroud)

结果树结构

在此输入图像描述

  • graph.write_png('example1_graph.png'),这个 write_png 函数给我以下错误。谁能帮助我摆脱错误?错误:带有参数 ['-Tpng', 'C:\\Users\\MYPC~1\\AppData\\Local\\Temp\\tmptnelq9i2'] 的“dot”返回代码:1 stdout,stderr:b'' b '格式:无法识别“png”。未找到格式。\r\n也许需要运行“dot -c”(使用安装程序的权限)来注册插件?\r\n' (2认同)
  • 是的,我也遇到了同样的错误,“FileNotFoundError:[Errno 2]“点”在路径中找不到。” (2认同)