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, это дает:
И я отделил ядро Гаусса следующим образом:
К(х, х') = фи(х)' * фи(х')
Реализация этой мысли такова:
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 напрямую, как указано выше, и не разделяйте его по фи.