PCA主成分分析原理及其python代码复现

PCA(主成分分析)是什么

降维算法:保留原始数据的关键信息
注意:在降维过程中,维度通常是指特征的数量,而不是空间的维度。

主成分分析(PCA)是一个常见的特征提取方法,它通过找到数据中的主成分(方差最大的方向)来实现降维。
通俗理解,就是寻找新的坐标系,使得数据尽可能分布在一个或几个坐标轴上,同时尽可能保留原先数据分布的主要信息,使原先高维度的信息,在转换后能用低维度的信息来保存。而新坐标系的坐标轴,称为主成分(Principal components, PC),这也就是PCA的名称来源。

为什么找方差最大的方向?
在信号处理领域中认为信号具有较大的方差,噪声有较小的方差;信噪比就是信号与噪声的方差比,越大意味着数据的质量越好。

PCA(主成分分析)用来干什么的,好处

通过保留主要特征来捕捉数据的重要结构,使得模型更快收敛。
展开来说,PCA去除噪声和不重要的特征,将多个指标转换为少数几个主成分,这些主成分是原始变量的线性组合,且彼此之间互不相关,其能反映出原始数据的大部分信息,而且可以提升数据处理的速度。

PCA(主成分分析)怎么实现的(三步)

PCA方法的总结
标准化(去中心化);
从协方差矩阵或相关矩阵中获取特征向量和特征值,或执行奇异值分解SVD;
按降序对特征值进行排序,并选择 k k k个与最大特征值相对应的特征向量,其中 k k k是新特征子空间的维数( k ≤ p k≤p kp);
将选择的 k k k个特征向量构造为投影矩阵 W W W
通过 W W W对原始数据集 X X X进行变换,得到 k k k维特征子空间 Y Y Y

准备数据集

关于Iris数据集
scikit-learn中的鸢尾花数据集(Iris dataset),一共包含150张图片。
3种鸢尾花:山鸢尾(50张)、杂色鸢尾(50张)、维吉尼亚鸢尾(50张)。
4个特征:萼片长度(厘米)、萼片宽度(厘米)、花瓣长度(厘米)、花瓣宽度(厘米)。
在这里插入图片描述
加载数据集
加载数据集

import pandas as pd

# load-dataset
df = pd.read_csv(
    filepath_or_buffer='https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data',
    header=None,
    sep=',')
df.columns = ['sepal_len', 'sepal_wid', 'petal_len', 'petal_wid', 'class']
df.dropna(how="all", inplace=True)  # drops the empty line at file-end

df.tail()

运行结果
在这里插入图片描述
划分成 数据 X X X、标签 y y y

# split data table into data X and class labels y
X = df.iloc[:, 0:4].values
y = df.iloc[:, 4].values

数据集为 150 × 4 150×4 150×4的矩阵,不同列代表不同特征,每行为1个样本,每个样本行x可以被描述为一个4维向量。
在这里插入图片描述
可视化数据分布

from matplotlib import pyplot as plt
import seaborn as sns

# 设置 seaborn 的样式为 whitegrid
sns.set_style("whitegrid")

label_dict = {
   1: 'Iris-Setosa',
              2: 'Iris-Versicolor',
              3: 'Iris-Virgnica'}

feature_dict = {
   0: 'sepal length [cm]',
                1: 'sepal width [cm]',
                2: 'petal length [cm]',
                3: 'petal width [cm]'}

plt.figure(figsize=(8, 6))
for cnt in range(4):
    plt.subplot(2, 2, cnt + 1)
    for lab in ('Iris-setosa', 'Iris-versicolor', 'Iris-virginica'):
        plt.hist(X[y == lab, cnt],
                 label=lab,
                 bins=10,
                 alpha=0.3, )
    plt.xlabel(feature_dict[cnt])
plt.legend(loc='upper right', fancybox=True, fontsize=8)

plt.tight_layout()
plt.show()

运行结果
在这里插入图片描述
标准化

归一化:将数据映射到[0,1]或[-1,1]区间范围内,不同特征的量纲不同,值范围大小不同,存在奇异值,对训练有影响。

标准化:将数据映射到满足标准正态分布的范围内,使数据满足均值为0,标准差为1。

去中心化:使数据满足均值为0,但对标准差没有要求。

每种方法对应的使用场景
1.若对数据的范围没有限定要求,则选择标准化进行数据预处理
2.若要求数据在某个范围内取值,则采用归一化。
3若数据不存在极端的极大极小值时,采用归一化。
4.若数据存在较多的异常值和噪音,采用标准化。

标准化过程如下:
1、计算每个特征(每一列,共p个特征)的均值 x i ˉ \bar{x_i} xiˉj和标准差 S j S_j Sj,公式如下: x i ˉ = 1 n ∑ i = 1 n x i j \bar{x_i}=\frac{1}{n}\sum_{i=1}^nx_{ij} xiˉ=n1i=1nxij S j = ∑ i = 1 n ( x i j − x j ˉ ) 2 n − 1 S_j=\sqrt{\frac{\sum_{i=1}^n(x_{ij}-\bar{x_j})^2}{n-1}} Sj=n1

### Python 点云配准代码实现教程 #### 使用PCA进行点云粗略配准 为了使用主成分分析(PCA)来执行点云的初步对齐,可以按照以下方式编写Python脚本: ```python import numpy as np from sklearn.decomposition import PCA def load_point_cloud(file_path): """加载点云数据""" data = np.loadtxt(file_path, delimiter=',') return data[:, :3] point_cloud_data = load_point_cloud('path_to_your_file.txt') # 替换为实际文件路径[^1] # 初始化PCA模型并拟合点云数据 pca_model = PCA(n_components=3) principal_components = pca_model.fit_transform(point_cloud_data) print("Principal components:\n", principal_components) ``` 这段程序展示了如何导入必要的库以及定义`load_point_cloud()`函数用于读取存储于文本文件中的三维坐标。接着创建了一个PCA实例对象,并通过调用`.fit_transform()`方法计算出给定点集的主要方向。 #### 利用Coherent Point Drift (CPD) 进行精确配准 对于更精细级别的点云注册任务,则推荐采用基于概率论框架下的连贯点漂移(CPD)算法。这里给出一段简单的例子说明怎样借助PyCPD库完成此操作: ```python from pycpd import rigid_registration source_points = ... # 来源点集合 target_points = ... # 目标点集合 registrator = rigid_registration(**{'X': source_points, 'Y': target_points}) (T, _, _) = registrator.register() transformed_source = T @ source_points.T ``` 上述片段中初始化了刚体变换类型的CPD估计器(`rigid_registration`),并通过传递两个形状相同的numpy数组作为参数启动迭代优化流程直至收敛得到最优解T;最后应用该转换矩阵到原始输入上获得最终重叠效果良好的结果[^2]。 #### Open3D 库中的ICP 配准功能 Open3D提供了便捷易用接口来进行交互式可视化编辑处理大规模几何结构化信息的同时也包含了多种经典的点云匹配技术比如Iterative Closest Point (ICP): ```python import open3d as o3d # 假设已获取预处理后的点云pcd0 和 pcd1 threshold = 0.02 trans_init = np.asarray([[1., 0., 0., 0.], [0., 1., 0., 0.], [0., 0., 1., 0.], [0., 0., 0., 1.]]) result = o3d.pipelines.registration.registration_icp( pcd0, pcd1, threshold, trans_init, o3d.pipelines.registration.TransformationEstimationPointToPoint()) print(result.transformation) draw_registration_result(pcd0, pcd1, result.transformation) ``` 在此处设置好初始猜测姿态后即可调用内置工具包内提供的API轻松达成目的。值得注意的是这里的阈值设定应当依据具体应用场景灵活调整以期达到最佳性能表现[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值