11

Pythonでグラフを描くためにpydotを使用しています。決定木を表現したいと思います。たとえば、(a1、a2、a3は属性で、2つのクラスは0と1です。

       a1>3
      /    \
  a2>10    a3>-7
   /  \     /  \
  1    0   1    0

ただし、pydotを使用すると、2つの葉のみが作成され、ツリーは次のようになります(png添付)。

       a1>3
      /    \
  a2>10    a3>-7
      |  X  |
      1     0

さて、この単純なケースではロジックは問題ありませんが、より大きなツリーでは、異なるブランチに属する厄介な内部ノードが統合されます。

私が使用している単純なコードは次のとおりです。

import pydot
graph = pydot.Dot(graph_type='graph')
edge = pydot.Edge("a_1>3", "a_2>10")
graph.add_edge(edge)
edge = pydot.Edge("a_1>3", "a_3>-7")
graph.add_edge(edge)
edge = pydot.Edge("a_2>10", "1")
graph.add_edge(edge)
edge = pydot.Edge("a_2>10", "0")
graph.add_edge(edge)
edge = pydot.Edge("a_3>-7", "1")
graph.add_edge(edge)
edge = pydot.Edge("a_3>-7", "0")
graph.add_edge(edge)
graph.write_png('simpleTree.png')

また、エッジを作成してグラフに追加するのとは異なるノードオブジェクトを作成しようとしましたが、pydotは、新しいノードを作成するのではなく、同じ名前のノードのノードプールをチェックしているようです。

何か案は?ありがとう!

上記のコードで作成された画像

4

2 に答える 2

17

ノードには常に一意の名前が必要です。そうでない場合、ノード間にエッジを付けるために一意の名前を付けることはできません。ただし、各ノードにラベルを付けることができます。これは、レンダリング時に表示されるものです。

したがって、一意のIDを持つノードを追加する必要があります。

graph = pydot.Dot(graph_type='graph')
graph.add_node(pydot.Node('literal_0_0', label='0'))
graph.add_node(pydot.Node('literal_0_1', label='0'))
graph.add_node(pydot.Node('literal_1_0', label='1'))
graph.add_node(pydot.Node('literal_1_1', label='1'))

次に、これらのノードを接続するグラフエッジを追加します。

edge = pydot.Edge("a_2>10", "literal_0_0")
graph.add_edge(edge)
edge = pydot.Edge("a_2>10", "literal_1_0")
graph.add_edge(edge)
edge = pydot.Edge("a_3>-7", "literal_0_1")
graph.add_edge(edge)
edge = pydot.Edge("a_3>-7", "literal_1_1")
graph.add_edge(edge)

定義した残りのエッジとともに、これは次のようになります。

正しいエッジのグラフ

于 2012-10-22T13:55:34.320 に答える
2

「標準的な」答えは、ここで行うuuidように、標準ライブラリのモジュールを使用することです。networkx

idこれは、元のグラフのノードに対応するノード名を作成するために使用するよりも優れています。これは、(理論的には)グラフの作成pydot中にノードオブジェクトが削除された場合、必ずしも一意であるとは限らないためです。対照的に、作成されたオブジェクトは一意で永続的であり、元のノードの寿命とは無関係です。pydotidUUID

pydotただし、これが発生するためには、グラフの作成中に非常に奇妙なことが起こっている必要がありますが、これはかなりありそうもないことです。を使用する利点はid、元のノードからUUIDオブジェクトへのマッピングを作成して渡す必要がないことです(ノードを追加した後、一貫してエッジを作成するため)。

興味深いケースの1つは、ネストされたグラフです。2つの異なるグラフには、networkx(たとえばa)に同じハッシュ可能なオブジェクトが含まれている可能性がありid、ノードで直接使用することはできません。ただし、その場合idでも、(ノード、グラフ)ペアを次のように組み合わせることで使用できますstr(id(node)) + str(id(graph))

于 2014-09-10T02:13:46.257 に答える