首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >通过旋转将PCA分量与笛卡儿轴对齐

通过旋转将PCA分量与笛卡儿轴对齐
EN

Stack Overflow用户
提问于 2021-04-15 20:57:42
回答 1查看 176关注 0票数 0

我试图旋转我的点云,使最不重要的PCA分量与z轴对齐,但收效甚微。

我首先计算PCA分量

代码语言:javascript
复制
U, S, Vt = np.linalg.svd(vertices - vertices.mean(axis=0), full_matrices=False)

但我在构造旋转矩阵时遇到了麻烦,我尝试了使用from_rotvec()方法的scipy.spatial.transform.Rotation,但我不确定我做错了什么,因为结果看起来并不像我预期的那样。

代码语言:javascript
复制
angles = np.arctan2(Vt[:, 2], np.array([0, 0, 1]))
rot = scipy.spatial.transform.Rotation.from_rotvec(angles)
new_vertices = np.dot(vertices, rot.T)
EN

Stack Overflow用户

回答已采纳

发布于 2021-04-17 03:01:27

我生成一个示例数据,如下所示

代码语言:javascript
复制
import numpy as np;
import matplotlib.pyplot as plt

vertices = np.random.randn(10000, 2) / 2
vertices[:, 0] *= 3
vertices[:, 1] += vertices[:, 0] * 0.5;
代码语言:javascript
复制
vc = vertices - vertices.mean(axis=0)
U, S, Vt = np.linalg.svd(vc)
vr = vc @ Vt.T

plt.figure(figsize=(10, 5))
plt.subplot(1,2,1)
plt.title('original vertices')
plt.scatter(vc[:, 0], vc[:, 1], alpha=0.1), plt.xlim([-6, 6]), plt.ylim([-6, 6])
plt.subplot(1,2,2)
plt.title('rotated vertices')
plt.scatter(vr[:, 0], vr[:, 1], alpha=0.1), plt.xlim([-6, 6]), plt.ylim([-6, 6])

基本上就是X = U[:, :2] @ np.diag(S) @ Vt

代码语言:javascript
复制
np.allclose(U[:, :2] @ np.diag(S) @ Vt, vc)

U是正交的,S只是缩放U的列,而Vt应用旋转。如果我们将方程的两边乘以inv(Vt) = Vt.T,我们就得到了对齐点。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67108932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档