主成分分析一般用于数据降维,在应用主成分分析包scikit-learn时注意以下四点 1、用pca.components_可以获取特征向量,且特征向量为行向量,例如W = pca.components_[0, :] (或W = pca.components_[0])为第一特征向量,而W = pca.components_[1, :]表示第二特征向量。。。 2、采用特征向量对点云进行处理,想要得到结果先要进行中心化再点乘即: p_t = np.dot(points - np.mean(points, axis=0), W.t) 这里W要转置 3、转换后点云(point_cloud_trans = pca.transform(point_cloud))的第几列数据就表示第几主成分点云,则point_cloud_trans[:, 0]表示在第一主成分上的投影点, point_cloud_trans[:, 1]表示在第二主成分的投影点,依次类推。。 4. 对于H型钢横截面的提取,则需要获取其第二和第三主成分的点构成的截面。第一主成分为沿着H型钢方向,因为所有点在第一主成分轴上的投影点距离中心的距离平方和最大。
以下代码用特征向量转换和直接用pca.transform方法对H型钢点云的第一和第二主成分组成的平面图形进行绘制。
# 1、用pca.components_可以获取特征向量,且特征向量为行向量,例如W = pca.components_[0, :] 为第一特征向量
# 2、采用特征向量对点云进行处理,想要得到结果先要进行中心化再点乘 p_t = np.dot(points - np.mean(points, axis=0), W.t) 这里W要转置
# 3、转换后点云的第几列数据就表示第几主成分点云,例如point_cloud_trans = pca.transform(point_cloud),
# 则point_cloud_trans[:, 0]表示在第一主成分上的投影点, point_cloud_trans[:, 1]表示在第二主成分的投影点,依次类推
# 4. 对于H型钢横截面的提取,则需要获取其第二和第三主成分的点构成的截面,因为第一主成分为沿着H型钢方向
## 采用scikit-learn 进行主成分分析(PCA)
import numpy as np
import open3d as o3d
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
# 读取点云
pcd = o3d.io.read_point_cloud("H.txt", format="xyz")
point_cloud = np.array(pcd.points) # N * 3
# 创建pca对象
pca = PCA(n_components=3)
# 训练
pca.fit(point_cloud)
# 转换
point_cloud_trans = pca.transform(point_cloud) # 转换后仍然是N * 3
# 通过特征向量求第一主成分
eigen_vector = pca.components_ # 3 * 3
# 第一和第二组成分向量,是行向量
W = eigen_vector[[0, 1], :] # 2 * 3
# 转换
point_cloud_trans_one_new = np.dot(point_cloud - np.mean(point_cloud, axis=0), W.T)
plt.figure()
plt.scatter(point_cloud_trans[:, 0], point_cloud_trans[:, 1], color='red')
plt.scatter(point_cloud_trans_one_new[:, 0], point_cloud_trans_one_new[:, 1], color='blue')
plt.show()
使用scikit-learn进行主成分分析(PCA)
文章介绍了如何使用Python的scikit-learn库进行主成分分析(PCA),包括获取特征向量、数据中心化、点云转换以及如何解释主成分。通过示例展示了如何处理H型钢点云数据,提取其第一和第二主成分,用于绘制横截面。
136

被折叠的 条评论
为什么被折叠?



