2017-03-27 2 views
0

Ich habe eine lineare SVM auf einem großen Datensatz durchgeführt, aber um die Anzahl der Dimensionen zu reduzieren, führte ich eine PCA durch, dann führte die SVM eine Teilmenge der Komponentenwerte durch (die ersten 650 Komponenten erklärten 99,5% der Varianz). Jetzt möchte ich die Entscheidungsgrenze im ursprünglichen Variablenraum unter Verwendung der Beta-Gewichte und der Verzerrung von der im PCA-Raum erstellten SVM plotten. Aber ich kann nicht herausfinden, wie man den Verzerrungsterm von der SVM in den ursprünglichen Variablenraum projiziert. Ich habe eine Demo mit den Fischer Irisdaten geschrieben zu veranschaulichen:Wie Entscheidungsgrenze von linearen SVM nach PCA in Matlab?

clear; clc; close all 

% load data 
load fisheriris 
inds = ~strcmp(species,'setosa'); 
X = meas(inds,3:4); 
Y = species(inds); 
mu = mean(X) 

% perform the PCA 
[eigenvectors, scores] = pca(X); 

% train the svm 
SVMModel = fitcsvm(scores,Y); 

% plot the result 
figure(1) 
gscatter(scores(:,1),scores(:,2),Y,'rgb','osd') 
title('PCA space') 

% now plot the decision boundary 
betas = SVMModel.Beta; 
m = -betas(1)/betas(2); % my gradient 
b = -SVMModel.Bias;  % my y-intercept 
f = @(x) m.*x + b;  % my linear equation 
hold on 
fplot(f,'k') 
hold off 
axis equal 
xlim([-1.5 2.5]) 
ylim([-2 2]) 

% inverse transform the PCA 
Xhat = scores * eigenvectors'; 
Xhat = bsxfun(@plus, Xhat, mu); 

% plot the result 
figure(2) 
hold on 
gscatter(Xhat(:,1),Xhat(:,2),Y,'rgb','osd') 

% and the decision boundary 
betaHat = betas' * eigenvectors'; 
mHat = -betaHat(1)/betaHat(2); 
bHat = b * eigenvectors'; 
bHat = bHat + mu; % I know I have to add mu somewhere... 
bHat = bHat/betaHat(2); 
bHat = sum(sum(bHat)); % sum to reduce the matrix to a single value 
% the correct value of bHat should be 6.3962 

f = @(x) mHat.*x + bHat; 
fplot(f,'k') 
hold off 

axis equal 
title('Recovered feature space') 
xlim([3 7]) 
ylim([0 4]) 

Alle Hinweise, wie ich die Berechnung Bhat falsch wäre sehr willkommen.

+0

der richtige y-Abschnitt ist 'b = -SVMModel.Bias/betas (2)' –

Antwort

0

Nur für den Fall, dass jemand anderes auf dieses Problem stößt, ist die Lösung der Bias-Begriff kann verwendet werden, um die y-intercept, b = -SVMModel.Bias/betas(2) zu finden. Und der y-Abschnitt ist nur ein weiterer Punkt im Raum [0 b], der durch inverse Transformation durch die PCA wiederhergestellt/nicht rotiert werden kann. Dieser neue Punkt kann dann verwendet werden, um die lineare Gleichung y = mx + b (d. H. B = y - mx) zu lösen. So sollte der Code sein:

% and the decision boundary 
betaHat = betas' * eigenvectors'; 
mHat = -betaHat(1)/betaHat(2); 
yint = b/betas(2);     % y-intercept in PCA space 
yintHat = [0 b] * eigenvectors';  % recover in original space 
yintHat = yintHat + mu;  
bHat = yintHat(2) - mHat*yintHat(1); % solve the linear equation 
% the correct value of bHat is now 6.3962 
Verwandte Themen