आर में eigenvalues ​​और eigenvectors से एक दीर्घवृत्त की साजिश कैसे करें? [बन्द है]


15

क्या कोई व्यक्ति R कोड के साथ eigenvalues ​​से एक दीर्घवृत्त और निम्नलिखित मैट्रिक्स A = ( 2.2 0.4 0.4 2.8 ) के eigenvectors की साजिश रच सकता है।

=(2.20.40.42.8)

जवाबों:


16

आप के माध्यम से 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)

यहाँ छवि विवरण दर्ज करें


क्या आप इस दीर्घवृत्त पर eigenvalues ​​और eigenvectors की साजिश करना चाहेंगे? धन्यवाद
MYaseen208

@ MYaseen208 मैंने अपने उत्तर को आइजनवेक्टरों को दीर्घवृत्त के कुल्हाड़ियों के रूप में दिखाने के लिए संपादित किया। आधी कुल्हाड़ियों की लंबाई संगत eigenvectors के वर्ग-मूल के बराबर होती है।
कारकल

7

मुझे लगता है कि यह आर कोड है जो आप चाहते हैं। मैंने इस धागे से आर-मेलिंग सूची में आर-कोड उधार लिया । मूल रूप से यह विचार है: प्रमुख और लघु अर्ध-व्यास दो ईजन मान हैं और आप पहले आइगन वेक्टर और एक्स-एक्सिस के बीच कोण की मात्रा से दीर्घवृत्त को घुमाते हैं।

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()

यहाँ छवि विवरण दर्ज करें


कृपया मुझे ठीक करने के लिए स्वतंत्र महसूस करें। मुझे नहीं लगता कि आइजन वेक्स लंबवत हैं (वे सिद्धांत में होना चाहिए; हो सकता है कि मैं कुछ गलत कर रहा हूं।)
सनकूल्सू

=(1-5-51) और इसने सही दीर्घवृत्त दिया। मैं सोच रहा हूँ कि यह मैट्रिक्स में विभिन्न भिन्नताओं के लिए सही दीर्घवृत्त क्यों प्रदान नहीं कर रहा है। कोई टिप्पणी!
MYaseen208

बस asp=11 और लंबवत तीरों का एक पहलू अनुपात निर्धारित करें। अपने कोड को बदलना evs <- sqrt(eigens$values)मेरे उत्तर के समान ही दीर्घवृत्त देता है।
कारकल

3
@ MYaseen208 आपका नया मैट्रिक्स सकारात्मक निश्चित नहीं है: इसमें नकारात्मक आइजनवेल्यूज़ हैं और यह संभव कोवरियन मैट्रिक्स नहीं है। मैं नहीं जानता कि उस मामले में क्या ग्रहण करना है।
काराकल

@ ओंकार थैंक्स! ... हाँ - मैं sqrt भाग को याद किया!
सनकूल्सू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.