В этом примере показано, как использовать Матрицу Лапласа графика для вычисления вектора Фидлера. Вектор Фидлера может использоваться, чтобы разбить график на две подграфики.
Загрузите набор данных barbellgraph.mat
, который содержит разреженную матрицу смежности и координаты узла графика штанги.
load barbellgraph.mat
Постройте график с помощью пользовательских координат узла xy
.
G = graph(A,'omitselfloops'); p = plot(G,'XData',xy(:,1),'YData',xy(:,2),'Marker','.'); axis equal
Вычислите Матрицу Лапласа графика. Затем вычислите два собственных значений наименьшей величины и соответствующие собственные вектора, используя eigs
.
L = laplacian(G);
[V,D] = eigs(L,2,'smallestabs');
Вектор Фидлера является собственным вектором, соответствующим второму наименьшему собственному значению графика. Наименьшее собственное значение равно нулю, что указывает на то, что график имеет один связный компонент. В этом случае второй столбец в V
соответствует второму наименьшему собственному значению D(2,2)
.
D
D = 2×2
10-3 ×
0.0000 0
0 0.2873
w = V(:,2);
Нахождение вектора Фидлера с помощью eigs
масштабируема к большим графикам, поскольку вычисляются только подмножество собственных значений и собственных векторов, но для небольших графиков одинаково возможно преобразование Матрицы Лапласа в полное хранилище и использование eig(full(L))
.
Разбейте график на две подграфики с помощью вектора Фидлера w
. Узел назначается подграфу A, если он имеет положительное значение в w
. В противном случае узел присваивается подграфу B. Эта практика называется разрезом знака или разрезом нулевого порога. Разрез знака минимизирует вес разреза, удовлетворяющего верхним и нижним границам от веса любого нетривиального разреза графика.
Разделите график с помощью разреза знака. Подсветите подграфик узлов с w>=0
красным цветом и узлами с w<0
в черном.
highlight(p,find(w>=0),'NodeColor','r') % subgraph A highlight(p,find(w<0),'NodeColor','k') % subgraph B
Для графика штрихового колокола это разбиение делит график хорошо на два равных набора узлов. Однако разрез знака не всегда дает сбалансированный разрез.
Всегда можно разбить график путем вычисления медианы w
и использование его в качестве порогового значения. Это разбиение называется срединным срезом, и оно гарантирует равное число узлов в каждом подграфике.
Можно использовать срединный разрез, сначала сдвинув значения в w
по медиане:
w_med = w - median(w);
Затем разбейте график путем входа w_med
. Для графика штрихового колокола, медиана w
близок к нулю, поэтому эти два разреза производят одинаковые бисекции.
digraph
| graph
| laplacian
| subgraph