Reproduzieren Sie das Projektionsdiagramm der linearen Diskriminanzanalyse


9

Ich habe Probleme mit Projektionspunkten in der linearen Diskriminanzanalyse (LDA). Viele Bücher über multivariate statistische Methoden veranschaulichen die Idee der LDA anhand der folgenden Abbildung.

Abbildung 1

Die Problembeschreibung lautet wie folgt. Zuerst müssen wir die Entscheidungsgrenze zeichnen, eine senkrechte Linie hinzufügen und dann Projektionen von Datenpunkten darauf zeichnen. Ich frage mich, wie ich der senkrechten Linie Projektionspunkte hinzufügen kann.

Anregungen / Hinweise?


2
Obwohl es im 2-Klassen-Fall möglich ist, zuerst eine Entscheidungsgrenze und dann die Diskriminanzachse zu ziehen, ist die tatsächliche Logik von LDA entgegengesetzt. Sie müssen zuerst die Diskriminanzlinie (n) zeichnen. Siehe eine Frage (+ wichtige Links in den Kommentaren darin), wie man Diskriminanten zeichnet. Und über Grenzen: 1 , 2 .
ttnphns

1
Andrej. Extrahieren Sie die Eigenvektoren. Wir wissen, dass die Werte der Diskriminanten (Diskriminanzwerte) von ihnen abhängen. Der entscheidende Punkt ist nun, dass Sie, da Sie Diskriminanzwerte im Raum der (zentrierten) Originalvariablen anzeigen möchten, Diskriminanten als die in diesem Raum gedrehten Originalvariablen konzipieren müssen (genau so, wie wir Hauptkomponenten konzipieren). Rotation ist die Multiplikation der ursprünglichen zentrierten Daten mit einer Rotationsmatrix ...
ttnphns

1
(Forts.) Matrix, welche Spalten die Eigenvektoren sind, kann als Rotationsmatrix angesehen werden, wenn die Summe der Quadrate jeder ihrer Spalten (dh jedes Eigenvektors) einheitennormalisiert ist. Normalisieren Sie also die Eigenvektoren und berechnen Sie die Komponentenwerte als zentrierte Daten multipliziert mit diesen Eigenvektoren.
ttnphns

1
(Forts.) Was bleibt, ist, die Achsen der Diskriminanten als gerade Linien anzuzeigen, die durch Punkte gekachelt sind, die die Diskriminanzwerte darstellen. Um die gekachelte Linie zu zeichnen, müssen wir die Koordinaten jedes Kachelpunkts auf den ursprünglichen Achsen (den Variablen) finden. Die Koordinaten sind einfach zu berechnen: Jede Koordinate ist der Kathetus, die Diskriminanzbewertung ist die Hypotenuze und der cos des Winkels zwischen ihnen ist das entsprechende Element der Eigenvektormatrix: cathet = hypoth * cos.
ttnphns

1
W.- -1B.W.- -1(m1- -m2)michvX.vvvvv

Antworten:


6

W.- -1B.W.- -1(m1- -m2)michv

X.vvvvv

Hier ist das Datenbeispiel aus Ihrer Dropbox und der LDA-Projektion:

LDA-Projektion

Hier ist MATLAB-Code, um diese Figur zu erzeugen (wie angefordert):

% # data taken from your example
X = [-0.9437    -0.0433; -2.4165    -0.5211; -2.0249    -1.0120; ...
    -3.7482 0.2826; -3.3314 0.1653; -3.1927 0.0043; -2.2233 -0.8607; ...
    -3.1965 0.7736; -2.5039 0.2960; -4.4509 -0.3555];
G = [1 1 1 1 1 2 2 2 2 2];

% # overall mean
mu = mean(X);

% # loop over groups
for g=1:max(G)
    mus(g,:) = mean(X(G==g,:)); % # class means
    Ng(g) = length(find(G==g)); % # number of points per group
end

Sw = zeros(size(X,2)); % # within-class scatter matrix
Sb = zeros(size(X,2)); % # between-class scatter matrix
for g=1:max(G)
    Xg = bsxfun(@minus, X(G==g,:), mus(g,:)); % # centred group data
    Sw = Sw + transpose(Xg)*Xg;
    Sb = Sb + Ng(g)*(transpose(mus(g,:) - mu)*(mus(g,:) - mu));
end

St = transpose(bsxfun(@minus,X,mu)) * bsxfun(@minus,X,mu); % # total scatter matrix
assert(sum(sum((St-Sw-Sb).^2)) < 1e-10, 'Error: Sw + Sb ~= St')

% # LDA
[U,S] = eig(Sw\Sb);

% # projecting data points onto the first discriminant axis
Xcentred = bsxfun(@minus, X, mu);
Xprojected = Xcentred * U(:,1)*transpose(U(:,1));
Xprojected = bsxfun(@plus, Xprojected, mu);

% # preparing the figure
colors = [1 0 0; 0 0 1];
figure
hold on
axis([-5 0 -2.5 2.5])
axis square

% # plot discriminant axis
plot(mu(1) + U(1,1)*[-2 2], mu(2) + U(2,1)*[-2 2], 'k')
% # plot projection lines for each data point
for i=1:size(X,1)
    plot([X(i,1) Xprojected(i,1)], [X(i,2) Xprojected(i,2)], 'k--')
end
% # plot projected points
scatter(Xprojected(:,1), Xprojected(:,2), [], colors(G, :))
% # plot original points
scatter(X(:,1), X(:,2), [], colors(G, :), 'filled')

Ausgezeichnet! So hilfreich, eine Frage: Warum interessieren wir uns nur für den 1. Eigenvektor?
Brille

5

Und "meine" Lösung. Vielen Dank an @ttnphns und @amoeba!

set.seed(2014)
library(MASS)
library(DiscriMiner) # For scatter matrices
library(ggplot2)
library(grid)
# Generate multivariate data
mu1 <- c(2, -3)
mu2 <- c(2, 5)
rho <- 0.6
s1 <- 1
s2 <- 3
Sigma <- matrix(c(s1^2, rho * s1 * s2, rho * s1 * s2, s2^2), byrow = TRUE, nrow = 2)
n <- 50
# Multivariate normal sampling
X1 <- mvrnorm(n, mu = mu1, Sigma = Sigma)
X2 <- mvrnorm(n, mu = mu2, Sigma = Sigma)
X <- rbind(X1, X2)
# Center data
Z <- scale(X, scale = FALSE)
# Class variable
y <- rep(c(0, 1), each = n)

# Scatter matrices
B <- betweenCov(variables = X, group = y)
W <- withinCov(variables = X, group = y)

# Eigenvectors
ev <- eigen(solve(W) %*% B)$vectors
slope <- - ev[1,1] / ev[2,1]
intercept <- ev[2,1]

# Create projections on 1st discriminant
P <- Z %*% ev[,1] %*% t(ev[,1])

# ggplo2 requires data frame
my.df <- data.frame(Z1 = Z[, 1], Z2 = Z[, 2], P1 = P[, 1], P2 = P[, 2])

plt <- ggplot(data = my.df, aes(Z1, Z2))
plt <- plt + geom_segment(aes(xend = P1, yend = P2), size = 0.2, color = "gray")
plt <- plt + geom_point(aes(color = factor(y)))
plt <- plt + geom_point(aes(x = P1, y = P2, colour = factor(y)))
plt <- plt + scale_colour_brewer(palette = "Set1")
plt <- plt + geom_abline(intercept = intercept, slope = slope, size = 0.2)
plt <- plt + coord_fixed()
plt <- plt + xlab(expression(X[1])) + ylab(expression(X[2]))
plt <- plt + theme_bw()
plt <- plt + theme(axis.title.x = element_text(size = 8),
                   axis.text.x  = element_text(size = 8),
                   axis.title.y = element_text(size = 8),
                   axis.text.y  = element_text(size = 8),
                   legend.position = "none")
plt

Geben Sie hier die Bildbeschreibung ein


1
(+1) Schöne Handlung! Möchten Sie vielleicht zumindest einige der Code-Auszüge aus Ihrer Frage entfernen, um die Lesbarkeit zu verbessern? Es liegt natürlich an Ihnen.
Amöbe

Dieser Code ist nicht reproduzierbar. Können Sie Variable einführen x, interceptund slope?
Roman Luštrik

Fest; es funktioniert jetzt.
Andrej

Hallo, warum verwenden wir nicht die 2. Diskriminante?
bebrillte
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.