机器学习——PCA

一、pca简介

PCA(Principal Component Analysis,主成分分析)是一种常用的数据降维技术,它可以将高维数据转换为低维数据,同时保留数据的关键特征。在机器学习和数据分析中,PCA 可以帮助减少特征的数量,降低计算成本,去除噪声并防止过拟合。

1.1、标准化

PCA标准化过程主要包括中心化和Z-score标准化。在进行主成分分析(PCA)的过程中,数据的标准化是至关重要的一步,它直接影响到PCA结果的准确性和可靠性。数据标准化通常包括两个步骤:中心化和Z-score标准化。

中心化,也称为去均值化或零均值化,是通过将每个数据点减去整个数据集的均值来实现的。这一步骤确保了数据集的新的几何中心位于坐标轴的原点上。在PCA中,中心化是为了消除数据的平均值,从而使方差成为衡量数据离散程度的唯一标准。这样做可以简化后续计算,因为去除了数据集中的平移效应,只关注数据点之间的相对位置。

Z-score标准化则是通过将中心化后的数据除以标准差来实现的。这种标准化方法不仅保留了数据间的差异性,还使得不同特征之间具有可比性。在PCA中,Z-score标准化的目的是消除不同特征可能存在的量纲差异,从而保证所有特征对PCA结果的影响是公平的。经过Z-score标准化,得到的新数据集将符合标准正态分布,即均值为0,标准差为1。

1.2、计算协方差矩阵

PCA通过计算数据的协方差矩阵,进而对数据进行降维和特征提取。在数据处理和机器学习领域,主成分分析(PCA)是一种广泛使用的技术,旨在通过降维的方式,从高维数据中提取关键特征,同时尽可能保持原数据的主要信息。这一过程涉及到协方差矩阵的计算,它为理解数据的特征之间关系提供了基础。

PCA的基础在于理解协方差矩阵的重要性。一个数据集的协方差矩阵能够表达不同维度间的相关性,其中对角线上的元素代表各维度的方差,而其它元素则表示不同维度间的协方差。计算协方差矩阵通常包括以下步骤,首先对样本矩阵进行中心化处理,即每一维度减去该维度的均值;其次,用中心化后的样本矩阵乘以其转置;最后,除以样本数量减一以得到协方差矩阵。

PCA的实质是对协方差矩阵进行谱分解,从而找到数据中的主成分,即那些能最大程度解释数据变异性的方向。这些方向由协方差矩阵的特征值和特征向量确定,它们分别代表了成分的重要性和方向。特征向量构成的新坐标系是原始数据在该空间的投影,这样做可以最大化投影后方差,从而保留尽量多的信息。

在进行PCA时,还需要注意主成分的选择问题。选取多少个主成分以及如何评估一个主成分所能解释的数据变化大小是PCA应用中的关键考量。通常情况下,会选取那些特征值之和占所有特征值总和一定比例(如85%)的主成分。这种策略既保证了信息的压缩,又尽量减少了信息的丢失。

1.3计算特征值和特征值向量

特征值和特征向量是PCA算法中核心的计算对象,它们决定了数据降维后的主成分方向和大小

在主成分分析(PCA)中,特征值和特征向量不仅起着至关重要的作用,它们的计算是整个算法的核心。特征值和特征向量分别表示了数据在不同方向上的方差大小和这些方向本身。通过对协方差矩阵进行数学分解,可以得到这些特征值和对应的特征向量,从而构建出一个新的低维数据空间,该空间能够尽可能保留原始数据的主要信息。

首先,PCA的目标是寻找一个低维的数据表示,同时尽可能保留原始数据的变异性。这一目标是通过计算数据协方差矩阵的特征值和特征向量来实现的。特征值表示对应特征向量方向上的方差大小,而特征向量则定义了数据的新坐标系。

其次,特征值越大,意味着对应的特征向量方向上的方差越大,这个方向上的数据变化就更加明显。因此,PCA通过保留最大的几个特征值对应的特征向量来近似表示原数据,从而达到降维的目的。

最后,在实际应用中,计算得到的特征向量需要被标准化后,用于构建投影矩阵。通过将原始数据投影到这个由特征向量构成的新空间中,每个数据点就可以用更少的维度来表示,从而实现了数据的降维和噪声剔除。

二、实例

这里我使用库中鸢尾花数据来实现

2.1、数据处理

# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
target_names = iris.target_names

2.2、标准化

# 标准化特征
X_std = StandardScaler().fit_transform(X)

2.3 pca降维

sklearn_pca = PCA(n_components=2)
Y_sklearn = sklearn_pca.fit_transform(X_std)

2.4、绘图

# 绘图
with plt.style.context('ggplot'):
    plt.figure(figsize=(6, 4))

    for lab, col in zip((0, 1, 2), ('blue', 'red', 'green')):
        plt.scatter(Y_sklearn[y == lab, 0],
                    Y_sklearn[y == lab, 1],
                    label=target_names[lab],
                    c=col)

    plt.xlabel('Principal Component 1')
    plt.ylabel('Principal Component 2')
    plt.legend(loc='lower center')
    plt.tight_layout()
    plt.show()

三、pca优缺点

优点

  1. 降维:PCA通过提取最重要的几个主成分来降低数据的维度,这些主成分能够保留数据中大部分的变异性。这样不仅减少了数据的复杂性,还有助于后续的数据处理和分析。
  2. 去噪:通过PCA,可以剔除数据中的噪声和冗余信息,从而提高数据的精度和可靠性。
  3. 发现隐藏结构:PCA能够揭示数据中隐藏的结构和模式,增加对数据的理解和解释。
  4. 无参数限制:PCA算法不需要任何参数限制,完全基于数据本身的方差结构进行计算。
  5. 计算简单:PCA的计算过程主要是对协方差矩阵进行特征值分解,相对简单且易于实现。
  6. 广泛应用:PCA在文本处理、人脸识别、图像处理及自然语言处理等领域都有广泛的应用。
  7. 数据压缩:通过PCA可以将原始数据集中的多个变量用更少的综合变量来代替,从而有效地进行数据压缩。
  8. 提高模型性能:降低维度后的数据可以加快模型的训练速度,减少过拟合的风险,提高模型的性能。

缺点

  1. 可能损失信息:PCA舍弃了一部分次要成分,这可能会导致一些重要信息的丢失。
  2. 线性假设:PCA基于线性假设,对于非线性关系的数据可能效果不佳。
  3. 对异常值敏感:PCA对异常值比较敏感,异常值可能会对主成分的计算产生较大影响。
  4. 计算复杂度:对于大规模的数据集,PCA需要计算大量的矩阵运算和特征值分解,时间和空间成本较高。
  5. 结果解释性差:主成分是原变量的线性组合,其特征维度的含义模糊,不易解释。
  6. 不适用于所有场景:PCA更适用于数据降维和特征提取,并不直接用于分类或回归任务。
  7. 受数据分布限制:在非高斯分布情况下,PCA方法得出的主元可能并不是最优的。
  8. 无法考虑先验知识:如果用户对观测对象有一定的先验知识,却无法通过参数化等方法对PCA处理过程进行干预,可能会得不到预期的效果。

四、总代码 

import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
target_names = iris.target_names

# 标准化特征
X_std = StandardScaler().fit_transform(X)

# 主成分分析 (PCA)
sklearn_pca = PCA(n_components=2)
Y_sklearn = sklearn_pca.fit_transform(X_std)

# 绘图
with plt.style.context('ggplot'):
    plt.figure(figsize=(6, 4))

    for lab, col in zip((0, 1, 2), ('blue', 'red', 'green')):
        plt.scatter(Y_sklearn[y == lab, 0],
                    Y_sklearn[y == lab, 1],
                    label=target_names[lab],
                    c=col)

    plt.xlabel('Principal Component 1')
    plt.ylabel('Principal Component 2')
    plt.legend(loc='lower center')
    plt.tight_layout()
    plt.show()

运行结果

  • 19
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值