一、概述

  主成分分析(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. [国家集训队] happiness 题解

    发现可以做如下建图: 对于前两组输入,从 \(s\) 向所有代表学生的点连一条边,容量为其学习文科的喜悦值:从所有代表学生的点向 \(t\) 连一条边,容量为其学习理科的最大值. 对于后四组输入,建两 ...

  2. AI 艺术工具通讯

    创刊号 AI 领域的发展速度令人惊叹,回想一年前我们还在为生成正确手指数量的人像而苦苦挣扎的场景,恍如隔世 . 过去两年对开源模型和艺术创作工具而言具有里程碑意义.创意表达的 AI 工具从未像现在这般 ...

  3. 超详细的 Linux - conda 环境安装教程

    一.引言 在 Linux 系统中安装 conda 环境可以为您提供便捷的 Python 环境管理和包管理功能.本教程将详细介绍在 Linux 系统中安装 conda 的步骤. 二.安装前的准备 确保您 ...

  4. Ansible - [06] Playbook

    Playbook 概述 Ansible ad-hoc 可以通过命令行形式远程管理其他主机 适合执行一些临时性简单任务 Ansible playbook 中文名称叫 剧本 将经常需要执行的任务写入一个文 ...

  5. CF1693F题解

    备注 发表时间:2023-06-17 21:51 前言 yny 学长来 cdqz 讲课,写一篇讲课的题的题解纪念一下. 题意 给你一个 01 序列,有以下操作: 选择一段区间 设 \(cnt_0,cn ...

  6. 读论文-基于序列_会话的推荐_挑战,方法,应用和机遇(Sequential_Session-based Recommendations_ Challenges, Approaches, Applications and Opportunities)

    前言 今天读的论文为一篇于2022年7月7日发表在第45届国际ACM信息检索研究与发展会议论文集(Proceedings of the 45th International ACM SIGIR Con ...

  7. php禁止跨域调用api(来自文心快码)

    在PHP中,禁止跨域调用API通常涉及到设置正确的HTTP响应头,以告知浏览器不允许来自不同源的请求.跨域资源共享(CORS)是一个W3C标准,它允许服务器放宽同源策略(SOP),从而允许某些跨站请求 ...

  8. Go语言fmt.Sprintf、fmt.Printf(格式化输出)

    fmt.Printf fmt.Printf在程序中使用%f来格式化所需的值 看起来我们的值被四舍五入到了一个合理的数.但小数点后仍显示了6位,这对我们当前的需要来说实在是太多了. 对于这种情况,格式化 ...

  9. Go配置管理神器—Viper中文教程

    Viper中文教程 Viper是适用于Go应用程序的完整配置解决方案.它被设计用于在应用程序中工作,并且可以处理所有类型的配置需求和格式. 安装 go get github.com/spf13/vip ...

  10. Netty源码—7.ByteBuf原理二

    大纲 9.Netty的内存规格 10.缓存数据结构 11.命中缓存的分配流程 12.Netty里有关内存分配的重要概念 13.Page级别的内存分配 14.SubPage级别的内存分配 15.Byte ...