机器学习系列(13)_PCA对图像数据集的降维_02(上)

简介: 【1】降维:会减少特征,删除数据,可能使得模型受影响【2】噪音:衡量特征之间的线性相关【3】PCA(主成分分析)使用样本方差作为信息量衡量的指标

一、PCA降维



1、降维究竟是怎样实现的


【1】降维:会减少特征,删除数据,可能使得模型受影响

【2】噪音:衡量特征之间的线性相关

【3】PCA(主成分分析)使用样本方差作为信息量衡量的指标

(在PCA当中,以信息量作为衡量标准指的就是样本方差)


a5e87c56c20d4c49bbc582be76acced3.png

参数:

【1】Var:特征方差

【2】n:样本量

【3】xi:特征当中的样本值

【4】x^hat:列样本均值


如下图实现从二维到一维的降维过程,即通过对坐标轴进行旋转,使得样本数据落在X轴上,变成一维的数据。


当然,实际情况肯定不是通过旋转坐标轴的方式进行降维的,而是通过一定的数学分析计算实现的。(比如支持向量机SVM)

5e24826dbc854afea002e31b55b561b4.png


首先:去中心化(把坐标原点放在数据中心,与均值有关)

然后:找坐标系(找到方差最大的方向)

由下面这个公式可以看出,从二维降到一维,但是样本数据的方差是不变的。


382e2a4ad8d945f0b4fe9f2a9e1fd9f5.png

image.png

RSD定义:相对标准偏差(relative standard deviation;RSD)又叫标准偏差系数、变异系数、变动系数等,由标准偏差除以相应的平均值乘100%所得值,可在检验检测工作中分析结果的精密度。


2、二维特征矩阵降维的一般过程


6a5968b90b564bc799536e960bc1a753.png

关于上图当中的n维特征矩阵的降维后的特征数量是k个,应该如何寻找?

我们可以通过学习曲线,找到当数值趋于一定的范围时会保持不变,这是就找到k值了。

比如下图当中的15就是k值:

image.png


关键步骤:找出n个新的特征向量,让数据能够被压缩到少数特征上并且总信息量不损失太多的技术就是矩阵分解


3、PCA降维与特征选择的不同



特征选择是从已存在的特征中选取携带信息最多的,选完之后的特征依然具有可解释性,依然知道这个特征在原数据的哪个位置,代表着原数据上的什么含义。


PCA在新的特征矩阵生成之前,无法知晓PCA都建立了怎样的新特征向量,新特征矩阵生成之后也不具有可读性。


PCA一般不适用于探索特征和标签之间的关系的模型(如线性回归),因为无法解释的新特征和标签之间的关系不具有意义。在线性回归模型中,使用特征选择


二、 PCA与SVD



PCA与SVD是两种不同的降维算法,但是他们都遵从上面的过程来实现降维,只是两种算法中矩阵分解的步骤不同,信息量衡量的指标不同。PCA使用方差作为信息量衡量的指标,并通过特征值分解来找出空间V。

SVD包含PCA的所有功能。

SVD使用奇异值分解找出空间V,在降维是会产生协方差矩阵,将特征矩阵X分解为三个矩阵。

注意:


数据预处理,只有数值型数据才能进行PCA

无论是PCA还是SVD都要遍历所有的特征和样本来计算信息量指标,并且在矩阵分解的过程中,会产生比原矩阵更大的矩阵,比如原数据结构是(m,n),在矩阵分解中为了找出最佳的新特征空间V,可能需要产生(n,n)(m,m)大小的矩阵,还需要产生协方差矩阵去计算更多的信息。


1、重要参数n_components


【1】降维后所需要的维度,即降维后需要保留的特征数量

【2】需要确认的K值,一般输入[0,min(X.shape)]范围中的整数。太大达不到降维效果,太小无法还原原始数据所内含的大部分信息,会丢失需要内含的参数。


2、迷你案例:高维数据的可视化(鸢尾花)


# 1. 调用库和模块
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
# 2. 提取数据集
iris = load_iris()
y = iris.target
X = iris.data
X.shape  #二维数组

c807e9b65aba4ea4bf6f9a47b7dc4047.png

# 3. 建模
#调用PCA
pca = PCA(n_components=2) #实例化,从4维降到2维
pca = pca.fit(X) #拟合模型
pca
X_dr = pca.transform(X) #获取新矩阵  dimeesion reduction  降维
X_dr
  • 使用PCA当中的n_components=2参数进行降维,如果n_components=1则会降维成一维,但是数据仍然是使用二维数组的形式来表示,因为sklearn很多情况下只能使用二维以上的数据。


  • 上面的建模代码可以使用下面的这句代码一部就完成,因为fit_transform()函数相当于完成了fit和transform两步操作。
X_dr=PCA(2).fit_transform(X)  #一步完成新矩阵的获取


d1741e12124f41a7a319415d8f89c51e.png

7411d1d73ecf47f2bfaf2a1fdcee52ef.png

# 4.可视化
X_dr[y==0,0]
X_dr[y==1,0]
X_dr[y==2,0]

逗号后面的0表示提取的是第一维度的特征

5eb851ed5bc64d1e862a3d6ac082681c.png

方法一:

plt.figure()
plt.scatter(X_dr[y==0, 0], X_dr[y==0, 1], c="red", label=iris.target_names[0])
plt.scatter(X_dr[y==1, 0], X_dr[y==1, 1], c="black", label=iris.target_names[1])
plt.scatter(X_dr[y==2, 0], X_dr[y==2, 1], c="orange", label=iris.target_names[2])
plt.legend()
plt.title('PCA of IRIS dataset')
plt.show()

方法二:

#等价
colors = ['red', 'black', 'orange']
iris.target_names
plt.figure()
for i in [0, 1, 2]:
    plt.scatter(X_dr[y == i, 0]
    ,X_dr[y == i, 1]
    ,alpha=.7
    ,c=colors[i]
    ,label=iris.target_names[i]
    )
plt.legend()
plt.title('PCA of IRIS dataset')
plt.show()

方法三:

#等价
%matplotlib inline
%config InlineBackend.figure_format = 'svg'
colors = ['red', 'black', 'orange']
plt.figure() # 初始化一个画布
for i in [0, 1, 2]:
    plt.scatter(X_dr[y == i, 0], X_dr[y == i, 1], alpha=0.7, c=colors[i], label=iris.target_names[i])
plt.legend() # 加图例
plt.title('PCA of IRIS dataset') # 加标题
plt.show()

adf797bc3c9d40208748792727022017.png


# 6、探索降维之后的数据
# 对降维之后两个特征进行比较
pca.explained_variance_
pca.explained_variance_ratio_

【1】explained_variance :查看降维之后每个新特征向量上所带的信息量大小,可解释性的方差大小,方差越大,该特征越重要

【2】explained_variance_ratio :查看降维后每个新特征向量所占的信息量占原始数据总信息量的比例

5af156dbf3984298b36d2c997e57bacc.png86c393c468044cf2886665c63f482107.png

# 7. 选择最好的n_components:累积可解释方差贡献率曲线
import numpy as np
pca_line = PCA().fit(X)
# pca_line.explained_variance_ratio_  四个特征中每个保留信息量的百分比
plt.plot([1,2,3,4],np.cumsum(pca_line.explained_variance_ratio_))
plt.xticks([1,2,3,4]) #这是为了限制坐标轴显示为整数
plt.xlabel("number of components after dimension reduction")
plt.ylabel("cumulative explained variance ratio")
plt.show()

上面代码当中的plt.plot([1,2,3,4]中的1,2,3,4本质上改变的就是参数n_components

下图X轴表示:降维之后剩下的特征个数。Y轴表示:降维后的准确率。

9ec98331ddab4d82805453280f673a50.png

就上图而言,只有4个维度,较少,没有必要降维,但如果在维数较大的情况下,我们会选择2,因为2的正确率有转折点。

9a284f3bf2354e4e8a8d1d982e69e7f1.png


3、最大似然估计自选超参数


n_components还有哪些可选择?

最大似然估计:maximum likelihoodestimation mle 利用已知的样本结果信息,反推最具有可能(最大概率)导致这些样本结果出现的模型参数值。


对于P(x∣θ)这个函数,输入有两个:x表示某一个具体的数据,θ表示模型的参数


如果θ是已知确定的, x是变量,这个函数叫做概率函数(probability function),它描述对于不同的样本点 x,其出现概率是多少。


如果 x是已知确定的,θ是变量,这个函数叫做似然函数(likelihood function), 它描述对于不同的模型参数,出现 x这个样本点的概率是多少。

pca_mle = PCA(n_components="mle")
pca_mle = pca_mle.fit(X)
X_mle = pca_mle.transform(X)
X_mle  #mle自动选择了多少个特征
# mle:自动选择了3个特征

3d33fdcd638449748e0a7a57c7717595.png


4、按信息量占比选超参数


  • n_componets=0.97代表PCA会自动选出能够让保留的信息量超过97%的特征数量
pca_f = PCA(n_components=0.97,svd_solver="full")
pca_f = pca_f.fit(X)
X_f = pca_f.transform(X)
pca_f.explained_variance_ratio_  #mle自动选择了多少个特征

e2461776ab8345379177e8c0913f3105.png

从上图可以看出,如果选择两个保留的信息量超过97%,则应该选择保留两个特征。

pca_f.explained_variance_ratio_.sum()

b7dc39aaeb9c48b6a0e7d0c6b2c73884.pngb989f75a6f3e41d5b8a6bb4b7c0e0720.png

相关文章
|
6天前
|
机器学习/深度学习 算法 PyTorch
用Python实现简单机器学习模型:以鸢尾花数据集为例
用Python实现简单机器学习模型:以鸢尾花数据集为例
19 1
|
1月前
|
XML JSON 数据可视化
数据集学习笔记(二): 转换不同类型的数据集用于模型训练(XML、VOC、YOLO、COCO、JSON、PNG)
本文详细介绍了不同数据集格式之间的转换方法,包括YOLO、VOC、COCO、JSON、TXT和PNG等格式,以及如何可视化验证数据集。
52 1
数据集学习笔记(二): 转换不同类型的数据集用于模型训练(XML、VOC、YOLO、COCO、JSON、PNG)
|
3月前
|
机器学习/深度学习 算法 数据中心
【机器学习】面试问答:PCA算法介绍?PCA算法过程?PCA为什么要中心化处理?PCA为什么要做正交变化?PCA与线性判别分析LDA降维的区别?
本文介绍了主成分分析(PCA)算法,包括PCA的基本概念、算法过程、中心化处理的必要性、正交变换的目的,以及PCA与线性判别分析(LDA)在降维上的区别。
87 4
|
3月前
|
UED 存储 数据管理
深度解析 Uno Platform 离线状态处理技巧:从网络检测到本地存储同步,全方位提升跨平台应用在无网环境下的用户体验与数据管理策略
【8月更文挑战第31天】处理离线状态下的用户体验是现代应用开发的关键。本文通过在线笔记应用案例,介绍如何使用 Uno Platform 优雅地应对离线状态。首先,利用 `NetworkInformation` 类检测网络状态;其次,使用 SQLite 实现离线存储;然后,在网络恢复时同步数据;最后,通过 UI 反馈提升用户体验。
87 0
|
3月前
|
机器学习/深度学习 TensorFlow 数据处理
分布式训练在TensorFlow中的全面应用指南:掌握多机多卡配置与实践技巧,让大规模数据集训练变得轻而易举,大幅提升模型训练效率与性能
【8月更文挑战第31天】本文详细介绍了如何在Tensorflow中实现多机多卡的分布式训练,涵盖环境配置、模型定义、数据处理及训练执行等关键环节。通过具体示例代码,展示了使用`MultiWorkerMirroredStrategy`进行分布式训练的过程,帮助读者更好地应对大规模数据集与复杂模型带来的挑战,提升训练效率。
74 0
|
3月前
|
机器学习/深度学习 算法 数据挖掘
scikit-learn.datasets 机器学习数据集
scikit-learn.datasets 机器学习数据集
36 0
|
3月前
|
机器学习/深度学习 数据可视化 搜索推荐
【python机器学习】python电商数据K-Means聚类分析可视化(源码+数据集+报告)【独一无二】
【python机器学习】python电商数据K-Means聚类分析可视化(源码+数据集+报告)【独一无二】
137 0
|
5月前
|
机器学习/深度学习 API Python
机器学习特征降维
这篇内容概述了特征降维在机器学习中的重要性,包括三个主要方法:低方差过滤法、PCA(主成分分析)和相关系数法。低方差过滤法通过删除方差低于阈值的特征来减少无关信息;PCA通过正交变换降低数据的维数,保留大部分信息;相关系数法(如皮尔逊和斯皮尔曼相关系数)用于评估特征间的相关性,去除高度相关的特征以简化模型。这些技术有助于提高模型效率和泛化能力。
|
5月前
|
机器学习/深度学习 算法 PyTorch
【从零开始学习深度学习】45. Pytorch迁移学习微调方法实战:使用微调技术进行2分类图片热狗识别模型训练【含源码与数据集】
【从零开始学习深度学习】45. Pytorch迁移学习微调方法实战:使用微调技术进行2分类图片热狗识别模型训练【含源码与数据集】