机器学习-9 降维算法——PCA降维

news2025/1/11 4:00:42

降维算法

  • 算法概述
    • 降维的概念
    • 降维的作用
    • 降维的本质
    • 常见算法分类
    • 主成分分析(PCA)
    • 降维分析
  • 算法流程
    • PCA算法的流程图
    • PCA算法的实现步骤
    • 协方差矩阵
  • 算法应用
    • sklearn库中的主成分分析
    • PCA实现高维数据可视化
      • 鸢尾花案例
      • 手写体数字图像识别案例
  • 算法总结
    • PCA算法的优点
    • PCA算法的缺点

算法概述

降维的概念

①降维(Dimensionality Reduction,DR)是指采用线性或者非线性的映射方法将高维空间的样本映射到低维空间中。
②降维获得低维空间的数据等价表示,实现高维数据的可视化呈现。

降维的作用

①在原始的高维空间中,包含有冗余信息以及噪声信息。图像识别中如果噪声太多会造成误差,降低识别准确率;通过降维,可以减少冗余信息所造成的误差,提高识别的精度、降低算法开销。
②通过降维可以寻找数据内部的本质结构特征。
③降维可以得到原始数据的简化表示以加速后续处理或者改进输出结果,即降维可以得到原始数据的简化表示以加速后续处理或者改进输出结果,因此它已经成为很多算法数据进行预处理的重要手段。

降维的本质

在机器学习领域,降维的本质是学习一个映射函数 f : x − > y f: x -> y f:x>y,其中x是原始数据点的表达,目前最多使用向量表达形式。y是数据点映射后的低维向量表达,通常y的维度小于x的维度。y可能是显式的或隐式的、线性的或非线性的函数。

常见算法分类

降维算法可分为线性降维和非线性降维两大类:

  • 线性降维假设构成数据集的各变量间独立无关。
    1)主成分分析(Principal Component Analysis,PCA)
    2)独立成分分析(Independent Component Analysis,ICA)
    3)线性判别分析(Linear Discriminant Analysis,LDA)
  • 非线性降维方法,也称为流形学习方法(Manifold Learning),其目标是从高维采样数据中恢复低维流形结构,不改变数据本身的拓扑特性。(了解为主,本文主要讲解PCA)
    1)基于保持全局结构信息,如等距离映射算法ISOMAP。
    2)关注局部结构信息,如LLE、LE、HLLE。

主成分分析(PCA)

  • 主成分分析(Principal Component Analysis,PCA)是最常用的一种降维方法,它的目标是通过某种线性投影,将高维的数据映射到低维的空间中,并期望在所投影的维度上数据的方差最大,以此使用较少的维度,同时保留较多原数据的维度。具体而言,PCA可以把具有相关性的高维变量合成为线性无关的低维变量,称为主成分。主成分能够尽可能保留原始数据的信息。
  • PCA算法目标是求出样本数据的协方差矩阵的特征值和特征向量,而协方差矩阵的特征向量的方向就是PCA需要投影的方向。使样本数据向低维投影后,能尽可能表征原始的数据。
  • 如果把所有的点都映射到一起,那么几乎所有的区分信息都丢失了,而如果映射后方差尽可能的大,那么数据点则会分散开来,特征更加明显。PCA是丢失原始数据信息最少的一种线性降维方法,最接近原始数据。

降维分析

通俗的来讲,二维数据就是把点投射成一条线,数据集的每个样本都可以用一个值表示,不需要两个值。三维数据可以降成二维,就是把变量映射到一个平面。一般情况下,n维数据集可以映射降成k维子空间,其中k<n。

数据压缩2D-1D:
在这里插入图片描述
降维原则是要找到数据最重要的方向,也就是方差最大的方向。如下图所示,红线和紫线均可作为二维平面中数据点要投射的线,但是相比之下,数据点在红线上的分布比在紫线上更为分散,这样的话可以区分出数据点的特征,所以投射为红线要比投射到紫线的效果更好。
在这里插入图片描述

数据压缩3D-2D:
在这里插入图片描述
降维原则其实与2D-1D的数据压缩一样,也是找数据差异性最大的方向,但是由于三维、四维乃至五维空间中主成分不止一个,所以要按照数据差异性程度大小进行排序从而寻找到所有的主成分。
如下图,第一个主成分就是从数据差异性最大(方差最大)的方向提取出来的,第二个主成分则来自数据差异性次大的方向,并且要与第一个主成分方向正交。
在这里插入图片描述
原理:矩阵的主成分就是其协方差矩阵对应的特征向量,按照对应的特征值大小进行排序,最大的特征值就是第一主成分,其次是第二主成分,以此类推。

算法流程

PCA算法的流程图

在这里插入图片描述

PCA算法的实现步骤

①将原始数据按行组成m行n列的矩阵X;
②将X的每一列(代表一个属性字段)进行零均值化,即减去这一列的均值;
③求出协方差矩阵;
④求出协方差矩阵的特征值及对应的特征向量r;
⑤将特征向量按对应特征值大小从左到右按列排列成矩阵,取前k列组成矩阵P;
⑥计算降维到k维的数据。

协方差矩阵

  • 方差描述一个数据的离散程度:
    v a r ( X ) = ∑ i = 1 m ( X i − X ‾ ) 2 m var(X)=\frac{\sum_{i=1}^{m}(X_i- \overline{X})^2}{m} var(X)=mi=1m(XiX)2
  • 协方差描述两个数据的相关性,接近1就是正相关,接近-1就是负相关,接近0就是不相关。
    c o v ( X , Y ) = ∑ i = 1 m ( X i − X ‾ ) ( Y i − Y ‾ ) m cov(X,Y)=\frac{\sum_{i=1}^{m}(X_i-\overline{X})(Y_i-\overline{Y})}{m} cov(X,Y)=mi=1m(XiX)(YiY)
    协方差只能处理二维问题,那维数多了自然需要计算多个协方差,我们可以使用矩阵来组织这些数据。
    协方差矩阵是一个对称的矩阵,而且对角线是各个维度的方差。
    二维的例子:
    C = ( c o v ( x , x ) c o v ( x , y ) c o v ( y , x ) c o v ( y , y ) ) C=\begin{pmatrix} cov(x,x) & cov(x,y) \\ cov(y,x) & cov(y,y) \end{pmatrix} C=(cov(x,x)cov(y,x)cov(x,y)cov(y,y))
    三维的例子:
    C = ( c o v ( x , x ) c o v ( x , y ) c o v ( x , z ) c o v ( y , x ) c o v ( y , y ) c o v ( y , z ) c o v ( z , x ) c o v ( z , y ) c o v ( z , z ) ) C=\begin{pmatrix} cov(x,x) & cov(x,y) & cov(x,z)\\ cov(y,x) & cov(y,y) & cov(y,z)\\ cov(z,x) & cov(z,y) & cov(z,z) \end{pmatrix} C= cov(x,x)cov(y,x)cov(z,x)cov(x,y)cov(y,y)cov(z,y)cov(x,z)cov(y,z)cov(z,z)
  • 协方差矩阵
    n个特征,m个样本。n行m列:
    X = [ X 1 ⋮ ⋱ ⋮ X n ] = [ x 1 1 ⋯ x 1 m ⋮ ⋱ ⋮ x n 1 ⋯ x n m ] X=\begin{bmatrix} X_1 \\ \vdots & \ddots & \vdots \\ X_n \end{bmatrix}=\begin{bmatrix} x_1^1 & \cdots & x_1^m \\ \vdots & \ddots & \vdots \\ x_n^1 & \cdots & x_n^m \end{bmatrix} X= X1Xn = x11xn1x1mxnm
    n行m列乘m行n列->n行n列:
    X X T = ∑ = [ ∑ 11 ⋯ ∑ 1 n ⋮ ⋱ ⋮ ∑ n 1 ⋯ ∑ n n ] XX_T=\sum_{}^{}=\begin{bmatrix} \sum_{11}^{} & \cdots & \sum_{1n}^{} \\ \vdots & \ddots & \vdots \\ \sum_{n1}^{} & \cdots & \sum_{nn}^{} \end{bmatrix} XXT== 11n11nnn
    通过数据集的协方差矩阵及其特征值分析,我们可以得到协方差矩阵的特征向量和特征值,我们需要保留k个维度的特征就选取最大的k个特征值。
    注:矩阵的特征值和特征矩阵的定义不再介绍,感兴趣的小伙伴可以学习线性代数的基础知识。

算法应用

sklearn库中的主成分分析

在sklearn库中,可以使用sklearn.decomposition.PCA加载PCA进行降维,主要参数有:

  • n_components:指定主成分的个数,即降维后数据的维度。
  • svd_solver:设置特征值分解的方法,默认为’auto’,其他可选的有’full’、‘arpack’、‘randomized’。

PCA实现高维数据可视化

鸢尾花案例

**目标:**已知鸢尾花数据是4维的,共三类样本。使用PCA实现对鸢尾花数据进行降维,实现在二维平面上的可视化。
在这里插入图片描述
实例程序编写:

#1.导入sklearn相关工具包
#加载matplotlib用于数据的可视化
import matplotlib.pyplot as plt
#加载PCA算法包
from sklearn.decomposition import PCA
#加载鸢尾花数据集导入函数
from sklearn.datasets import load_iris
#2.加载数据并进行降维
#以字典形式加载鸢尾花数据集
data=load_iris()
#使用y表示数据集中的标签
y=data.target
#使用X表示数据集中的属性数据
X=data.data
#加载PCA算法,设置降维后主成分数目为2,即降为2维
pca=PCA(n_components=2)
#对原始数据进行降维,保存在reduced_X中
reduced_X=pca.fit_transform(X)
#3.按类别对降维后的数据进行保存
#第一类数据点
red_x,red_y=[],[]
#第二类数据点
blue_x,blue_y=[],[]
#第三类数据点
green_x,green_y=[],[]
#按照鸢尾花的类别将降维后的数据点保存在不同的列表中
for i in range(len(reduced_X)):
    if y[i]==0:
        red_x.append(reduced_X[i][0])
        red_y.append(reduced_X[i][1])
    elif y[i]==1:
        blue_x.append(reduced_X[i][0])
        blue_y.append(reduced_X[i][1])
    else:
        green_x.append(reduced_X[i][0])
        green_y.append(reduced_X[i][1])
#4.降维后数据点的可视化
plt.scatter(red_x,red_y,c='r',marker='x')
plt.scatter(blue_x,blue_y,c='b',marker='D')
plt.scatter(green_x,green_y,c='g',marker='.')
plt.show()

实验结果:
在这里插入图片描述

手写体数字图像识别案例

实现思路:

  • 首先,使用sklearn中自带的手写数字数据集load_digits获得手写数字图像数据并存于digits变量中。利用train_test_split方法分割数据,并随机选取80%数据作为训练样本x_train,20%作为测试样本y_train;从sklearn.preprocessing里导入数据标准化模块StandardScaler,对训练和测试的特征数据进行标准化。
  • 然后,分别训练两个以支持向量机分类器SVC为基础的手写数字图像识别模型,其中一个模型使用原始维度即64维的像素特征识别,另一个采用PCA降维重构之后的低维特征来识别图像特征,其中n_components设置为10,也就是将64维降到10维。预测出分类结果后,分别比较两个模型的准确率评分以及分类报告。
  • 最后,展示前100个测试样本数据以及PCA降维后的SVC分类结果。

实例程序编写:

import matplotlib.pyplot as plt
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_digits
#使用sklearn中自带的手写数字数据集load_digits获得手写数字图像数据并存于digits变量中
digits=load_digits()
train=digits.data
target=digits.target
#利用train_test_split方法分割数据,并随机选取80%数据作为训练样本x_train,20%作为测试样本y_train
x_train,x_test,y_train,y_true=train_test_split(train,target,test_size=0.2,random_state=33)
#从sklearn.preprocessing里导入数据标准化模块StandardScaler,对训练和测试的特征数据进行标准化
ss=StandardScaler()
x_train=ss.fit_transform(x_train)
x_test=ss.transform(x_test)
#分别训练两个以支持向量机分类器SVC为基础的手写数字图像识别模型
svc=SVC(kernel="rbf")
svc.fit(x_train,y_train)
y_predict=svc.predict(x_test)
print('The Accuracy of SVC is',svc.score(x_test,y_true))
print("classification report of SVC\n",classification_report(y_true,y_predict,target_names=digits.target_names.astype(str)))
#采用PCA降维重构之后的低维特征来识别图像特征
#将64维降到10维
pca=PCA(n_components=10,whiten=True)
pca.fit(x_train,y_train)
x_train_pca=pca.transform(x_train)
x_test_pca=pca.transform(x_test)
svc=SVC(kernel="rbf")
svc.fit(x_train_pca,y_train)
y_pre_svc=svc.predict(x_test_pca)
print("The Accuracy of PCA_SVC is",svc.score(x_test_pca,y_true))
print("classification report of PCA_SVC\n",classification_report(y_true,y_pre_svc,target_names=digits.target_names.astype(str)))
samples=x_test[:100]
y_pre=y_pre_svc[:100]
plt.figure(figsize=(12,38))
#展示前100个测试样本数据以及PCA降维后的SVC分类结果
for i in range(100):
    plt.subplot(10,10,i+1)
    plt.imshow(samples[i].reshape(8,8),cmap='gray')
    title=str(y_pre[i])
    plt.title(title)
    plt.axis('off')
plt.show()

实验结果:
SVC:
在这里插入图片描述
PCA_SVC:
在这里插入图片描述
识别结果:
在这里插入图片描述

结果分析:
从结果中可以看到,经过PCA算法降维压缩后的数据从64维降低到10维,和原始数据相比降低了84%的维度,与此同时预测准确率也从98.9%降低到94.7%。
随着后期的参数调优以及适当增加训练次数,预测准确率仍旧可以提高。从这个角度来看,以PCA为代表的特征降维方法使用较少的数据维度却保留住较多的原始数据的特性,能够规避大量的特征冗余和噪声,同时能够节省更多用于模型训练的运行时间。
通俗的来讲,降维算法只是数据处理和保存的一种手段,无论是什么降维算法,必然会导致原始数据信息的丢失,只不过PCA算法是丢失原始数据信息最少的一种线性降维方法。

算法总结

PCA算法的优点

  • 仅仅需要以方差衡量信息量,不受数据集以外的因素影响。
  • 各主成分之间正交,可消除原始数据成分间的相互影响的因素。
  • 计算方法简单,主要运算是特征值分解,易于实现。

PCA算法的缺点

  • 主成分各个特征维度的含义具有一定的模糊性,不如原始样本特征的解释性强。
  • 方差小的非主成分也可能含有对样本差异的重要信息,降维丢弃的数据可能对后续数据处理有影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/513810.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MyBatis缓存-一级缓存--二级缓存的非常详细的介绍

目录 MyBatis-缓存-提高检索效率的利器 缓存-官方文档 一级缓存 基本说明 一级缓存原理图 代码演示 修改MonsterMapperTest.java, 增加测试方法 结果 debug 一级缓存执行流程 一级缓存失效分析 关闭sqlSession会话后 , 一级缓存失效 如果执行sqlSession.clearCache(…

linux安装nacos步骤

安装前提&#xff1a;服务器已安装JDK 一、nacos下载 Nacos下载地址&#xff1a;Releases alibaba/nacos GitHub 根据springboot版本选择nacos版本 版本说明 alibaba/spring-cloud-alibaba Wiki GitHub 二、nacos解压、修改配置文件 #选择安装目录 cd /home/dxhy/appl…

一款基于 Spring Cloud 开源的医疗信息系统

今天给大家介绍一个医院信息系统开源项目&#xff0c;相对比较完整&#xff0c;采用的技术栈是 Spring cloud和Spring boot 2.x&#xff0c;比较主流&#xff0c;正在做这方面系统的童鞋们可以参考一下&#xff01; 主要功能按照数据流量、流向及处理过程分为临床诊疗、药品管…

云原生|详解Kubernetes Operator在项目中的开发应用

目录 一、使用场景 &#xff08;一&#xff09;client-go中处理逻辑 &#xff08;二&#xff09;controller-runtime中处理逻辑 二、使用controller-runtime开发operator项目 &#xff08;一&#xff09;生成框架代码 &#xff08;二&#xff09;定义crd字段 &#xff0…

分布式消息队列RocketMQ概念详解

目录 1.MQ概述 1.1 RocketMQ简介 1.2 MQ用途 1.3 常见MQ产品 2.RocketMQ 基本概念 2.1 消息 2.2 主题 2.3 标签 2.4 队列 2.5 Producer 2.6 Consumer 2.7 NameServer 2.8 Broker 2.9 RocketMQ 工作流程 1.MQ概述 1.1 RocketMQ简介 RocketMQ 是阿里开源的分布式消…

云原生:从基本概念到实践,解析演进与现状

文章目录 云原生&#xff1a;从基本概念到实践&#xff0c;解析演进与现状概念演进之路DockerKubernetesCloud NativeServerless 业界现状总结 结语 云原生&#xff1a;从基本概念到实践&#xff0c;解析演进与现状 本文仅用于简单普及&#xff0c;达到的目的是给没接触过或者很…

苹果手机无法开机?黑屏打不开怎么办?出现这种问题的解决办法分享!

各位在使用苹果手机的小伙伴有没有遇到苹果手机突然就黑屏开不了机&#xff0c;打电话也没有任何反应&#xff0c;手机也无法关机重启&#xff0c;这是什么问题呢&#xff1f;我们遇到这种问题该如何去处理呢&#xff1f; 小编今天就来跟大家说说苹果手机突然开不了机的原因以及…

【Linux命令】脚本里常用的几个命令

脚本里常用的命令 一、SORT命令1.1、语法格式1.2常用选项 二、uniq命令2.1命令格式2.2常用选项2.3小实验&#xff0c;过滤出现三次以上的IP地址 三、tr命令3.1语法格式3.2常用选项3.3实验 四、cut命令4.1语法格式4.2常用选项 五、split命令5.1语法格式5.2常用选项 六、eval七、…

在行 | “数智”为离散制造发展注入动能

在行业现场解析行业难题&#xff0c; 用主题方案创新数智价值。 制造业作为我国实体经济的主体&#xff0c;是国民经济体系的重要组成部分&#xff0c;其中以离散制造比重最大&#xff0c;是解决就业等民生问题的支柱。随着技术和经济水平的提升&#xff0c;市场对离散制造行业…

CnOpenData淘宝村淘宝镇名单数据

一、数据简介 随着电商的迅猛发展&#xff0c;以淘宝村为代表的新型城镇化不断推进。淘宝镇和淘宝村是电商巨头阿里巴巴推出的一系列支持中小企业、新创企业发展的计划&#xff0c;旨在为中小企业及创新企业提供融资、营销、培训、咨询等服务。截至2022年&#xff0c;全国涌现了…

创新案例 |探索 Tive 80% 的收入增长得益于智能物流服务、跟踪和实时可视化

您正在寻找可靠的物流解决方案吗&#xff1f; Tive 是领先的智能物流服务提供商&#xff0c;提供跟踪和实时可见性解决方案。使用 Tive&#xff0c;您可以主动监控公路、空运、海运和铁路运输。它可以帮助您减少运输问题并确保准时和全面交付&#xff0c;从而改善客户体验。 …

融合CDN和单CDN的产品对比

仅针对特定地理位置的公司可以使用单一CDN解决方案&#xff0c;建议网站内容在全球分发的优先选择融合CDN来进行加速。 如果您的网站内容/应用程序大多是静态的&#xff0c;那么单一CDN解决方案可能适合大多数市场需求&#xff1b;但如果您的流量高于平均水平&#xff0c;媒体流…

【表面缺陷检测】基于yolov5的钢板表面缺陷检测(附代码和数据集,Windows系统)

写在前面: 首先感谢兄弟们的订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 路虽远,行则将至;事虽难,做则必成。只要有愚公移山的志气、滴水穿石的毅力,脚踏实地,埋头苦干,积跬步以至千里,就…

iPhone语音备忘录删除了怎么恢复?恢复备忘录,只需3个方法!

案例&#xff1a;语音备忘录被清空 【苹果语音备忘录有我很多会议记录&#xff0c;但是被我清理手机垃圾的时候顺便清理了。有什么方法恢复回来吗&#xff1f;】 很多人都知道&#xff0c;iphone语音备忘录是使用起来非常方便的一种记录方式&#xff0c;但是如何在不小心删除备…

Python之引用

1. 引用简介与工具引入 Python 中对于变量的处理与 C 语言有着很大的不同&#xff0c;Python 中的变量具有一个特殊的属性&#xff1a;identity&#xff0c;即“身份标识”。这种特殊的属性也在很多地方被称为“引用”。 为了更加清晰地说明引用相关的问题&#xff0c;我们首…

MySQL---多表联合查询(下)(内连接查询、外连接查询、子查询(ALL/ANY/SOME/IN/EXISTS关键字)、自关联查询)

1. 内连接查询 数据准备&#xff1a; use mydb3;-- 创建部门表 create table if not exists dept3(deptno varchar(20) primary key , -- 部门号name varchar(20) -- 部门名字 );-- 创建员工表 create table if not exists emp3(eid varchar(20) primary key , -- 员工编号e…

代表Java未来的ZGC深度剖析

JAVA程序最爽的地方是它的GC机制&#xff0c;开发人员不需要关注内存申请和回收问题。同时&#xff0c;JAVA程序最头疼的地方也是它的GC机制&#xff0c;因为掌握JVM和GC调优是一件非常困难的事情。在ParallelOldGC、CMS、G1之后&#xff0c;JDK11带来的全新的「ZGC」为我们解决…

css中常用伪类表单验证:invalid、:valid、:required、以及:not 、:lang、:empty的使用

MDN文档关于伪类的相关介绍 1、 :invalid :invalid 是 CSS 伪类选择器&#xff0c;用来选择任何未通过验证的 <form>、<fieldset>、<input> 或其他表单元素。 <form class"form"><label for"email">邮箱地址:</label>…

Sqlite3 生成lib库文件

特此记录&#xff01; QT使用SQL一般有两种方式 No1&#xff0c;使用Qt内部的Sql模块 No2&#xff0c;不通过Qt的Sql模块&#xff0c;直接使用Sqlite的lib库&#xff0c;使用Sqlite的标准C/C接口就行 接下来主要针对第二种。 第一步&#xff0c;进入官网 SQLite Download P…

Google Play应用广告该如何运作

Google 应用广告是一种付费广告渠道&#xff0c;可以帮助我们把应用推向特定的目标受众。比如可以使用应用安装广告&#xff0c;用来吸引用户安装我们的应用&#xff0c;我们可以选择手动设置出价和定位&#xff0c;或使用 Google Ads 自动设置目标和出价。 Google 在创建和投…