Theo dõi câu trả lời đã bị xóa của tôi ... Nếu bạn lấy một hình elip đầy và chiếu tất cả các điểm lên trục , nhiều điểm sẽ được chiếu gần gốc hơn so với cực trị, trong phân bố hình tròn. Không phải là phân phối gaussian và không phải là phân phối đồng nhất mà tôi đã đề cập trong tương tự 1-D trong câu trả lời bị xóa của tôi. Phân phối kết quả thực sự có pdf và từ đó bạn có thể tính toán độ lệch chuẩn là .xp(x)=(1−(xr)2)−−−−−−−−√r2
Do đó, nếu dữ liệu được phân bố đồng đều ở bên trong hình elip của bán kính (có trục là trục và ), độ lệch chuẩn của tọa độ là và của tọa độ là . Vì vậy, hệ số hiệu chỉnh bạn cần sử dụng chỉ đơn giản là 2.a,bxyxa2yb2
Dưới đây là một ví dụ hoạt động trong việc python phục hồi trung tâm (ma trận dịch), ma trận xoay và bán kính của một hình elip từ các điểm được lấy mẫu ngẫu nhiên từ bên trong của nó:
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)