Continuando con mi respuesta eliminada ... Si toma una elipse llena y proyecta todos los puntos en el Xeje, se proyectarán más puntos cerca del origen que en los extremos, en una distribución de forma circular. No es una distribución gaussiana, y no la distribución uniforme que mencioné en la analogía 1-D en mi respuesta eliminada. La distribución resultante en realidad tiene pdfp ( x ) =( 1 - (Xr)2)--------√, y desde allí puede calcular que la desviación estándar es r2.
Por lo tanto, si los datos se distribuyen uniformemente en el interior de una elipse de radios a , b (cuyos ejes son el X y y ejes), la desviación estándar de la X coordenada es una2 y de la y coordenada es si2. Entonces, el factor de corrección que necesita usar es simplemente 2.
Aquí hay un ejemplo trabajado en python que recupera el centro (matriz de traducción), la matriz de rotación y los radios de una elipse desde puntos muestreados aleatoriamente desde su interior:
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)