PCA降维算法原理与实现,0基础开始讲解,新手强烈推荐!!!(Python, sklearn, 机器学习)

Principal Component Analysis (PCA) Explained | Built InPrincipal Component Analysis (PCA) can help reduce dimensionality in large data sets. Learn how to use PCA and understand how it works.icon-default.png?t=N7T8https://builtin.com/data-science/step-step-explanation-principal-component-analysis

        上面是PCA的一篇比较详细的博客,我将其贴在这里,感兴趣的同学可以深入了解一下,我们这里说的比较浅层。

介绍

        主成分分析(Principal Component Analysis,PCA)是一种常用的数据降维技术,广泛应用于统计学、机器学习和数据科学等领域。它的主要目标是通过将数据从高维空间映射到低维空间,以保留数据的主要特征,并减少数据的维度。

        其典型的应用场景包括:

  1. 数据降维:提取主要特征,减少算法的计算量
  2. 高维数据可视化:将高维数据通过PCA降维为2或3维,便于进行可视化。
  3. ...

原理

        对于PCA算法而言,可以分为五个基本的步骤。下面我们一个步骤一个步骤的进行说明。注意,这里不涉及太多的数学计算,感兴趣看最上面的卡片链接。主要还是思路以及sklearn应用。

        注意:下面所有图均来自于卡片链接中博客的原图,我这里属于搬运。

数据标准化

        首先我们需要知道,PCA其中的如何判断一个坐标轴上的信息多不多呢?其是这么认为的,以一个二维的点集为例子,我们进行轴的旋转,那么将点投影到轴上,然后计算方差。而PCA则是认为方差越大代表该轴能表达的信息量越多。因此,若不对于所有坐标轴进行标准化操作,那么方差的计算将会明显收到范围大的某一维的数据的影响。所以,PCA的第一步就是对于数据集中的每一维的特征进行一个标准化

计算协方差矩阵

        这里其实我们直接简单的理解,就是计算数据集中不同维度之间的相关性,并且我们还要利用协方差矩阵计算第三步中的特征向量与特征值。比如说,如果我的点坐标有(x, y, z)三个维度,那么我就会得到一个 3 * 3 的协方差矩阵,其中对角线代表其本身的方差。

        哦对,其中所有的估计都是无偏估计。这里需要提醒一下。       

        大家如果不熟悉协方差的计算的话,可以自己去搜一下,解释很多,而且说实话在这里并不重要,这主要是一个计算的中间量。我们写代码的时候也并不会考虑到这五个步骤,人家封装好了,我们直接调用就好了。

计算特征矩阵与特征值

        我们利用协方差矩阵计算特征向量与特征值。这里同样过程我们不详细介绍,感兴趣的去搜索一下相关博客,很多。我们直接从结果分析,以一个二维的点集为例子,我们可以得到这样一个值。

        然后这里的理解就很重要了!!!关于v1和v2,λ1 和 λ2怎么算出来的,不重要,人家很多函数都封装好了,写代码我们基础完全不用考虑这个。但是如何理解,就非常重要了!

        就按照图片中的例子来说,我们得到了v1和v2两个特征向量,而且每个特征向量对应的有一个特征值λ。在PCA中,这个λ就直接可以理解为信息量,而特征向量则代表每个原始坐标轴的比例。这么说或许还是很模糊,那么我就以一个例子来说,上面的点集不是(x, y)二维的,那么我们利用v1得到的新坐标轴则是: 0.67 * x + 0.73 * y (要将x和y标准化先哈)。因此这样我们就可以理解了为什么大家说:PCA得到的新特征是以往特征的线性组合,可读性差,没有真实的物理意义,其原因就在这里。

        当然,在PCA计算中,我们要将λ按照值把特征值和特征向量进行一个降序排序,让λ大,信息含量多的特征向量放在前面作为最主要成分。所以PCA中信息量的可视化大概就是这样的:

得到特征向量

        这个就很简单,我们不是在前一步把特征向量进行降序排序了吗,我们看我们需要几个维度的数据,那么我们就进行特征向量的列方向上的拼接,以第三步中的数据如下,若我们需要2个维度的数据,那么我们的特征向量即为:

映射

        就是跟第三步我说的线性组合一样的,只不过是矩阵的计算方式。代码里效率更快。

代码

        PCA代码集成在了sklearn中,主要是dimentional reduction中,我把网页链接分享给大家。有兴趣的可以自己去看。还是建议大家要养成看文档的习惯SKLearn-PCA简介与基本使用icon-default.png?t=N7T8https://scikit-learn.org/stable/modules/decomposition.html        这里以高维数据的可视化作为案例,将高维数据降维为2维,并可视化在坐标中。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_wine
from sklearn.decomposition import PCA

# load wine datasets
data = load_wine()
features = data.data    # (178, 13), which feature has 13 dims
label = data.target[:, np.newaxis]  # (178, ) -> (178, 1)

# use PCA to reduce feature dims to 2 
pca = PCA(n_components=2)
cor = pca.fit_transform(features)   # (178, 2)

# plot points
plt.scatter(cor[:, 0], cor[:, 1], c=label)

        结果如下:

        可以看见,相同种类的点还是差不多在一块的。

参数:

用kimi总结了一下,还是建议大家看原文档。

  1. n_components:

    • 类型:intNone,默认为 None
    • 意义:指定要保留的主成分数量。如果设置为 None,则保留所有成分。
  2. copy:

    • 类型:bool,默认为 True
    • 意义:如果设置为 True,则数据矩阵的副本将被计算,原始数据不会被修改。如果设置为 False,算法会尝试修改数据矩阵,这可能会提高性能,但会改变原始数据。
  3. whiten:

    • 类型:bool,默认为 False
    • 意义:如果设置为 True,则数据将被白化(即转换后的主成分将具有单位方差,并且彼此不相关)。这通常用于数据预处理。
  4. svd_solver:

    • 类型:{'auto', 'full', 'arpack', 'randomized'},默认为 'auto'
    • 意义:指定用于计算奇异值分解(SVD)的算法。'auto' 会根据数据的大小和特征自动选择最合适的方法。
  5. tol:

    • 类型:float,默认为 0.0
    • 意义:当使用 ARPACK 或随机化方法时,这个参数定义了奇异值截断的容忍度。
  6. iterated_power:

    • 类型:int'auto',默认为 'auto'
    • 意义:当使用随机化方法时,这个参数定义了迭代次数。'auto' 会根据数据的大小自动选择迭代次数。
  7. n_oversamples:

    • 类型:int,默认为 10
    • 意义:当使用随机化方法时,这个参数定义了过采样的数量,即在随机化算法中使用的额外特征数量。
  8. power_iteration_normalizer:

    • 类型:{'auto', 'QR', 'LU', 'none'},默认为 'auto'
    • 意义:定义了在随机化方法中使用的归一化策略,用于加速奇异值分解。
  9. random_state:

    • 类型:intRandomState 实例或 None,默认为 None
    • 意义:当 svd_solver'arpack''randomized' 时,这个参数用于控制随机数生成器的状态,以确保结果的可重复性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

香蕉也是布拉拉

随缘打赏不强求~ 谢谢大家

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值