一、概述

  主成分分析(Principal Component Analysis,PCA)是一种用于数据降维的方法,其核心目标是在尽可能保留原始数据信息的前提下,将高维数据映射到低维空间。该算法基于方差最大化理论,通过寻找数据的主要变化方向(即主成分),将原始数据投影到这些方向上,从而实现降维。

二、算法过程

1.数据中心化

  指将数据的每个特征减去其均值,使得数据的均值为 0。这样做的目的是将数据的分布中心移到原点,便于后续计算协方差矩阵等操作,因为协方差矩阵的计算对于数据的中心位置比较敏感,中心化后可以更好地反映数据的内在结构和相关性。

值得说明的是,在某些情况下,特别是当不同特征的量纲差异较大或者数据的分布比较复杂时,除了数据中心化外,还会进行数据标准化。数据标准化是指将数据的每个特征减去对应特征列的均值再除以标准差,这样可以进一步消除不同特征在尺度上的差异,使得不同特征在后续的分析中具有相同的重要性,避免因特征尺度不同而导致的结果偏差。

2. 计算协方差矩阵

  对中心化后的数据矩阵计算协方差,协方差矩阵描述了数据特征之间的相关性。

    总体协方差矩阵计算公式为 \(Cov=\frac{1}{n}X_{c}^{T}X_c\)

    样本协方差矩阵计算公式为 \(S=\frac{1}{n-1}X_{c}^{T}X_{c}\)

  其中\(n\)是样本数量。实际计算中通常使用样本协方差,其中的\(\frac{1}{n-1}\)是总体协方差的无偏估计。

3. 计算协方差矩阵的特征值和特征向量

  通过求解协方差矩阵\(S\)的特征方程 \(\left| S-\lambda I \right|=0\) ,得到特征值\(\lambda_i\)和对应的特征向量\(v_i\)。特征值反映了数据在对应特征向量方向上的方差大小,特征值越大,说明数据在该方向上的变化程度越大,包含的信息越多。

4. 选择主成分

  将特征值按照从大到小的顺序排列,对应的特征向量也随之重新排序。选择前 \(k\) 个最大的特征值及其对应的特征向量,这些特征向量构成了新的低维空间的基向量。\(k\) 的选择通常基于一个阈值,例如保留能够解释原始数据方差累计百分比达到一定比例(如 80%、90% 等)的主成分。

5.数据投影

  将原始数据投影到由选定的 \(k\) 个特征向量构成的低维空间中,得到降维后的数据。投影的计算公式为

\[Y=X_cW
\]

  其中,\(X_c\)是中心化后的数据矩阵,\(W\)是由前\(k\)个特征向量组成的投影矩阵,\(Y\) 是降维后的数据矩阵。​

三、示例

  现有一组二维数据 \(X=
\begin{bmatrix}
1 & 2 \\
2 & 3 \\
3 & 4 \\
4 & 5 \\
5 & 6
\end{bmatrix}\) ,下面使用PCA方法进行降维,将其从二维降至一维。

1.数据标准化

  首先,计算每列的均值:

    第一列均值:\(\bar x_1=\frac{1+2+3+4+5}{5}=3\)

    第二列均值:\(\bar x_2=\frac{2+3+4+5+6}{5}=4\)

  然后,对矩阵\(X\)进行中心化,得到矩阵\(X_c\)

    \(X_c=\)\(\begin{bmatrix}
1-3 & 2-4 \\
2-3 & 3-4 \\
3-3 & 4-4 \\
4-3 & 5-4 \\
5-3 & 6-4
\end{bmatrix}\)\(=\)\(\begin{bmatrix}
-2 & -2 \\
-1 & -1 \\
0 & 0 \\
1 & 1 \\
2 & 2
\end{bmatrix}\)

2. 计算协方差矩阵

  协方差矩阵\(S\)的计算公式为\(S=\frac{1}{n-1}X_{c}^{T}X_{c}\),其中\(n\)是样本数量。

    \(X_c^TX_c=\)\(\begin{bmatrix}
-2 & -1 &0 & 1 & 2 \\
-2 & -1 &0 & 1 & 2
\end{bmatrix}\)\(\begin{bmatrix}
-2 & -2 \\
-1 & -1 \\
0 & 0 \\
1 & 1 \\
2 & 2
\end{bmatrix}\)\(=\)\(\begin{bmatrix}
10 & 10 \\
10 & 10
\end{bmatrix}\)

  则协方差矩阵 \(S\) 为

    \(S=\frac{1}{5-1}\)\(\begin{bmatrix}
10 & 10 \\
10 & 10
\end{bmatrix}\)\(=\)\(\begin{bmatrix}
2.5 & 2.5 \\
2.5 & 2.5
\end{bmatrix}\)

3. 计算协方差矩阵的特征值和特征向量

  对于矩阵 \(S\),其特征方程为 \(\left| S-\lambda I \right|=0\) ,其中 \(I\) 是单位矩阵。

    \(\begin{vmatrix}
2.5-\lambda & 2.5 \\
2.5 & 2.5-\lambda
\end{vmatrix}\)\(=\)\({(2.5-\lambda)}^{2}-2.5^2\)\(=\)\(0\)

  展开可得 \(\lambda^2-5\lambda=0\) ,解得特征值为 \(\lambda_1=5\),\(\lambda_2=0\)。

求特征向量:

  对于 \(\lambda_1=5\) 求解 \((S-5I)v_1=0\)

    \(\begin{bmatrix}
2.5-5 & 2.5 \\
2.5 & 2.5-5
\end{bmatrix}\)\(\begin{bmatrix}
v_{11} \\
v_{12}
\end{bmatrix}\)\(=\)\(\begin{bmatrix}
-2.5 & 2.5 \\
2.5 & -2.5
\end{bmatrix}\)\(\begin{bmatrix}
v_{11} \\
v_{12}
\end{bmatrix}\)\(=\)\(\begin{bmatrix}
0 \\
0
\end{bmatrix}\)

取 \(v_{11}=1\) ,则 \(v_{12}=1\) ,单位化后得到特征向量 \(v_1=
\begin{bmatrix}
\frac{1}{\sqrt{2}} \\
\frac{1}{\sqrt{2}}
\end{bmatrix}\) 。

  对于 \(\lambda_2=0\) ,求解 \((S-0I)v_2=0\)

    \(\begin{bmatrix}
2.5 & 2.5 \\
2.5 & 2.5
\end{bmatrix}\)\(\begin{bmatrix}
v_{21} \\
v_{22}
\end{bmatrix}\)\(=\)\(\begin{bmatrix}
0 \\
0
\end{bmatrix}\)

取 \(v_{21}=1\) ,则 \(v_{22}=-1\) ,单位化后得到特征向量 \(v_2=
\begin{bmatrix}
\frac{1}{\sqrt{2}} \\
-\frac{1}{\sqrt{2}}
\end{bmatrix}\) 。

4. 选择主成分

  按照特征值从大到小排序,选择前 \(k\) 个特征值对应的特征向量作为主成分。这里我们选择最大特征值 \(\lambda_1=5\)

  对应的特征向量 \(v_1=
\begin{bmatrix}
\frac{1}{\sqrt{2}} \\
\frac{1}{\sqrt{2}}
\end{bmatrix}\) 作为主成分。

5. 数据投影

  将中心化后的数据 \(X_c\) 投影到主成分上,得到降维后的数据

    \(Y=X_cv_1=\)\(\begin{bmatrix}
-2 & -2 \\
-1 & -1 \\
0 & 0 \\
1 & 1 \\
2 & 2
\end{bmatrix}\)\(\begin{bmatrix}
\frac{1}{\sqrt{2}} \\
\frac{1}{\sqrt{2}}
\end{bmatrix}\)\(=\)\(\begin{bmatrix}
-2\sqrt{2} \\
-\sqrt{2} \\
0 \\
\sqrt{2} \\
2\sqrt{2}
\end{bmatrix}\) 。

四、Python实现

scikit-learn实现:

import numpy as np
from sklearn.decomposition import PCA # 数据
data = np.array([[1, 2],
[2, 3],
[3, 4],
[4, 5],
[5, 6]]) # 创建PCA对象,指定降维后的维度为1
pca = PCA(n_components=1) # 使用PCA对数据进行降维
reduced_data = pca.fit_transform(data) # 降维后的数据
print("降维后的数据:")
print(reduced_data)

#### 函数实现:

import numpy as np

def pca(X, n_components):
# 数据中心化
X_mean = np.mean(X, axis=0)
X_centered = X - X_mean # 计算协方差矩阵
cov_matrix = np.cov(X_centered, rowvar=False) # 计算协方差矩阵的特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix) # 对特征值进行排序,获取排序后的索引
sorted_indices = np.argsort(eigenvalues)[::-1] # 选择前n_components个最大特征值对应的特征向量
top_eigenvectors = eigenvectors[:, sorted_indices[:n_components]] # 将数据投影到选定的特征向量上
X_reduced = np.dot(X_centered, top_eigenvectors) return X_reduced # 数据
X = np.array([[1,2],
[2,3],
[3,4],
[4,5],
[5,6]]) # 降至1维
n_components = 1
X_reduced = pca(X, n_components) # 降维后的数据
print("降维后的数据:")
print(X_reduced)

End.

下载

基于主成分分析(PCA)的数据降维的更多相关文章

  1. 降维(一)----说说主成分分析(PCA)的源头

    降维(一)----说说主成分分析(PCA)的源头 降维系列: 降维(一)----说说主成分分析(PCA)的源头 降维(二)----Laplacian Eigenmaps --------------- ...

  2. 数据降维技术(2)—奇异值分解(SVD)

    上一篇文章讲了PCA的数据原理,明白了PCA主要的思想及使用PCA做数据降维的步骤,本文我们详细探讨下另一种数据降维技术—奇异值分解(SVD). 在介绍奇异值分解前,先谈谈这个比较奇怪的名字:奇异值分 ...

  3. 高维数据降维 国家自然科学基金项目 2009-2013 NSFC Dimensionality Reduction

    2013 基于数据降维和压缩感知的图像哈希理论与方法 唐振军 广西师范大学 多元时间序列数据挖掘中的特征表示和相似性度量方法研究 李海林 华侨大学       基于标签和多特征融合的图像语义空间学习技 ...

  4. 数据降维-PCA主成分分析

    1.什么是PCA? PCA(Principal Component Analysis),即主成分分析方法,是一种使用最广泛的数据降维算法.PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特 ...

  5. 主成分分析PCA数据降维原理及python应用(葡萄酒案例分析)

    目录 主成分分析(PCA)——以葡萄酒数据集分类为例 1.认识PCA (1)简介 (2)方法步骤 2.提取主成分 3.主成分方差可视化 4.特征变换 5.数据分类结果 6.完整代码 总结: 1.认识P ...

  6. 一步步教你轻松学主成分分析PCA降维算法

    一步步教你轻松学主成分分析PCA降维算法 (白宁超 2018年10月22日10:14:18) 摘要:主成分分析(英语:Principal components analysis,PCA)是一种分析.简 ...

  7. 机器学习实战(Machine Learning in Action)学习笔记————10.奇异值分解(SVD)原理、基于协同过滤的推荐引擎、数据降维

    关键字:SVD.奇异值分解.降维.基于协同过滤的推荐引擎作者:米仓山下时间:2018-11-3机器学习实战(Machine Learning in Action,@author: Peter Harr ...

  8. [机器学习之13]降维技术——主成分分析PCA

    始终贯彻数据分析的一个大问题就是对数据和结果的展示,我们都知道在低维度下数据处理比较方便,因而数据进行简化成为了一个重要的技术.对数据进行简化的原因: 1.使得数据集更易用使用.2.降低很多算法的计算 ...

  9. 机器学习课程-第8周-降维(Dimensionality Reduction)—主成分分析(PCA)

    1. 动机一:数据压缩 第二种类型的 无监督学习问题,称为 降维.有几个不同的的原因使你可能想要做降维.一是数据压缩,数据压缩不仅允许我们压缩数据,因而使用较少的计算机内存或磁盘空间,但它也让我们加快 ...

  10. [机器学习]-PCA数据降维:从代码到原理的深入解析

    &*&:2017/6/16update,最近几天发现阅读这篇文章的朋友比较多,自己阅读发现,部分内容出现了问题,进行了更新. 一.什么是PCA:摘用一下百度百科的解释 PCA(Prin ...

随机推荐

  1. CF895C Square Subsets 题解

    看到 \(a_i\le 70\) 后,发现 \(n\) 啥用没有,因为只需要枚举 \(1-70\) 选几个即可. 看到求完全平方数后,想到分解质因数,由于 \(a_i\le 70\),所以只有 \(1 ...

  2. 洛谷P10112 [GESP202312 八级] 奖品分配 题解

    题目传送门. 看了题解才发现我有多蠢. 我的做法真是唐完了. 在此之前请学习扩展欧几里得定理和扩展欧几里得定理求逆元. 发现奖品要么 \(N\) 个,要么 \(N+1\) 个,于是分类讨论,当奖品只有 ...

  3. FormCreate设计器v5.6发布—AI加持的低代码表单设计器正式上线!

    近期DeepSeek可谓是刷遍全网,当然,在DeepSeek等AI技术的推动下,人工智能正以惊人的速度改变着各行各业.AI不仅是一种技术趋势,更是未来生产力的核心驱动力. 如今,FormCreate设 ...

  4. AI 实践|零成本生成SEO友好的TDK落地方案

    之前写过一篇文章「Google搜索成最大入口,简单谈下个人博客的SEO」,文章里介绍了网页的描述信息TDK(Title.Description和Keywords)对SEO的重要作用,尽管已经意识到了T ...

  5. 【MathType】word2016数学公式编号

    问题 毕业论文排版中,对数学公式需要类似(3-1)的格式. 解决技巧 在写论文初稿的时候,先不要于公式的编号,先给它编一个号,比如(3) (2) (4)的. 最后写完了以后,再再添加section , ...

  6. C系统级编程-复习

    数组对象类型 Array of Type,它是多个相同对象类型的一维派生类型,包含两要素:元素个数,元素的对象类型 所谓多维数组,不过是元素的迭代衍生,本质还是一维的 声明 对象标识的名称 对象类型 ...

  7. mac、windows 配置python国内镜像源

    前言 我们在使用python pip安装第三方库时,经常会发生超时报错,这是可以指定临近的镜像源快速更新. mac中 在用户目录下建立一个".pip"目录,到目录里新建一个文件&q ...

  8. Centos下安装php mysql pdo以及gd扩展

    pdo扩展安装: yum install php-pdo pdomysql扩展安装: yum install php-pdo_mysql gd库扩展安装: yum install php-gd 安装后 ...

  9. Delphi 判断操作系统是32位或是64位

    function IsWin64: Boolean; var Kernel32Handle: THandle; IsWow64Process: function(Handle: Windows.THa ...

  10. 递归--java进阶day08

    1.递归 2.案例 1.案例一 求出5的阶乘 我们会发现其中存在规律 我们先定义一个带返回值的方法,方便调用者使用 当给的数是1时,1的阶乘还是1,我们就可以直接返回 如果走了else,说明给的数不是 ...