นี่เป็นหัวข้อที่ค่อนข้างเก่า แต่เมื่อเร็ว ๆ นี้ฉันพบปัญหานี้ในงานของฉันและสะดุดเมื่อการสนทนานี้ คำถามได้รับการตอบแล้ว แต่ฉันรู้สึกว่าอันตรายของการทำให้บรรทัดเป็นปกติเมื่อไม่ใช่หน่วยการวิเคราะห์ (ดู @ คำตอบของ @ DJohnson ด้านบน) ยังไม่ได้รับการแก้ไข
ประเด็นหลักคือการปรับแถวให้เป็นบรรทัดฐานสามารถเป็นอันตรายต่อการวิเคราะห์ที่ตามมาใด ๆ เช่นเพื่อนบ้านที่ใกล้ที่สุดหรือ k-mean เพื่อความเรียบง่ายฉันจะเก็บคำตอบเฉพาะไว้ที่ค่าเฉลี่ยของแถว
เพื่อแสดงให้เห็นว่าฉันจะใช้ข้อมูล Gaussian จำลองที่มุมของ hypercube โชคดีที่R
มีฟังก์ชั่นที่สะดวกสบายสำหรับเรื่องนั้น (รหัสอยู่ท้ายคำตอบ) ในกรณี 2D มันตรงไปตรงมาว่าข้อมูลที่มีค่าเป็นศูนย์กลางแถวนั้นจะตกอยู่บนเส้นที่ผ่านจุดกำเนิดที่ 135 องศา จากนั้นข้อมูลจำลองจะถูกทำคลัสเตอร์โดยใช้ k-mean พร้อมกับจำนวนคลัสเตอร์ที่ถูกต้อง ข้อมูลและผลลัพธ์การจัดกลุ่ม (แสดงเป็นภาพ 2D โดยใช้ PCA กับข้อมูลต้นฉบับ) มีลักษณะเช่นนี้ (แกนสำหรับพล็อตซ้ายสุดนั้นแตกต่างกัน) รูปร่างที่แตกต่างกันของคะแนนในพล็อตของการจัดกลุ่มหมายถึงการกำหนดกลุ่มความจริงพื้นดินและสีเป็นผลมาจากการจัดกลุ่ม k- หมายถึง
กลุ่มด้านบนซ้ายและขวาล่างได้รับการผ่าครึ่งเมื่อข้อมูลอยู่กึ่งกลางแถว ดังนั้นระยะทางหลังจากแถวหมายถึงการอยู่ตรงกลางได้รับการบิดเบือนและไม่ได้มีความหมายมาก (อย่างน้อยตามความรู้ของข้อมูล)
ไม่น่าแปลกใจในแบบ 2D ถ้าเราใช้มิติข้อมูลเพิ่มเติม นี่คือสิ่งที่เกิดขึ้นกับข้อมูล 3D โซลูชันการทำคลัสเตอร์หลังจากแถวค่าเฉลี่ยการจัดกึ่งกลางเป็น "ไม่ดี"
และคล้ายกับข้อมูล 4D (ตอนนี้แสดงความกะทัดรัด)
ทำไมสิ่งนี้จึงเกิดขึ้น การจัดแถวให้อยู่กึ่งกลางจะผลักข้อมูลเข้าสู่พื้นที่บางส่วนที่คุณสมบัติบางอย่างเข้ามาใกล้กว่าที่อื่น สิ่งนี้ควรสะท้อนให้เห็นในความสัมพันธ์ระหว่างคุณลักษณะต่างๆ ลองดูที่ (ก่อนอื่นจากข้อมูลต้นฉบับและจากข้อมูลแถวค่าเฉลี่ยศูนย์สำหรับกรณี 2D และ 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
ดังนั้นดูเหมือนว่าการจัดแถวกึ่งกลางหมายถึงการแนะนำความสัมพันธ์ระหว่างคุณลักษณะต่างๆ สิ่งนี้ได้รับผลกระทบจากจำนวนคุณสมบัติอย่างไร เราสามารถทำการจำลองง่าย ๆ เพื่อหาว่า ผลลัพธ์ของการจำลองแสดงไว้ด้านล่าง (อีกรหัสในตอนท้าย)
ดังนั้นเมื่อจำนวนฟีเจอร์เพิ่มผลกระทบของแถวค่าเฉลี่ยศูนย์ดูเหมือนว่าจะลดลงอย่างน้อยที่สุดในแง่ของความสัมพันธ์ที่แนะนำ แต่เราเพิ่งใช้การสุ่มกระจายข้อมูลแบบสุ่มสำหรับการจำลองนี้ (ตามปกติเมื่อศึกษาคำสาปของมิติ )
แล้วจะเกิดอะไรขึ้นเมื่อเราใช้ข้อมูลจริง หลาย ๆ ครั้งมิติที่แท้จริงของข้อมูลจะลดคำสาปอาจจะใช้ไม่ได้ ในกรณีเช่นนี้ฉันจะเดาว่าการตั้งค่ากลางแถวอาจเป็นตัวเลือก "ไม่ดี" ดังที่แสดงด้านบน แน่นอนว่าจำเป็นต้องมีการวิเคราะห์ที่เข้มงวดมากขึ้นเพื่อทำการอ้างสิทธิ์ที่ชัดเจนใด ๆ
รหัสสำหรับการจำลองการจัดกลุ่ม
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)
}
รหัสสำหรับการเพิ่มคุณสมบัติการจำลอง
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)
แก้ไข
หลังจากบาง googling จบลงในหน้านี้ที่จำลองแสดงพฤติกรรมที่คล้ายกันและเสนอว่าความสัมพันธ์ที่นำโดยแถวเฉลี่ยอยู่ตรงกลางจะเป็น(P-1)- 1 / ( p - 1 )