2017-02-07 2 views
2

Je me demande si quelqu'un peut m'aider avec quelques questions sur la fonction ellipsoidhull dans le paquet R cluster. Je l'utilise pour trouver une ellipse minimum contenant une série de 2 points. par exemple.Clarification à propos de ellipsoidhull dans R

library(cluster) 
d <- matrix(c(1,2,3,1,3,2),ncol=2) 
e <- ellipsoidhull(d) 

La fonction calcule l'ellipse OK, le retour d'une structure qui comprend le centre de l'ellipse et d'une matrice de covariance.

summary(e) 
## 'ellipsoid' in 2 dimensions: 
## center = (2 2); squared ave.radius d^2 = 2 
## and shape matrix = 
##  [,1] [,2] 
## [1,] 0.66667 0.33333 
## [2,] 0.33333 0.66667 
##  hence, area = 3.6276 

Questions

a) Comment puis-je utiliser ces données pour vérifier si un point donné appartient à l'ellipse?

b) Comment puis-je utiliser ces données pour calculer la distance entre un point donné et l'ellipse?

Répondre

1

Nous pouvons les opérations suivantes:

library(cluster) 
d <- matrix(c(1,2,3,1,3,2),ncol=2) 
e <- ellipsoidhull(d) 
eg <- eigen(e$cov) 
axes <- sqrt(eg$values) 
angle <- atan(eg$vectors[1,1]/eg$vectors[2,1]) # angle of major axis with x axis 

# check if the point (xp, yp) belongs to the ellipse with parameters a,b,... with tolerance eps 
belongs.to <- function (xp, yp, a, b, x0, y0, alpha, eps=1e-3) { 
    return(abs((cos(alpha)*(xp-x0)+sin(alpha)*(yp-y0))^2/a^2+(sin(alpha)*(xp-x0)-cos(alpha)*(yp-y0))^2/b^2 - 1) <= eps) 
} 

# check if the point (xp, yp) is inside the ellipse with parameters a,b,... 
is.inside <- function (xp, yp, a, b, x0, y0, alpha) { 
    return((cos(alpha)*(xp-x0)+sin(alpha)*(yp-y0))^2/a^2+(sin(alpha)*(xp-x0)-cos(alpha)*(yp-y0))^2/b^2 <= 1) 
} 

# plot ellipse 
plot(e$loc, xlim=c(0,4), ylim=c(0,4), main = "ellipsoidhull", xlab='x', ylab='y') 
lines(predict(e), col="blue") 
points(rbind(e$loc), col = "red", cex = 3, pch = 13) 

x0 <- e$loc[1] # centroid locations 
y0 <- e$loc[2] 
a <- sqrt(e$d2) * axes[1] # major axis length 
b <- sqrt(e$d2) * axes[2] # minor axis length 

alpha <- angle 
xp <- 3 
yp <- 2.9 
is.inside(xp, yp, a, b, x0, y0, alpha) 
# [1] TRUE 
points(xp, yp, pch=19, col='green') 
xp <- 3 
yp <- 3.1 
is.inside(xp, yp, a, b, x0, y0, alpha) 
# [1] FALSE 
points(xp, yp, pch=19, col='blue') 
xp <- 3 
yp <- 3 
belongs.to(xp, yp, a, b, x0, y0, alpha) 
# [1] TRUE 
points(xp, yp, pch=19, col='pink') 


# distance of a point from the center of the ellipse 
sqrt((xp-x0)^2+(yp-y0)^2) 

enter image description here

+1

Great! Merci. Vous m'avez non seulement aidé à poser ma question, mais aussi à clarifier la relation entre la représentation de de covariance de l'ellipse et une représentation que je comprends. Merci. Je pense que je peux résoudre le problème de la distance moi-même. – user2345448