总结一下 PCA 的算法步骤:
设有 m 条 n 维数据。
- 将原始数据按列组成 n 行 m 列矩阵 X;
- 将 X 的每一行进行零均值化,即减去这一行的均值;
- 求出协方差矩阵
;
- 求出协方差矩阵的特征值及对应的特征向量;
- 将特征向量按对应特征值大小从上到下按行排列成矩阵,取前 k 行组成矩阵 P;
即为降维到 k 维后的数据。
def PCA(data, correlation=False, sort=True):
# 屏蔽开始
data_mean = np.mean(data,axis=0)
# 归一化
normalize_data =data -data_mean
# SVD分解
H = np.dot(normalize_data,normalize_data.T)
# u:At*A的特征向量 s:At*A和A*At的特征值 v:A*At的特征向量
eigenvectors,eigenvalues,eigenvectors_t = np.linalg.svd(H)
print()
# 屏蔽结束
# 排序
if sort:
sort = eigenvalues.argsort()[::-1]
eigenvalues = eigenvalues[sort]
eigenvectors = eigenvectors[:, sort]
return eigenvalues, eigenvectors
# 加载原始点云
point_cloud_pynt = PyntCloud.from_file("table_scene_lms400.pcd")
point_cloud_o3d = point_cloud_pynt.to_instance("open3d", mesh=False)
# o3d.visualization.draw_geometries([point_cloud_o3d]) # 显示原始点云
# 从点云中获取点,只对点进行处理
points = point_cloud_pynt.points
print('-------total points number is:', points.shape[0])
# 用PCA分析点云主方向
w, u = PCA(points)
point_cloud_vector = u[:,0:2] #点云主方向对应的向量
sampling_point=np.dot(point_cloud_vector,points)
print(sampling_point)
转载:pca降维