Linearly Non-Separable Binary Classification Problem
Първо, тази програма не работи правилно за RBF ( gaussianKernel() ) и искам да я поправя.
Това е нелинейна демонстрация на SVM, за да илюстрира класифицирането на клас 2 с прилагане на твърд марж.
Проблемът е около двумерни радиални произволни разпределени данни.
Използвах Quadratic Programming Solver, за да изчисля множителите на Лагранж (алфа)
xn = input .* (output*[1 1]); % xiyi phi = gaussianKernel(xn, sigma2); % Radial Basis Function k = phi * phi'; % Symmetric Kernel Matrix For QP Solver gamma = 1; % Adjusting the upper bound of alphas f = -ones(2 * len, 1); % Coefficient of sum of alphas Aeq = output'; % yi beq = 0; % Sum(ai*yi) = 0 A = zeros(1, 2* len); % A * alpha <= b; There isn't like this term b = 0; % There isn't like this term lb = zeros(2 * len, 1); % Lower bound of alphas ub = gamma * ones(2 * len, 1); % Upper bound of alphas alphas = quadprog(k, f, A, b, Aeq, beq, lb, ub);
- За да реша този проблем с нелинейната класификация, написах някои ядрени функции като гаус (RBF), хомогенни и нехомогенни полиномни ядрени функции.
За RBF внедрих функцията в изображението по-долу:
Използвайки Tylor Series Expansion, той дава:
И разделих ядрото на Gaussian така:
K(x, x') = phi(x)' * phi(x')
Изпълнението на тази мисъл е:
function phi = gaussianKernel(x, Sigma2) gamma = 1 / (2 * Sigma2); featDim = 10; % Length of Tylor Series; Gaussian Kernel Converge 0 so It doesn't have to Be Inf Dimension phi = []; % Kernel Output, The Dimension will be (#Sample) x (featDim*2) for k = 0 : (featDim - 1) % Gaussian Kernel Trick Using Tylor Series Expansion phi = [phi, exp( -gamma .* (x(:, 1)).^2) * sqrt(gamma^2 * 2^k / factorial(k)) .* x(:, 1).^k, ... exp( -gamma .* (x(:, 2)).^2) * sqrt(gamma^2 * 2^k / factorial(k)) .* x(:, 2).^k]; end end
*** Мисля, че внедряването ми на RBF е грешно, но не знам как да го поправя. Моля, помогнете ми тук.
Ето какво получих като изход:
където,
1) Първото изображение: Примери от класове
2) Второто изображение: Маркиране на опорните вектори на класовете
3) Третото изображение: Добавяне на случайни тестови данни
4) Четвъртото изображение: Класификация
Освен това внедрих хомогенно полиномиално ядро " K(x, x') = ( )^2", кодът е:
function phi = quadraticKernel(x) % 2-Order Homogenous Polynomial Kernel phi = [x(:, 1).^2, sqrt(2).*(x(:, 1).*x(:, 2)), x(:, 2).^2]; end
И получих изненадващо хубав резултат:
За да обобщим, програмата работи правилно с помощта на хомогенно полиномно ядро, но когато използвам RBF, тя не работи правилно, има нещо нередно с изпълнението на RBF.
Ако знаете за RBF (Gaussian Kernel), моля, уведомете ме как мога да го направя правилно.
Редактиране: Ако имате същия проблем, използвайте директно дефинирания по-горе RBF и не го разделяйте с phi.