無向ツリーを2つのサブツリーに分割しようとしています。それぞれのサブツリーが接続されています。私は、hereのようにFiedlerベクターを使ってこれを行うことができたと私は理解していました。しかし、このプロセスに従うと、結果のサブツリーは接続されません。スペクトル(Fiedlerベクトル)の二分法によって生成されたサブツリーが切断される条件はありますか?
私が二分法を実装するために使用したコードは以下の通りであり、二分できない木はhereと定義されています。
import networkx as nx
from itertools import compress
g = nx.from_dict_of_dicts(broken_g)
def split_graph(graph):
"""Split a graph into two pieces using the Fiedler vector.
See https://en.wikipedia.org/wiki/Graph_partition#Fiedler_eigenvalue_and_eigenvector
"""
assert nx.is_connected(graph), 'must pass connected graph'
fiedler_vec = nx.fiedler_vector(graph, normalized=True, weight=False)
mask_a = fiedler_vec > 0
mask_b = ~ mask_a
subgraph_a_nodes = compress(graph.nodes(), mask_a)
subgraph_b_nodes = compress(graph.nodes(), mask_b)
subgraph_a = graph.subgraph(subgraph_a_nodes)
subgraph_b = graph.subgraph(subgraph_b_nodes)
assert nx.is_connected(subgraph_a) and nx.is_connected(subgraph_b), 'split did not produce connected subgraphs'
return [subgraph_a, subgraph_b]
split_graph(g)
Iが得られたサブツリーのいずれも接続されてこれを実行すると、 - 各サブツリーは、1つまたは2つの大きな連結成分といくつかの単離されたノードを有します。フィードラーベクトルの値をプロットし、孤立ノードを識別することは、次のようになります
地球上でここで何が起こっているの?
お返事ありがとうございます。私はこの質問をより明確にしておくべきですが、私の理解は、この分割方法が接続されたコンポーネントを保証することになっていることです(例えば、[this](http://citeseerx.ist.psu.edu/viewdoc/ download?doi = 10.1.1.592.1730&rep = rep1&type = pdf)論文が主張する)。 この定理が適用されない条件があるか、実装上の何かが間違っているかどうかは疑問です。ありがとう! – DrJSomeday