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.
der richtige y-Abschnitt ist 'b = -SVMModel.Bias/betas (2)' –