2009-02-18 23 views
4

Étant donné une "forme" dessinée par l'utilisateur, je voudrais la "normaliser" afin qu'ils aient tous une taille et une orientation similaires. Ce que nous avons est un ensemble de points. Je peux approximer la taille en utilisant une boîte ou un cercle de délimitation, mais l'orientation est un peu plus compliquée.Étant donné un ensemble de points, comment puis-je approcher l'axe principal de sa forme?

La bonne façon de le faire, je pense, est de calculer le majoraxis de son bounding ellipse. Pour ce faire, vous devez calculer le eigenvector du covariance matrix. Le faire sera probablement trop compliqué pour mon besoin, puisque je cherche une estimation assez bonne. Prélèvement min, max et 20 points aléatoires pourraient être un peu de démarrage. Y a-t-il un moyen facile d'approcher cela?

Modifier: J'ai trouvé Power method à environ itérativement vecteur propre. . Jusqu'à présent, j'apprécie David's answer.

Répondre

3

Vous calculeriez les vecteurs propres d'une matrice 2x2, ce qui peut être fait avec quelques formules simples, donc ce n'est pas si compliqué. En pseudocode:

// sums are over all points 
b = -(sum(x * x) - sum(y * y))/(2 * sum(x * y)) 
evec1_x = b + sqrt(b ** 2 + 1) 
evec1_y = 1 
evec2_x = b - sqrt(b ** 2 + 1) 
evec2_y = 1 

Vous pouvez même le faire en sommant sur seulement quelques-uns des points pour obtenir une estimation, si vous vous attendez que votre sous-ensemble choisi de points serait représentatif de l'ensemble.

Modifier: Je pense que x et y doivent être traduits à moyenne nulle, à savoir soustraire moyenne de tous les x, y première (eed3si9n).

+0

Si cela calcule le vecteur propre de la matrice de covariance, il est génial. Y a-t-il un lien qui pointe vers cette méthode? –

+0

Découvrez http://number-none.com/product/My%20Friend,%20the%20Covariance%20Body/index.html et l'exemple de code à http://www.gdmag.com/code.htm (sep02. zip) – Dave

+0

J'ai trouvé une triche rapide pour le vecteur propre de la matrice 2x2: http://tinyurl.com/cd998p. Pour C = | E (x * x) E (x * y) || E (x * y) E (y * y) |, L1-d/c sort pour être (somme (x * x) - somme (y * y))/(2 * somme (x * y)) + sqrt (((somme (x * x) - somme (y * y))/(2 * somme (x * y)))^2 + 1), qui est exactement b + sqrt (b^2 + 1). –

3

Voici une pensée ... Et si vous faisiez une régression linéaire sur les points et utilisiez la pente de la ligne résultante? Si ce n'est pas tous les points, au moins un échantillon d'entre eux.

La valeur r^2 vous donnerait également des informations sur la forme générale. Plus la valeur est proche de 0, plus la forme est circulaire/uniforme (cercle/carré). Le plus proche de 1, plus la forme est allongée (ovale/rectangle).

2

La solution ultime à ce problème est en cours d'exécution PCA
Je voudrais pouvoir trouver une jolie petite mise en œuvre pour vous faire référence à ...

+0

J'allais dire PCA. Ceci est la réponse correcte ultime. – Alex