Seguindo minha resposta excluída ... Se você fizer uma elipse preenchida e projetar todos os pontos no xNo eixo, mais pontos serão projetados perto da origem do que nos extremos, em uma distribuição em forma circular. Não é uma distribuição gaussiana, nem a distribuição uniforme que mencionei na analogia 1-D na minha resposta excluída. A distribuição resultante na verdade tem pdfp ( x ) =( 1 - (xr)2)--------√e a partir daí você pode calcular que o desvio padrão é r2.
Assim, se os dados são distribuídos uniformemente no interior de uma elipse de raios a , b (cujos eixos são os x e y eixos), o desvio padrão da x coordenada é uma2 e do y coordenada é b2. Portanto, o fator de correção que você precisa usar é simplesmente 2.
Aqui está um exemplo trabalhado em python recuperando o centro (matriz de translação), matriz de rotação e raios de uma elipse a partir de pontos amostrados aleatoriamente em seu 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)