2015-05-25 2 views
1

В 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); 

ответ

1

Ядра добавить размеры к функции. Если у вас есть, например, одна функция для образца x={a}, она расширит ее примерно на x= {a_1... a_q}. Поскольку вы делаете это для всех своих данных одновременно, у вас будет M x P (M - это количество примеров в вашем учебном наборе, а P - количество функций). Вторая запрашиваемая матрица - это P x N, где N - количество примеров в наборе для обучения/тестирования.

При этом ваш выход должен быть M x N. Так как это 1, это означает, что у вас есть U = 1XM и V=Nx1 где N=M. Для вывода логики M x N следует, что вы должны просто переносить свои входы.

+0

Функция ядра имеет фиксированный формат, отображаемый как «mysigmoid». Я не могу напрямую использовать функцию ядра. Он включен в кадр SVM MATLAB, когда я вызываю 'SVMModel1 = fitcsvm (X, Y, 'KernelFunction', 'mysigmoid', 'Standardize', true)'. –

+0

изменить 'G = tanh (gamma * U * V '+ c);' to 'G = tanh (gamma * U' * V + c);' – ABC

+0

Это не решает проблему. В демоверсии мои данные обучения составляют X, матрицу размером 200 x 2, поэтому ожидается, что U и V будут в точности X, а 'G = U * V'' будет матрицей 200 x 200 (матрица Грама). Но теперь U и V равны 1 x 2, поэтому 'U '* V' строит только матрицу 2 x 2, чего я не хочу. –

Смежные вопросы