Tái sản xuất biểu đồ phân tích phân biệt tuyến tính


9

Tôi đang vật lộn với các điểm chiếu trong phân tích phân biệt tuyến tính (LDA). Nhiều cuốn sách về các phương pháp thống kê đa biến minh họa ý tưởng của LDA với hình dưới đây.

Hình 1

Mô tả vấn đề như sau. Trước tiên, chúng ta cần vẽ ranh giới quyết định, thêm đường vuông góc và hơn các hình chiếu của các điểm dữ liệu trên đó. Tôi tự hỏi làm thế nào để thêm các điểm chiếu vào đường vuông góc.

Bất kỳ đề nghị / con trỏ?


2
Mặc dù trong trường hợp 2 lớp, việc đưa ra quyết định trước tiên và trục phân biệt thứ hai là khả thi, logic thực tế của LDA là ngược lại. Trước tiên, bạn phải vẽ (các) dòng phân biệt đối xử. Xem một câu hỏi (+ các liên kết quan trọng trong các bình luận trong đó) làm thế nào để thu hút những người phân biệt đối xử. Và về ranh giới: 1 , 2 .
ttnphns

1
Andrej. Trích xuất các hàm riêng. Chúng tôi biết rằng giá trị của những người phân biệt đối xử (điểm số phân biệt đối xử) phụ thuộc vào họ. Điểm mấu chốt bây giờ là vì bạn muốn hiển thị điểm số phân biệt đối xử trong không gian của các biến ban đầu (ở giữa), bạn phải khái niệm hóa các phân biệt đối xử khi các biến ban đầu được xoay trong không gian đó (chính xác như chúng ta khái niệm hóa các thành phần chính). Xoay vòng là phép nhân của dữ liệu trung tâm ban đầu bằng ma trận xoay vòng ...
ttnphns

1
(Tiếp) Ma trận mà các cột là các hàm riêng có thể được xem như là một ma trận xoay nếu tổng bình phương của mỗi cột của nó (tức là mỗi hàm riêng) được chuẩn hóa theo đơn vị. Vì vậy, bình thường hóa các hàm riêng và tính điểm thành phần dưới dạng dữ liệu trung tâm nhân với các hàm riêng này.
ttnphns

1
(Tiếp) Những gì còn lại là hiển thị các trục của người phân biệt đối xử khi các đường thẳng được xếp theo các điểm đại diện cho điểm số phân biệt đối xử. Vì vậy, để vẽ đường lát gạch, chúng ta phải tìm tọa độ của từng điểm ốp lát trên các trục gốc (các biến). Các tọa độ rất dễ tính toán: mỗi tọa độ là cathetus, điểm phân biệt là hypotothyze và cos của góc giữa chúng là phần tử tương ứng của ma trận eigenvector: cathet = hypoth * cos.
ttnphns

1
Andrej, vì vậy trục biệt thức (sự vào đó điểm được chiếu lên hình của bạn 1) được cho bởi eigenvector đầu tiên của . Trong trường hợp chỉ có hai lớp, trình xác định này bằng , trong đó là các lớp trung tâm. Chuẩn hóa vectơ này (hoặc eigenvector thu được) để có được vectơ trục đơn vị . Điều này là đủ để vẽ trục. Để chiếu các điểm (chính giữa) lên trục này, bạn chỉ cần tính . Ở đây là một máy chiếu tuyến tính lên . Có vẻ như bạn đang ở gần đó, vì vậy có lẽ bạn có thể chỉnh sửa bài đăng của mình để giải thích chính xác nơi bạn đang bị mắc kẹt. W - 1 ( m 1 - m 2 ) m i v X v v v v vW1BW1(m1m2)mivXvvvvv
amip

Câu trả lời:


6

Trục phân biệt (điểm mà các điểm được chiếu trên Hình 1 của bạn) được đưa ra bởi trình xác định đầu tiên của . Trong trường hợp chỉ có hai lớp, hàm riêng này tỷ lệ với , trong đó là các lớp trung tâm. Chuẩn hóa vectơ này (hoặc eigenvector thu được) để lấy vectơ trục đơn vị . Điều này là đủ để vẽ trục.W - 1 ( m 1 - m 2 ) m i vW1BW1(m1m2)miv

Để chiếu các điểm (chính giữa) lên trục này, bạn chỉ cần tính toán . Ở đây là một máy chiếu tuyến tính trên .v vvXvvvvv

Đây là mẫu dữ liệu từ dropbox của bạn và phép chiếu LDA:

Chiếu LDA

Đây là mã MATLAB để tạo ra con số này (theo yêu cầu):

% # 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')

Tuyệt vời! Rất hữu ích, một câu hỏi: tại sao chúng ta chỉ quan tâm đến vectơ eigen thứ nhất?
bespectacled

5

Và giải pháp "của tôi". Rất cám ơn @ttnphns và @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

nhập mô tả hình ảnh ở đây


1
(+1) Cốt truyện hay! Bạn có thể muốn xóa ít nhất một số đoạn trích từ câu hỏi của bạn để cải thiện khả năng đọc không? Tất nhiên tùy thuộc vào bạn.
amip

Mã này không thể tái sản xuất. Bạn có thể giới thiệu biến x, interceptslope?
Roman Luštrik

Đã sửa; nó hoạt dộng bây giờ.
Andrej

xin chào, tại sao chúng ta không sử dụng phân biệt đối xử thứ 2?
bespectacled
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.