Как реализовать модель soft-margin SVM с использованием quadprog Matlab?
Предположим, нам дан учебный набор данных {yᵢ, xᵢ}
, for i = 1, ..., n
, где yᵢ
может быть -1
или 1
и xᵢ
может быть, например, 2D или 3D точки.
в общем случае, когда входные точки линейно отделимые, модель SVM можно определить следующим образом
min 1/2*||w||²
w,b
С учетом ограничений (для i = 1, ..., n
)
yᵢ*(w*xᵢ - b) >= 1
это часто называют жесткие маржи модель SVM, которым таким образом,задаче условной минимизации, где неизвестные w
и b
. Мы также можем опустить 1/2
функции были сведены к минимуму, учитывая, что это просто константа.
и документация о Матлаб это quadprog
государства
x = quadprog(H, f, A, b)
минимизирует1/2*x'*H*x + f'*x
С учетом ограниченийA*x ≤ b
.A
матрица парных, иb
является вектором двойников.
мы можем реализуйте модель SVM с жестким запасом, используя quadprog
функция, чтобы получить вектор веса w
следующим образом
-
H
становится единичной матрицей. -
f'
становится матрицей нулей. -
A
является левой стороной ограничений -
b
равна-1
потому что исходное ограничение имело>= 1
, становится<= -1
когда мы умножаем с-1
на обоих стороны.
теперь я пытаюсь реализовать софт-маржа модель SVM. Уравнение минимизации здесь
min (1/2)*||w||² + C*(∑ ζᵢ)
w,b
С учетом ограничений (для i = 1, ..., n
)
yᵢ*(w*xᵢ - b) >= 1 - ζᵢ
такое, что ζᵢ >= 0
, где ∑
символ суммирования, ζᵢ = max(0, 1 - yᵢ*(w*xᵢ - b))
и C
это гипер-параметр.
как можно решить эту задачу оптимизации с помощью Matlab's
3 ответов
я не вижу, как это может быть проблемой. Пусть z
быть нашим вектором (2n + 1)
переменные:
z = (w, eps, b)
затем, H
становится диагональной матрицей с первого n
значения по диагонали равны 1
и последний n + 1
равным нулю:
H = diag([ones(1, n), zeros(1, n + 1)])
вектор f
может быть выражена как:
f = [zeros(1, n), C * ones(1, n), 0]'
первый набор ограничений становится:
Aineq = [A1, eye(n), zeros(n, 1)]
bineq = ones(n, 1)
здесь A1
является той же матрицей, что и в primal форма.
второй набор ограничений становится нижними границами:
lb = (inf(n, 1), zeros(n, 1), inf(n, 1))
тогда вы можете вызвать MATLAB:
z = quadprog(H, f, Aineq, bineq, [], [], lb);
если Z = (w; w0; eps)T-длинный вектор с N+1+m элементами.(m количество точек) Затем:
H= diag([ones(1,n),zeros(1,m+1)]).
f = [zeros(1; n + 1); ones(1;m)]
ограничения неравенства могут быть указаны как:
A = -diag(y)[X; ones(m; 1); zeroes(m;m)] -[zeros(m,n+1),eye(m)],
где X-входная матрица n x m в первичной форме.Из 2 частей для A первая часть для w0, а вторая часть для eps.
b = ones(m,1)
ограничения равенства :
Aeq = zeros(1,n+1 +m)
beq = 0
границы:
lb = [-inf*ones(n+1,1); zeros(m,1)]
ub = [inf*ones(n+1+m,1)]
теперь z=quadprog(H,f,A,b,Aeq,beq,lb,ub)
полный код. Идея та же, что и выше.
n = size(X,1);
m = size(X,2);
H = diag([ones(1, m), zeros(1, n + 1)]);
f = [zeros(1,m+1) c*ones(1,n)]';
p = diag(Y) * X;
A = -[p Y eye(n)];
B = -ones(n,1);
lb = [-inf * ones(m+1,1) ;zeros(n,1)];
z = quadprog(H,f,A,B,[],[],lb);
w = z(1:m,:);
b = z(m+1:m+1,:);
eps = z(m+2:m+n+1,:);