如何解决通过旋转将 PCA 组件与笛卡尔轴对齐
我正在尝试旋转点云,以使最不重要的 PCA 组件与 z 轴对齐,但收效甚微。
我先计算PCA分量
U,S,Vt = np.linalg.svd(vertices - vertices.mean(axis=0),full_matrices=False)
但是后来我在构建旋转矩阵时遇到了麻烦,我尝试了 scipy.spatial.transform.Rotation
和 from_rotvec()
方法,但我不确定我做错了什么,因为结果看起来不像我预期的那样。
angles = np.arctan2(Vt[:,2],np.array([0,1]))
rot = scipy.spatial.transform.Rotation.from_rotvec(angles)
new_vertices = np.dot(vertices,rot.T)
解决方法
我生成的示例数据如下
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;
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)
plt.title('rotated vertices')
plt.scatter(vr[:,vr[:,6])
基本上X = U[:,:2] @ np.diag(S) @ Vt
,
np.allclose(U[:,:2] @ np.diag(S) @ Vt,vc)
U
是正交的,S
只是缩放 U
的列,Vt
应用旋转。如果我们将等式两边乘以 inv(Vt) = Vt.T
,我们得到对齐的点。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。