В Matlab SVM tutorial, он говоритMatlab SVM функция пользовательского ядра
Вы можете установить собственную функцию ядра, например, ядро, установив «KernelFunction», «ядро». Ядро должно иметь следующий вид:
функция G = ядро (U, V)
где:
U является т-по-р матрицу. V является матрицей n-by-p. G представляет собой матрицу м-на-н Gram из рядов U и V.
Когда я последовал заказ SVM ядро example, я поставил точку останова в функции mysigmoid.m. Однако я нашел, что U и V были фактически 1-на-p-векторами, а G был скаляром.
Почему MATLAB не обрабатывает ядро матрицами?
Моя функция пользовательского ядра
function G = mysigmoid(U,V)
% Sigmoid kernel function with slope gamma and intercept c
gamma = 0.5;
c = -1;
G = tanh(gamma*U*V' + c);
end
Мой Matlab сценарий
%% Train SVM Classifiers Using a Custom Kernel
rng(1); % For reproducibility
n = 100; % Number of points per quadrant
r1 = sqrt(rand(2*n,1)); % Random radius
t1 = [pi/2*rand(n,1); (pi/2*rand(n,1)+pi)]; % Random angles for Q1 and Q3
X1 = [r1.*cos(t1), r1.*sin(t1)]; % Polar-to-Cartesian conversion
r2 = sqrt(rand(2*n,1));
t2 = [pi/2*rand(n,1)+pi/2; (pi/2*rand(n,1)-pi/2)]; % Random angles for Q2 and Q4
X2 = [r2.*cos(t2), r2.*sin(t2)];
X = [X1; X2]; % Predictors
Y = ones(4*n,1);
Y(2*n + 1:end) = -1; % Labels
% Plot the data
figure(1);
gscatter(X(:,1),X(:,2),Y);
title('Scatter Diagram of Simulated Data');
SVMModel1 = fitcsvm(X,Y,'KernelFunction','mysigmoid','Standardize',true);
% Compute the scores over a grid
d = 0.02; % Step size of the grid
[x1Grid,x2Grid] = meshgrid(min(X(:,1)):d:max(X(:,1)),...
min(X(:,2)):d:max(X(:,2)));
xGrid = [x1Grid(:),x2Grid(:)]; % The grid
[~,scores1] = predict(SVMModel1,xGrid); % The scores
figure(2);
h(1:2) = gscatter(X(:,1),X(:,2),Y);
hold on;
h(3) = plot(X(SVMModel1.IsSupportVector,1),X(SVMModel1.IsSupportVector,2),...
'ko','MarkerSize',10);
% Support vectors
contour(x1Grid,x2Grid,reshape(scores1(:,2),size(x1Grid)),[0,0],'k');
% Decision boundary
title('Scatter Diagram with the Decision Boundary');
legend({'-1','1','Support Vectors'},'Location','Best');
hold off;
CVSVMModel1 = crossval(SVMModel1);
misclass1 = kfoldLoss(CVSVMModel1);
disp(misclass1);
Функция ядра имеет фиксированный формат, отображаемый как «mysigmoid». Я не могу напрямую использовать функцию ядра. Он включен в кадр SVM MATLAB, когда я вызываю 'SVMModel1 = fitcsvm (X, Y, 'KernelFunction', 'mysigmoid', 'Standardize', true)'. –
изменить 'G = tanh (gamma * U * V '+ c);' to 'G = tanh (gamma * U' * V + c);' – ABC
Это не решает проблему. В демоверсии мои данные обучения составляют X, матрицу размером 200 x 2, поэтому ожидается, что U и V будут в точности X, а 'G = U * V'' будет матрицей 200 x 200 (матрица Грама). Но теперь U и V равны 1 x 2, поэтому 'U '* V' строит только матрицу 2 x 2, чего я не хочу. –