มีใครมากับรหัสRเพื่อพล็อตวงรีจากค่าลักษณะเฉพาะและ eigenvectors ของเมทริกซ์ต่อไปนี้
มีใครมากับรหัสRเพื่อพล็อตวงรีจากค่าลักษณะเฉพาะและ eigenvectors ของเมทริกซ์ต่อไปนี้
คำตอบ:
คุณสามารถแยก eigenvectors และ -values eigen(A)
ผ่าน อย่างไรก็ตามมันง่ายกว่าที่จะใช้การสลายตัวของ Cholesky โปรดทราบว่าเมื่อวางแผนจุดไข่ปลาความเชื่อมั่นสำหรับข้อมูลวงรี - แกนมักจะถูกปรับขนาดให้มีความยาว = สแควร์รูทของค่าลักษณะเฉพาะที่สอดคล้องกันและนี่คือสิ่งที่การสลายตัวของ Cholesky ให้
ctr <- c(0, 0) # data centroid -> colMeans(dataMatrix)
A <- matrix(c(2.2, 0.4, 0.4, 2.8), nrow=2) # covariance matrix -> cov(dataMatrix)
RR <- chol(A) # Cholesky decomposition
angles <- seq(0, 2*pi, length.out=200) # angles for ellipse
ell <- 1 * cbind(cos(angles), sin(angles)) %*% RR # ellipse scaled with factor 1
ellCtr <- sweep(ell, 2, ctr, "+") # center ellipse to the data centroid
plot(ellCtr, type="l", lwd=2, asp=1) # plot ellipse
points(ctr[1], ctr[2], pch=4, lwd=2) # plot data centroid
library(car) # verify with car's ellipse() function
ellipse(c(0, 0), shape=A, radius=0.98, col="red", lty=2)
แก้ไข: เพื่อพล็อต eigenvectors เช่นกันคุณต้องใช้วิธีการที่ซับซ้อนมากขึ้น นี่เทียบเท่ากับคำตอบของ suncoolsu เพียงใช้สัญกรณ์เมทริกซ์เพื่อทำให้รหัสสั้นลง
eigVal <- eigen(A)$values
eigVec <- eigen(A)$vectors
eigScl <- eigVec %*% diag(sqrt(eigVal)) # scale eigenvectors to length = square-root
xMat <- rbind(ctr[1] + eigScl[1, ], ctr[1] - eigScl[1, ])
yMat <- rbind(ctr[2] + eigScl[2, ], ctr[2] - eigScl[2, ])
ellBase <- cbind(sqrt(eigVal[1])*cos(angles), sqrt(eigVal[2])*sin(angles)) # normal ellipse
ellRot <- eigVec %*% t(ellBase) # rotated ellipse
plot((ellRot+ctr)[1, ], (ellRot+ctr)[2, ], asp=1, type="l", lwd=2)
matlines(xMat, yMat, lty=1, lwd=2, col="green")
points(ctr[1], ctr[2], pch=4, col="red", lwd=3)
ฉันคิดว่านี่เป็นรหัส R ที่คุณต้องการ ฉันยืมรหัส R จากหัวข้อนี้ในรายการส่งเมล แนวคิดหลักคือ: ขนาดครึ่งส่วนใหญ่และขนาดเล็กคือค่าไอจีไอสองค่าและคุณหมุนวงรีตามจำนวนมุมระหว่างเวกเตอร์ไอเกนแรกกับแกน x
mat <- matrix(c(2.2, 0.4, 0.4, 2.8), 2, 2)
eigens <- eigen(mat)
evs <- sqrt(eigens$values)
evecs <- eigens$vectors
a <- evs[1]
b <- evs[2]
x0 <- 0
y0 <- 0
alpha <- atan(evecs[ , 1][2] / evecs[ , 1][1])
theta <- seq(0, 2 * pi, length=(1000))
x <- x0 + a * cos(theta) * cos(alpha) - b * sin(theta) * sin(alpha)
y <- y0 + a * cos(theta) * sin(alpha) + b * sin(theta) * cos(alpha)
png("graph.png")
plot(x, y, type = "l", main = expression("x = a cos " * theta * " + " * x[0] * " and y = b sin " * theta * " + " * y[0]), asp = 1)
arrows(0, 0, a * evecs[ , 1][2], a * evecs[ , 1][2])
arrows(0, 0, b * evecs[ , 2][3], b * evecs[ , 2][2])
dev.off()
asp=1
ให้มีอัตราส่วนภาพเท่ากับ 1 และลูกศรตั้งฉาก เปลี่ยนรหัสของคุณเพื่อevs <- sqrt(eigens$values)
ให้วงรีเดียวกันกับคำตอบของฉัน