Estimer le centre et le rayon d'une sphère à partir de points sur la surface

9

Si nous supposons que nos points de données ont été échantillonnés à partir de la surface d'une sphère (avec une certaine perturbation), comment pouvons-nous récupérer le centre de cette sphère?

Dans ma recherche, j'ai trouvé des articles sur quelque chose qui s'appelait "régression sphérique", mais il ne semblait pas que cela faisait la même chose. Peut-être que je ne l'ai tout simplement pas compris.

Existe-t-il une formule simple, similaire à la régression linéaire, qui trouve un point central et un rayon de sphère qui minimise la distance au carré d'un ensemble de points de données de la surface de la sphère?


Modifier 1:

On peut supposer que le bruit sera de 2 ou 3 ordres de grandeur plus petit que le rayon de la sphère et uniformément sphérique gaussien. Cependant, les échantillons eux-mêmes ne seront certainement pas tirés uniformément de la surface de la sphère, mais seront probablement regroupés en quelques patchs sur la surface, probablement tous dans un hémisphère. Une solution qui fonctionne pour les données dans est très bien, mais une solution générale pour la dimensionnalité arbitraire est également excellente.R3


Modifier 2:

Quelles sont les chances que j'obtienne une réponse raisonnable si je devais utiliser une régression linéaire, , dans l'espace à 7 dimensions en faisant comme si les composantes au carré étaient indépendantes des autres paramètres:y=Xβ+ϵ

X=[2x2y2z1111]β=[x0y0z0x02y02z02r2]y=x2+y2+z2

Au mieux, je suppose que ma métrique d'erreur sera un peu farfelue. Au pire, la solution ne sera même pas proche de la cohérence.
... ou c'est idiot car avec quatre colonnes identiques, nous obtenons une matrice singulière lorsque nous essayons de faire une régression.


Modifier 3:

Il semble donc que ce sont mes options:

  1. Optimisation numérique non linéaire utilisant une fonction de coût:f(x0,y0,z0,r|X)=12i=1n(r(xix0)2+(yiy0)2+(ziz0)2)2
  2. Hough-transform: discrétise l'espace plausible ou les centres et rayons possibles autour des points de données. Chaque point jette un vote pour les centres potentiels dont il pourrait faire partie à chaque discrétisation de rayon spécifique. La plupart des votes l'emportent. Cela pourrait être correct s'il y avait potentiellement un nombre inconnu de sphères, mais avec une seule, c'est une solution compliquée.
  3. Sélectionnez au hasard (ou systématiquement) des groupes de 4 points et calculez analytiquement le centre . Rejetez l'échantillonnage s'il est mal conditionné (les points sont presque coplanaires). Rejeter les valeurs aberrantes et trouver le centre moyen. De là, nous pouvons trouver le rayon moyen.

Quelqu'un at-il une meilleure méthode?

JCooper
la source
Notez que les deux formes de votre question ne sont pas équivalentes: ce n'est pas nécessairement le cas que la minimisation de la somme des carrés des distances de la surface donne les meilleures estimations à moins qu'une hypothèse forte ne soit faite sur la nature des perturbations. Il serait donc utile d'en savoir plus sur la façon dont les perturbations se produisent (et sur leur ampleur par rapport à la taille de la sphère). Aussi: dans combien de dimensions est votre sphère?
whuber
@whuber Je voulais définir le meilleur ajustement comme celui qui minimise la distance au carré des données du point le plus proche sur la surface de la sphère. Je n'ai pas beaucoup réfléchi aux hypothèses que cela implique. Je m'attends à des erreurs proportionnellement petites; donc peut-être que la métrique exacte n'a pas trop d'importance, même si j'aimerais savoir ce que la fonction minimise. J'ai ajouté plus d'informations sur le bruit à la question.
JCooper
@ Max, je l'ai vu. Mais c'est un site pour un produit commercial à boîte noire. C'est la formule réelle qui m'intéressait. Cela commence à sembler qu'il n'y a pas de solution de forme fermée et je vais devoir utiliser une approche numérique à la place (c'est ce que je suppose que le logiciel nlReg fait également).
JCooper
il semble que cela pourrait être un problème de minimisation simple avec une fonction objectif non linéaire (celle que vous avez mentionnée ci-dessus). si les erreurs sont supposées être gaussiennes, il vous suffit de calculer les paramètres de distribution des erreurs une fois que vous avez trouvé le centre de la sphère minimisant la fonction objectif. modifier: j'ai laissé la page ouverte trop longtemps et je n'ai pas vu votre commentaire. nous avons la même idée.
supposé normal
2
re Edit 3: Étant donné , est facile à trouver. Pour obtenir , la méthode de Newton doit converger rapidement à partir d'une valeur de départ raisonnable obtenue comme dans (3). (x0,y0,z0)r(x0,y0,z0)
whuber

Réponses:

3

Voici un Rcode qui montre une approche utilisant les moindres carrés:

# set parameters

mu.x <- 8
mu.y <- 13
mu.z <- 20
mu.r <- 5
sigma <- 0.5

# create data
tmp <- matrix(rnorm(300), ncol=3)
tmp <- tmp/apply(tmp,1,function(x) sqrt(sum(x^2)))

r <- rnorm(100, mu.r, sigma)

tmp2 <- tmp*r

x <- tmp2[,1] + mu.x
y <- tmp2[,2] + mu.y
z <- tmp2[,3] + mu.z


# function to minimize
tmpfun <- function(pars) {
    x.center <- pars[1]
    y.center <- pars[2]
    z.center <- pars[3]
    rhat <- pars[4]

    r <- sqrt( (x-x.center)^2 + (y-y.center)^2 + (z-z.center)^2 )
    sum( (r-rhat)^2 )
}

# run optim
out <- optim( c(mean(x),mean(y),mean(z),diff(range(x))/2), tmpfun )
out


# now try a hemisphere (harder problem)

tmp <- matrix(rnorm(300), ncol=3)
tmp[,1] <- abs(tmp[,1])
tmp <- tmp/apply(tmp,1,function(x) sqrt(sum(x^2)))

r <- rnorm(100, mu.r, sigma)

tmp2 <- tmp*r

x <- tmp2[,1] + mu.x
y <- tmp2[,2] + mu.y
z <- tmp2[,3] + mu.z

out <- optim( c(mean(x),mean(y),mean(z),diff(range(y))/2), tmpfun )
out

Si vous ne l'utilisez pas, Rvous devriez toujours pouvoir suivre la logique et la traduire dans une autre langue.

Techniquement, le paramètre de rayon doit être limité par 0, mais si la variabilité est petite par rapport au vrai rayon, alors la méthode illimitée devrait fonctionner correctement, ou optim a des options pour faire l'optimisation limitée, (ou vous pouvez simplement faire la valeur absolue de la rayon dans la fonction pour minimiser).

Greg Snow
la source
+1 C'est vraiment cool. Pour des raisons purement égoïstes, j'aimerais voir un montage qui (1) explique pourquoi le centroïde des points d'échantillonnage est une estimation biaisée du vrai centre de la sphère, et (2) un ou deux commentaires ajoutés au code expliquant la logique du fonction de minimisation, comme solution pour éviter le biais d'utilisation du centroïde.
Alexis