Я пытаюсь обнаружить сообщества, используя двоичный min cut на графике пользователей. Для этого я пытаюсь использовать вариант метода Фидлера, как показано в статье this. Это, как они оформили его:Min cut using matlab cvx
Теперь я пытаюсь сделать это с помощью пакета CVX в MATLAB. Вот мой код:
tou = ((beta/ (e' * pi1 * e)) * tou1) + (((1 - beta)/(e' * pi2 * e)) * tou2);
n = 6;
cvx_begin
variable y(n)
minimize(y' * tou * y)
subject to
y' * pi1 * y == e' * pi1 * e
y' * pi2 * y == e' * pi2 * e
y' * pi1 * e == 0
y' * pi2 * e == 0
cvx_end
Но он показывает мне следующее сообщение об ошибке:
Disciplined convex programming error:
Invalid constraint: {convex} == {real constant}
Error in ==> cvx.eq at 12
b = newcnstr(evalin('caller', 'cvx_problem', '[]'), x, y, '==');
Error in ==> fiedler at 16
y' * pi1 * y == e' * pi1 * e
Здесь A1 матрица определяется следующим образом:
A1 = [0 3 2 0 0 0; 3 0 3 1 0 0; 2 3 0 0 0 0; 0 1 0 0 4 2; 0 0 0 4 0 3; 0 0 0 2 3 0];
Аналогично A2 = A1.
И pi1 - это матрица, диагональная матрица, значение которой равно сумме всех значений A1 в этой конкретной строке. Поступая таким образом, я получаю
pi1 = [5 0 0 0 0 0; 0 7 0 0 0 0; 0 0 5 0 0 0; 0 0 0 7 0 0; 0 0 0 0 7 0; 0 0 0 0 0 5];
Similary, pi1 = pi2.
И tou1 = pi1 - A1, и tou2 = pi2 - A2.
Может кто-то указать, что именно я делаю неправильно. Это было бы очень полезно. Заранее спасибо !
@Shai quadprog требует, чтобы ограничения были линейными, эти ограничения не являются выпуклыми квадратичными, поэтому OP необходимо будет использовать решатель, который может обрабатывать нелинейные ограничения. – codehippo