2017-02-07 6 views
2

Ich frage mich, ob mir jemand mit einigen Fragen über die Funktion ellipsoidhull im R-Paket cluster helfen kann. Ich verwende es, um eine minimale Ellipse zu finden, die eine Reihe von 2D-Punkten enthält. z.B.Klärung über ellipsoidhull in R

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

Die Funktion berechnet die Ellipse OK, eine Struktur zurückkehrt, die das Zentrum der Ellipse und einer Kovarianzmatrix umfasst.

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 

Fragen

a) Wie kann ich diese Daten verwenden, um zu überprüfen, ob ein gegebener Punkt auf der Ellipse gehört?

b) Wie kann ich mit diesen Daten die Entfernung von einem bestimmten Punkt zur Ellipse berechnen?

Antwort

1

Wir können versuchen, die folgenden:

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! Vielen Dank. Sie haben mir nicht nur bei meiner Frage geholfen, sondern auch die Beziehung zwischen der De-Kovarianz-Darstellung der Ellipse und einer Darstellung, die ich verstehe, deutlich gemacht. Vielen Dank. Ich denke, ich kann das Entfernungsproblem selbst lösen. – user2345448