วัตถุประสงค์ของการฟื้นฟูแถวคืออะไร


13

ฉันเข้าใจเหตุผลที่อยู่เบื้องหลังการทำให้คอลัมน์เป็นมาตรฐานเนื่องจากทำให้คุณสมบัตินั้นมีน้ำหนักเท่ากันแม้ว่าจะไม่ได้วัดในระดับเดียวกัน - อย่างไรก็ตามบ่อยครั้งในวรรณกรรมเพื่อนบ้านที่ใกล้ที่สุดทั้งคอลัมน์และแถวจะถูกทำให้เป็นมาตรฐาน การนอร์มัลไลซ์แถวสำหรับ / ทำไมทำให้แถวเป็นมาตรฐาน โดยเฉพาะผลลัพธ์ของการปรับสภาพแถวมีผลต่อความเหมือน / ระยะห่างระหว่างเวกเตอร์แถวอย่างไร


คุณสามารถอ้างอิงวรรณกรรมที่ทำให้บรรทัดเป็นปกติได้หรือไม่ ฉันรู้ว่านี่เป็นการสนทนาที่ค่อนข้างเก่า แต่เมื่อเร็ว ๆ นี้ฉันได้พบกับปัญหาที่คล้ายกันและพยายามค้นหาความแตกต่าง ฉันจะโพสต์ใช้เวลาของฉันมันเป็นคำตอบ
DataD'oh

คำตอบ:


4

นี่เป็นหัวข้อที่ค่อนข้างเก่า แต่เมื่อเร็ว ๆ นี้ฉันพบปัญหานี้ในงานของฉันและสะดุดเมื่อการสนทนานี้ คำถามได้รับการตอบแล้ว แต่ฉันรู้สึกว่าอันตรายของการทำให้บรรทัดเป็นปกติเมื่อไม่ใช่หน่วยการวิเคราะห์ (ดู @ คำตอบของ @ 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/(p1)


5

มีรูปแบบต่าง ๆ ของการฟื้นฟูแถวและ OP ไม่ได้ระบุว่าเขา / เธอคนใดมีอยู่ในใจ

รูปแบบเฉพาะของการนอร์มัลไลซ์แถว (Eucledian norm normalization) ซึ่งแต่ละแถวนั้นมีบรรทัดฐาน (หารด้วยบรรทัดฐานของ Eucledian) เป็นที่นิยมเงียบ

เหตุผลในการใช้รูปแบบของการนอร์มัลไลซ์แถวนี้สรุปได้ดีในหัวข้อของบทความนี้: [0]:3.2

แสดงว่าคอลัมน์อยู่ตรงกลางแถว -vector และหน้าxxp

(0)r(xx)=||xx||21xx

เวกเตอร์มาตรฐานของแถว พิจารณาสิ่งที่เปลี่ยนแปลงครั้งนี้จะทำกับข้อมูลของคุณทางเรขาคณิต ในทางเรขาคณิตหากข้อมูลดั้งเดิมของคุณมีตัวแปรและอยู่กึ่งกลางโดยการใช้การทำให้เป็นแนวแถวแบบยุคลิดคุณจะคาดการณ์ข้อมูลของคุณบนพื้นผิวของวงกลมหน่วยหน้าp>1p

ตัวอย่างเช่นหากข้อมูลดั้งเดิมของคุณอยู่กึ่งกลาง (เช่นจุดสีดำในภาพนี้) และคุณใช้การปรับแถวให้เป็นแถวคุณจะได้ดาวสีแดง

library(car)
p = 2
n = 1000
m = 10
C = matrix(.9, p, p)
diag(C) = 1
set.seed(123)
x = matrix(runif(n * p, -1, 1), n, p) %*% chol(C)
z = sweep(x, 1, sqrt(rowSums(x * x)), FUN = '/')
plot(rbind(x, z), pch = 16, type = 'n', ann = FALSE, xaxt = 'n', yaxt = 'n')
points(x, pch = 16)
points(z, pch = 8, col = 'red')

จุดสีเขียวแสดงถึงค่าผิดปกติจำนวนเล็กน้อยในข้อมูลต้นฉบับ ถ้าคุณใช้การแปลงแถวของการทำให้เป็นมาตรฐานคุณจะได้ดาวสีน้ำเงิน

x_1 = sweep(matrix(runif(m * p, -1, 1), m, p), 2, c(2, -2))
z_1 = sweep(x_1, 1, sqrt(rowSums(x_1 * x_1)), FUN = '/')
plot(rbind(x, x_1, z, z_1), pch = 16, type = 'n', ann = FALSE, xaxt = 'n', yaxt = 'n')
points(x, pch = 16)
points(x_1, pch = 16, col = 'green')
points(z, pch = 8, col = 'red')
points(z_1, pch = 8, col = 'blue')

ป้อนคำอธิบายรูปภาพที่นี่

ตอนนี้ข้อดีของการเปลี่ยนแปลงนี้ชัดเจน การฉายภาพบนวงกลมหน่วยจะลดผลกระทบของค่าผิดปกติที่ไกลออกไป หากคุณข้อมูลเดิม ถูกดึงมาจากรูปแบบการเป็นศูนย์กลางยกเว้นไม่กี่ไกลออกค่าผิดปกติ (เช่นจุดสีเขียว) แล้วประมาณการของรูปร่างของข้อมูลของคุณขึ้นอยู่กับการใด ๆจะนิสัยเสียโดยค่าผิดปกติF xxFx

หากคุณประเมินตามข้อมูลปกติที่ (ดาวแดงและน้ำเงิน) ค่าผิดปกติ (ตอนนี้ถูกแมปกับดาวสีน้ำเงิน) จะมีการใช้ประโยชน์น้อยกว่าเพื่อทำให้การประมาณการของคุณเสียz

คุณสามารถดูสิ่งนี้ได้อย่างชัดเจนที่สุดโดยการเปรียบเทียบเมทริกซ์รูปร่าง (หรือวงรีรูปร่าง) ที่พอดีกับข้อมูลรุ่นที่ปนเปื้อนและการแปลงแถวตามปกติ:

ellipse(crossprod(rbind(x, x_1)) / (n + m - 1) / det(crossprod(rbind(x, x_1)) / (n + m - 1))^(1 / p), center = rep(0, p), col = 'green', radius = 1)
ellipse(crossprod(rbind(z, z_1)) / (n + m - 1) / det(crossprod(rbind(z, z_1)) / (n + m - 1))^(1 / p), center = rep(0, p), col = 'red', radius = 1)
ellipse(crossprod(rbind(x)) / (n - 1) / det(crossprod(rbind(x)) / (n - 1))^(1 / p), center = rep(0, p), col = 'black', radius = 1)

อย่างที่คุณเห็นรูปวงรีรูปร่างที่พอดีกับข้อมูลที่ปนเปื้อนเปลี่ยนรูป (วงรีสีแดง) เป็นการประมาณที่ดีขึ้นของเมทริกซ์รูปร่างของข้อมูลที่ไม่ปนเปื้อน (วงรีสีดำ) กว่าที่ได้จากข้อมูลที่ปนเปื้อน (วงรีสีเขียว) นี่เป็นเพราะดาวสีเขียวมีการดึงที่วงรีสีแดงเล็กกว่า (สร้างจากข้อมูลที่แปลงแล้ว ) กว่าบนดาวสีเขียว (สร้างจากข้อมูลดั้งเดิม )xzx

  • [0] S. Visuri, V. Koivunen, H. Oja (2000) เซ็นชื่อและจัดอันดับเมทริกซ์ความแปรปรวนร่วมวารสารการวางแผนและการอนุมานเชิงสถิติเล่มที่ 91 ฉบับที่ 2, 557–575

4

มีเหตุผลเฉพาะฟิลด์เพื่อดำเนินการปรับสภาพแถว ในการวิเคราะห์ข้อความเป็นเรื่องธรรมดามากที่จะแสดงข้อความที่มีฮิสโตแกรมของคำที่มีอยู่ เริ่มจากการนับจำนวนคำสำหรับแต่ละบรรทัดการกำหนดมาตรฐานแบบดิบจะเปลี่ยนเป็นฮิสโตแกรม

และเหตุผลการคำนวณ ถ้าคุณกำลังทำงานกับเมทริกซ์กระจัดกระจายคุณไม่สามารถจัดกึ่งกลางและปรับขนาดคอลัมน์ข้อมูลตามคอลัมน์ได้อย่างง่ายดาย หากคุณฝังในเมทริกซ์หนาแน่นข้อมูลอาจใหญ่เกินไปที่จะใส่ในหน่วยความจำ อย่างไรก็ตามการปรับขนาดแบบแถวต่อแถวไม่มีผลกับจำนวนหน่วยความจำทั้งหมดที่ต้องการ


สำหรับเหตุผลการคำนวณคุณกำลังบอกว่าเราแค่นำทรานสโพสและแถวที่ทำให้เป็นมาตรฐานนั้นเพราะวิธีที่เมทริกซ์กระจัดกระจายแสดงอยู่? ฉันถามคำถามเกี่ยวกับการฟื้นฟูแถวที่มีผลต่อผลลัพธ์เพื่อนบ้านที่ใกล้เคียงที่สุดในทางปฏิบัติ
curiosity_delivers

3

การนอร์มัลไลซ์แถวมีชื่อ - การปรับขนาด ipsative - ซึ่งโดยทั่วไปแล้วจะเกี่ยวข้องกับการลดขนาดชุดของคุณลักษณะโดยการหารด้วยค่าสูงสุดสำหรับชุดหรือการลบค่าเฉลี่ยของคุณลักษณะ มีแรงจูงใจมากมายสำหรับการเลือกวิธีการนี้ในการแปลงข้อมูล แต่สิ่งสำคัญที่สุดในกลุ่มพวกเขาคือมันเป็นเงื่อนไขของคุณลักษณะที่สัมพันธ์กับลักษณะเฉพาะของแต่ละบุคคล (แถวหรือหน่วยการวิเคราะห์)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.