क्या कोई व्यक्ति R कोड के साथ eigenvalues से एक दीर्घवृत्त और निम्नलिखित मैट्रिक्स A = ( 2.2 0.4 0.4 2.8 ) के eigenvectors की साजिश रच सकता है।
क्या कोई व्यक्ति R कोड के साथ eigenvalues से एक दीर्घवृत्त और निम्नलिखित मैट्रिक्स A = ( 2.2 0.4 0.4 2.8 ) के eigenvectors की साजिश रच सकता है।
जवाबों:
आप के माध्यम से eigenvectors और -values निकाल सकते हैं eigen(A)
। हालांकि, चोल्स्की अपघटन का उपयोग करना सरल है। ध्यान दें कि जब डेटा के लिए आत्मविश्वास दीर्घवृत्त की साजिश रचते हैं, तो दीर्घवृत्त-कुल्हाड़ियों को आमतौर पर संबंधित आइगेनवेल्स की लंबाई = वर्ग-जड़ के लिए स्केल किया जाता है, और यही चोल्स्की अपघटन देता है।
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)
मुझे लगता है कि यह आर कोड है जो आप चाहते हैं। मैंने इस धागे से आर-मेलिंग सूची में आर-कोड उधार लिया । मूल रूप से यह विचार है: प्रमुख और लघु अर्ध-व्यास दो ईजन मान हैं और आप पहले आइगन वेक्टर और एक्स-एक्सिस के बीच कोण की मात्रा से दीर्घवृत्त को घुमाते हैं।
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)
मेरे उत्तर के समान ही दीर्घवृत्त देता है।