表面上の点から球の中心と半径を推定する


9

データポイントが球の表面から(ある程度の摂動を伴って)サンプリングされたと仮定すると、その球の中心をどのように回復できますか?

検索の結果、「球形回帰」というラベルの付いた論文が見つかりましたが、同じことをしているようには見えませんでした。多分私はそれを理解していませんでした。

線形回帰に似た、球の表面からの一連のデータポイントの合計二乗距離を最小にする球の中心点と半径を求める簡単な式はありますか?


編集1:

ノイズは、球の半径よりも2桁または3桁小さく、ガウス分布は均一であると想定できます。ただし、サンプル自体は球の表面から確実に均一に描画されるわけではありませんが、表面上のいくつかのパッチにクラスター化されている可能性が高く、すべてが1つの半球内にある可能性があります。でデータを処理するソリューションR 結構ですが、任意の次元の一般的な解決策も素晴らしいです。


編集2:

線形回帰を使用した場合、私が賢明な答えを得る可能性は何ですか、 y=バツβ+ε、二乗された成分が他のパラメーターから独立しているふりをする7次元空間で:

バツ=[2バツ2y2z1111]β=[バツ0y0z0バツ02y02z02r2]y=バツ2+y2+z2

せいぜい、私のエラーメトリックは少し変わっていると思います。最悪の場合、ソリューションは一貫性に近づくことさえありません。
...または4つの同じ列があると、回帰を行おうとすると特異行列が得られるため、これはばかげています。


編集3:

だから、これらは私のオプションのようです:

  1. いくつかのコスト関数を使用した非線形数値最適化: fバツ0y0z0r|バツ=12Σ=1rバツバツ02+yy02+zz022
  2. ハフ変換:考えられる空間または考えられる中心とデータポイントの周りの半径を離散化します。各ポイントは、特定の半径の離散化の一部となる可能性のある中心に投票します。ほとんどの票が勝つ。球の数が不明である可能性がある場合、これは問題ないかもしれませんが、球が1つだけの場合は、面倒なソリューションです。
  3. 4ポイントのグループをランダムに(または体系的に)選択し、分析的に中心を計算します。条件が悪い場合、サンプリングを拒否します(ポイントはほぼ同一平面上にあります)。外れ値を拒否し、平均中心を見つけます。それから平均半径を見つけることができます。

誰かがより良い方法を持っていますか?


質問の2つの形式は同等ではないことに注意してください。摂動の性質について強い仮定がない限り、表面からの距離の2乗の合計を最小化することが最良の推定を与えるとは限りません。したがって、摂動がどのように発生するか(そして、摂動が球体のサイズと比較してどのくらい大きいか)について詳しく知ることが役立つでしょう。また、球はいくつの次元にありますか?
whuber

@whuber私は、球の表面の最も近い点からのデータの二乗和距離を最小化するものとして最適を定義するつもりでした。私は、伴う仮定についてはあまり考えませんでした。比例して小さなエラーが予想されます。したがって、関数が最小化しているものを知りたいのですが、正確なメトリックはそれほど重要ではありません。ノイズに関する詳細情報を質問に追加しました。
JCooper、2012年

@Max私はそれを見ました。しかし、それはブラックボックス商品のサイトです。それは私が興味を持っていた実際の式です。閉じた形のソリューションがないように見え始めており、代わりに数値アプローチを使用する必要があります(これは、nlRegソフトウェアも実行していると想定しています)。
JCooper、2012年

これは、非線形目的関数(上で述べたもの)の直線最小化問題である可能性があるようです。エラーがガウスであると想定される場合、目的関数を最小化する球の中心を見つけたら、エラーの分布パラメーターを計算するだけで済みます。編集:ページを長時間開いたままにしたため、コメントが表示されませんでした。私たちは同じ考えを持っています。
通常の

2
再編集3:与えられた バツ0y0z0r見つけやすいです。入手するバツ0y0z0、ニュートン法は、(3)で得られた妥当な開始値から急速に収束するはずです。
whuber

回答:


3

以下は、R最小二乗法を使用した1つのアプローチを示すコードです。

# 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

使用しない場合Rでも、ロジックに従って、それを別の言語に翻訳できます。

技術的には、radiusパラメータは0によって制限されますが、真の半径に比べて変動が小さい場合は、unboundedメソッドが正常に機能するか、optimが制限付き最適化を実行するためのオプションを持っています(または、最小化する関数の半径)。


+1これは本当にクールです。純粋に利己的な理由で、(1)サンプルポイントの重心が球の真の中心の偏った推定である理由を説明する編集、および(2)コードのロジックを説明するコードに追加されたコメントまたは2つを見てみたいと思います。重心を使用するバイアスを回避するための解決策としての最小化関数。
アレクシス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.