Đây là một chủ đề tương đối cũ nhưng gần đây tôi đã gặp phải vấn đề này trong công việc của tôi và tình cờ thấy cuộc thảo luận này. Câu hỏi đã được trả lời nhưng tôi cảm thấy rằng sự nguy hiểm của việc bình thường hóa các hàng khi nó không phải là đơn vị phân tích (xem câu trả lời của @ DJohnson ở trên) chưa được giải quyết.
Điểm chính là các hàng bình thường hóa có thể gây bất lợi cho bất kỳ phân tích tiếp theo nào, chẳng hạn như hàng xóm gần nhất hoặc phương tiện k. Để đơn giản, tôi sẽ giữ câu trả lời cụ thể cho việc định tâm trung bình các hàng.
Để minh họa nó, tôi sẽ sử dụng dữ liệu Gaussian mô phỏng ở các góc của hypercube. May mắn thay trong R
đó có một chức năng thuận tiện cho việc đó (mã ở cuối câu trả lời). Trong trường hợp 2D, điều đơn giản là dữ liệu tập trung vào hàng sẽ nằm trên một đường đi qua gốc tọa độ ở 135 độ. Dữ liệu mô phỏng sau đó được phân cụm bằng cách sử dụng phương tiện k với số cụm chính xác. Dữ liệu và kết quả phân cụm (được hiển thị trong 2D bằng PCA trên dữ liệu gốc) trông như thế này (các trục cho âm mưu ngoài cùng bên trái là khác nhau). Các hình dạng khác nhau của các điểm trong các ô phân cụm đề cập đến việc gán cụm mặt đất và màu sắc là kết quả của phân cụm k-mean.
Các cụm trên cùng bên trái và dưới cùng bên phải bị cắt làm đôi khi dữ liệu được định tâm theo hàng. Vì vậy, khoảng cách sau khi định tâm trung bình hàng bị biến dạng và không có ý nghĩa lắm (ít nhất là dựa trên kiến thức về dữ liệu).
Không quá ngạc nhiên trong 2D, nếu chúng ta sử dụng nhiều kích thước thì sao? Đây là những gì xảy ra với dữ liệu 3D. Giải pháp phân cụm sau định tâm trung bình hàng là "xấu".
Và tương tự với dữ liệu 4D (hiện được hiển thị cho ngắn gọn).
Tại sao chuyện này đang xảy ra? Định tâm trung bình hàng đẩy dữ liệu vào một không gian nơi một số tính năng đến gần hơn so với thực tế. Điều này cần được phản ánh trong mối tương quan giữa các tính năng. Chúng ta hãy xem xét điều đó (đầu tiên trên dữ liệu gốc và sau đó là dữ liệu tập trung vào hàng cho các trường hợp 2D và 3D).
[,1] [,2]
[1,] 1.000 -0.001
[2,] -0.001 1.000
[,1] [,2]
[1,] 1 -1
[2,] -1 1
[,1] [,2] [,3]
[1,] 1.000 -0.001 0.002
[2,] -0.001 1.000 0.003
[3,] 0.002 0.003 1.000
[,1] [,2] [,3]
[1,] 1.000 -0.504 -0.501
[2,] -0.504 1.000 -0.495
[3,] -0.501 -0.495 1.000
Vì vậy, có vẻ như trung tâm hàng có nghĩa là giới thiệu mối tương quan giữa các tính năng. Làm thế nào điều này bị ảnh hưởng bởi số lượng các tính năng? Chúng ta có thể làm một mô phỏng đơn giản để tìm ra điều đó. Kết quả mô phỏng được hiển thị bên dưới (một lần nữa mã ở cuối).
Vì vậy, khi số lượng các tính năng làm tăng hiệu ứng của định tâm trung bình hàng dường như giảm đi, ít nhất là về các mối tương quan được giới thiệu. Nhưng chúng tôi chỉ sử dụng dữ liệu ngẫu nhiên được phân phối đồng đều cho mô phỏng này (như thường thấy khi nghiên cứu về lời nguyền của chiều ).
Vậy điều gì xảy ra khi chúng ta sử dụng dữ liệu thực? Vì nhiều lần chiều kích nội tại của dữ liệu thấp hơn nên lời nguyền có thể không được áp dụng . Trong trường hợp như vậy, tôi đoán rằng việc định tâm theo hàng có thể là một lựa chọn "xấu" như được hiển thị ở trên. Tất nhiên, phân tích chặt chẽ hơn là cần thiết để đưa ra bất kỳ tuyên bố dứt khoát.
Mã mô phỏng phân cụm
palette(rainbow(10))
set.seed(1024)
require(mlbench)
N <- 5000
for(D in 2:4) {
X <- mlbench.hypercube(N, d=D)
sh <- as.numeric(X$classes)
K <- length(unique(sh))
X <- X$x
Xc <- sweep(X,2,apply(X,2,mean),"-")
Xr <- sweep(X,1,apply(X,1,mean),"-")
show(round(cor(X),3))
show(round(cor(Xr),3))
par(mfrow=c(1,1))
k <- kmeans(X,K,iter.max = 1000, nstart = 10)
kc <- kmeans(Xc,K,iter.max = 1000, nstart = 10)
kr <- kmeans(Xr,K,iter.max = 1000, nstart = 10)
pc <- prcomp(X)
par(mfrow=c(1,4))
lim <- c(min(min(X),min(Xr),min(Xc)), max(max(X),max(Xr),max(Xc)))
plot(X[,1], X[,2], xlim=lim, ylim=lim, xlab="Feature 1", ylab="Feature 2",main="Data",col=1,pch=1)
points(Xc[,1], Xc[,2], col=2,pch=2)
points(Xr[,1], Xr[,2], col=3,pch=3)
legend("topleft",legend=c("Original","Center-cols","Center-rows"),col=c(1,2,3),pch=c(1,2,3))
abline(h=0,v=0,lty=3)
plot(pc$x[,1], pc$x[,2], col=rainbow(K)[k$cluster], xlab="PC 1", ylab="PC 2", main="Cluster original", pch=sh)
plot(pc$x[,1], pc$x[,2], col=rainbow(K)[kc$cluster], xlab="PC 1", ylab="PC 2", main="Cluster center-col", pch=sh)
plot(pc$x[,1], pc$x[,2], col=rainbow(K)[kr$cluster], xlab="PC 1", ylab="PC 2", main="Cluster center-row", pch=sh)
}
Mã để tăng tính năng mô phỏng
set.seed(2048)
N <- 1000
Cmax <- c()
Crmax <- c()
for(D in 2:100) {
X <- matrix(runif(N*D), nrow=N)
C <- abs(cor(X))
diag(C) <- NA
Cmax <- c(Cmax, max(C, na.rm=TRUE))
Xr <- sweep(X,1,apply(X,1,mean),"-")
Cr <- abs(cor(Xr))
diag(Cr) <- NA
Crmax <- c(Crmax, max(Cr, na.rm=TRUE))
}
par(mfrow=c(1,1))
plot(Cmax, ylim=c(0,1), ylab="Max. cor.", xlab="#Features",col=1,pch=1)
points(Crmax, ylim=c(0,1), col=2, pch=2)
legend("topright", legend=c("Original","Center-row"),pch=1:2,col=1:2)
BIÊN TẬP
- 1 / ( p - 1 )