削除した回答のフォローアップ...塗りつぶした楕円を取り、すべてのポイントを軸に投影すると、円形の分布で、より多くのポイントが極値よりも原点の近くに投影されます。ガウス分布ではなく、削除された回答の1次元アナロジーで述べた均一分布でもありません。結果の分布には、実際にはpdfがあり、そこから標準偏差があることを計算できます。バツp(x)=(1−(xr)2)−−−−−−−−√r2
したがって、半径楕円(軸は軸と軸)の内部にデータが均一に分布している場合、座標の標準偏差はであり、座標の標準偏差です。ある。したがって、使用する必要がある補正係数は単純に2です。a,bxyxa2yb2
以下は、内部からランダムにサンプリングされた点から楕円の中心(変換行列)、回転行列、および半径を回復するPythonで動作する例です。
import numpy
# Generate some points distributed uniformely along an ellipse
x = 2 * (numpy.random.rand(10000, 1) - 0.5)
y = 2 * (numpy.random.rand(10000, 1) - 0.5)
d = (x / 0.5) ** 2 + (y / 0.25) ** 2
inside = numpy.where(d < 1)[0]
x = x[inside]
y = y[inside]
data = numpy.hstack((x, y)).T
# Now rotate by 0.5 rad and translate it to (4, -8)
angle = 0.5
rotation = numpy.array([
[numpy.cos(0.4), -numpy.sin(0.4)],
[numpy.sin(0.4), numpy.cos(0.4)]])
data = numpy.dot(rotation, data)
data[0, :] += 4
data[1, :] -= 8
# Step 1: center the data to get the translation vector.
print 'Translation', data.mean(axis=1)
data -= numpy.reshape(data.mean(axis=1), (2, 1))
# Step 2: perform PCA to find rotation matrix.
scatter = numpy.dot(data, data.T)
eigenvalues, transform = numpy.linalg.eig(scatter)
print 'Rotation matrix', transform
# Step 3: Rotate back the data and compute radii.
# You can also get the radii from smaller to bigger
# with 2 / numpy.sqrt(eigenvalues)
rotated = numpy.dot(numpy.linalg.inv(transform), data)
print 'Radii', 2 * rotated.std(axis=1)