机器学习系列(12)_PCA对人像数据集的降维_01

简介: PCA:主成分分析(Principal Component Analysis)是一种使用线性映射来进行数据降维的方法,同时去除数据的相关性,以最大限度保持原始数据的方差信息。

一、PCA



PCA:主成分分析(Principal Component Analysis)是一种使用线性映射来进行数据降维的方法,同时去除数据的相关性,以最大限度保持原始数据的方差信息。


【1】PCA就是要找出数据最主要的方面来代替原始数据。


【2】PCA通常用于高维数据集的探索和可视化,还可以用作数据的压缩和预处理。


pca主成分求解的过程是:


【1】计算每列的均值

【2】减去平均列值来使得每列的值居中

【3】计算中心矩阵C的协方差矩阵

【4】计算协方差矩阵V的特征分解,产生特征值列表和特征向量列表

【5】特征值表示,以B为列

【6】投影

可以使用其他矩阵分解方法,例如奇异值分解或者SVD。


相关性: 两列一起变化的数量和方向的标准化度量。协方差是跨多个列的相关性的广义和非标准化版本。


协方差矩阵: 给定矩阵的协方差计算,其中每列与包括自身在内的所有其他列的协方差分数。


奇异值: 如果我们要存储很多高清的图片,而又受限于存储空间的限制,在尽可能保证图像可被识别的精度的前提下,我们可以保留奇异值较大的若干项,舍去奇异值较小的项即可。奇异值往往对应着矩阵中隐含的重要信息,且重要性和奇异值大小正相关。


1、什么是维度


维度:共同构造标签的特征。


对于数组和series(回顾numpy和pandas),则使用shape的方式查看。


行与列构建二维表:


【1】数组中的每一张表,都可以是一个特征矩阵或者一个Dataframe,这些结构永远只有一张表,所以一定有行列,其中行是样本,列是特征。


【2】针对每一张表,维度是指样本的数量或者特征的数量,一般无特别说明,指的都是特征的数量。


【3】除了索引之外,一个特征是一维,两个特征是二维,n个特征是n维。


【4】对于图像来说,维度就是图像中特征向量的数量。特征向量可以理解为是坐标轴,一个特征向量定义一条直线,是一维的,两个相互垂直的特征向量定义一个平面,即一个直角坐标系,就是二维。三个相互垂直的特征向量定义一个空间,即一个立体直角坐标系,就是三维。


2、什么是降维


降维:减少特征矩阵中特征的数量


降维目的:算法运算更快,效果更好,提高可视化可能性(因为三维以上的数据可视化的难度大)


它可以被认为是一种投影方法,将具有m列特征的数据投影到具有m或者更少列的子空间中,同时保留原始数据的本质。


PCA方法可以使用线性代数工具来描述和实现。


PCA是应用于数据集的操作,由n * m 矩阵A表示,它导致A的投影,将其称为B。


二、案例:PCA对人脸数据集的降维



# 01 导入库
from sklearn.datasets import fetch_lfw_people
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import numpy as np
# 02 实例化数据集
faces = fetch_lfw_people(min_faces_per_person=60)
faces.images
faces.images.shape
 # 得到三维数据  # 1348
# 62:每个图像行上面的特征 
#47:每个图像列上面的特征 
#62×47指的是像素,即最后图片会呈现出的样子

1348指的是样本数,表示我们调用的数据有1348张图像。

cc6a136e69244e2a80465392b5a2f525.png

X=faces.data
X.shape # (1348, 2914) 此时X变成二维的数据
# 03 特征矩阵的可视化
fig, axes = plt.subplots(4,5  #20个图像
                        ,figsize=(8,4)
                        ,subplot_kw = {"xticks":[],"yticks":[]}
                        )
axes[0][0].imshow(faces.images[0,:,:])  #画一个图
fig
axes
axes.shape # 4行5列
axes[0][0].imshow # 得到第一个图像

74723635ca734b11a442d38bcff51df3.png

# 03 特征矩阵的可视化
fig, axes = plt.subplots(4,5  #20个图像
                        ,figsize=(8,4)
                        ,subplot_kw = {"xticks":[],"yticks":[]}
                        )
axes[0][0].imshow(faces.images[0,:,:])  #画一个图
fig
axes
axes.shape 
axes[0][0].imshow
axes.flat # 降维 
[*axes.flat]
enumerate(axes.flat) # 枚举
for i, ax in enumerate(axes.flat):
    ax.imshow(faces.images[i,:,:]
    ,cmap="gray"
             )
# 04 建模降维并提取新的特征空间矩阵
# 2914个特征
pca=PCA(150).fit(X) 
# 将2914个特征通过PCA进行降维,降维到150个特征,并且使用fit进行实例化
V=pca.components_ # 保存处理好的矩阵
V.shape
# 取150个特征(用于图片压缩) 

acc097a3e9b447c58c36845ba30161cb.png

V[0]

6a3fb6ef435e4d09b9fed73112f865c2.png

# 05 新的特征空间矩阵进行可视化 
fig, axes = plt.subplots(3,8,figsize=(8,4),subplot_kw = {"xticks":[],"yticks":[]})
for i, ax in enumerate(axes.flat):
    ax.imshow(V[i,:].reshape(62,47),cmap="gray")

9564757fe2c84f24b8bc3f1b579634ae.png


从1348个特征降到150,可以看到图片的基本轮廓还在,但是已经变模糊了。

PCA在这个案例中的作用:将原来清晰照片当中重要的数据特征提取出来,使之能够做快速的计算。


三、例子



#完整例子
# test classification dataset
from sklearn.datasets import make_classification
# define dataset
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=7)
# summarize the dataset
print(X.shape, y.shape)
# 1000个样本,20个特征
import pandas as pd
testXy=pd.DataFrame(X,y)
# 折线图绘制特征
testXy.plot()

image.png


使用逻辑回归LogisticRegression对降维的数据进行验证,观察降到多少维度的时候,能够稳定的保持一定的准确率。

# 使用逻辑回归算法评估 PCA以进行分类
# 在拟合逻辑回归模型的同时对该数据集使用降维。使用 Pipeline,第一步执行 PCA 转换并选择 10 个最重要的维度或组件,然后在这些特征上拟合逻辑回归模型。
# Pipeline:过滤
from numpy import mean
from numpy import std
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score # 交叉验证
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.pipeline import Pipeline # 管道
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
# 定义数据集
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=7)
# 定义管道pipeline
steps = [('pca', PCA(n_components=10)), ('m', LogisticRegression())]
model = Pipeline(steps=steps)
# 评估模型
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
n_scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1, error_score='raise')
# 性能报告
print('Accuracy: %.3f (%.3f)' % (mean(n_scores), std(n_scores)))
# 将 PCA组件数与逻辑回归算法进行比较以进行分类
from numpy import mean
from numpy import std
import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.pipeline import Pipeline
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
from matplotlib import pyplot
# 定义获取数据集函数,原始特征是20
def get_dataset():
  X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=7)
  return X, y
# 获取不同特征树下的模型列表进行比较
def get_models():
  models = dict()
  for i in range(1,21):
    steps = [('pca', PCA(n_components=i)), ('m', LogisticRegression())]
    models[str(i)] = Pipeline(steps=steps)
  return models
# 通过交叉验证评估模型
def evaluate_model(model, X, y):
  cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
  scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1, error_score='raise')
  return scores
# 获取数据集
X, y = get_dataset()
# get the models to evaluate
models = get_models()
# 评估模型并保存结果
results, names = list(), list()
for name, model in models.items():
  scores = evaluate_model(model, X, y)
  results.append(scores)
  names.append(name)
  print('>%s %.3f (%.3f)' % (name, mean(scores), std(scores)))
# 模型绘图以进行比较plot model performance for comparison
pyplot.boxplot(results, labels=names, showmeans=True)
# pyplot.plot(range(1,21),results,marker='o', linestyle='dashed')
pyplot.xticks(rotation=90)
pyplot.legend()
pyplot.show()
# 从图中看出,到15就平稳了,因此=取15


a0ee7536c98844fb84b4d113eef27910.png


四、PCA对红酒数据可视化



# PCA可视化——在三维空间下
# 以红酒数据为例子
from sklearn.datasets import load_wine
winedata = load_wine()
X, y = winedata['data'], winedata['target']
print(X.shape)
print(y.shape)
# 178个样本,13个特征
#选择任意两个特征进行绘图
import matplotlib.pyplot as plt
plt.scatter(X[:,1], X[:,2], c=y,s=50) # S代表点的大小
plt.show()

8067195e00a0437e8c5d2cf81d11359b.png


#选择三个特征进行三维数据展示
import matplotlib.pyplot as plt
fig,ax=plt.subplots(figsize=(18,7),dpi=90)
ax = fig.add_subplot(projection='3d')
ax.scatter(X[:,1], X[:,2], X[:,3],c=y,s=45)  #三维以上呢?
plt.show()

7c8689907ee04cb4a4aa7d4dc5101899.png

可以看到对于上图中三维的数据,要将点根据颜色区分,显然比二维的难度更大,这也就是降维的目的所在。

from sklearn.decomposition import PCA
pca = PCA()
Xt = pca.fit_transform(X)  #一步到位
plot = plt.scatter(Xt[:,0], Xt[:,1], c=y,s=45)
plt.legend(handles=plot.legend_elements()[0], labels=list(winedata['target_names']))
plt.show()


58e3cb7226234630a0983b6425aa5642.png

from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
pca = PCA()
pipe = Pipeline([('scaler', StandardScaler()), ('pca', pca)])  #缩放数据
Xt = pipe.fit_transform(X)
plot = plt.scatter(Xt[:,0], Xt[:,1], c=y,s=55)
plt.legend(handles=plot.legend_elements()[0], labels=list(winedata['target_names']))
plt.show()

3f11d1b79e2849729887de187476b6b0.png


相关文章
|
4天前
|
机器学习/深度学习 数据可视化 计算机视觉
【视频】机器学习交叉验证CV原理及R语言主成分PCA回归分析犯罪率|数据共享
【视频】机器学习交叉验证CV原理及R语言主成分PCA回归分析犯罪率|数据共享
|
5天前
|
机器学习/深度学习 算法 数据可视化
机器学习第11天:降维
机器学习第11天:降维
|
5天前
|
机器学习/深度学习 算法 数据可视化
Machine Learning机器学习之高维数据降维(主成分分析PCA、线性判别分析、自编码器超级无敌详细讲解)
Machine Learning机器学习之高维数据降维(主成分分析PCA、线性判别分析、自编码器超级无敌详细讲解)
|
5天前
|
机器学习/深度学习 算法 数据可视化
Python | 机器学习之PCA降维
Python | 机器学习之PCA降维
44 0
|
2天前
|
机器学习/深度学习 数据采集 人工智能
论文介绍:机器学习中数据集规模增长的极限分析
【5月更文挑战第17天】论文《机器学习中数据集规模增长的极限分析》探讨了数据集大小对AI模型性能的影响,预测语言数据可能在2026年前耗尽,图像数据在2030-2060年可能面临相同问题。研究显示数据积累速度无法跟上数据集增长,可能在2030-2040年间导致训练瓶颈。然而,算法创新和新数据源的发展可能缓解这一问题。[链接](https://arxiv.org/pdf/2211.04325.pdf)
9 2
|
3天前
|
机器学习/深度学习 算法 数据挖掘
【机器学习】K-means算法与PCA算法之间有什么联系?
【5月更文挑战第15天】【机器学习】K-means算法与PCA算法之间有什么联系?
|
4天前
|
机器学习/深度学习 分布式计算 并行计算
【机器学习】怎样在非常大的数据集上执行K-means算法?
【5月更文挑战第13天】【机器学习】怎样在非常大的数据集上执行K-means算法?
|
4天前
|
机器学习/深度学习 存储 数据采集
【Python 机器学习专栏】PCA(主成分分析)在数据降维中的应用
【4月更文挑战第30天】本文探讨了主成分分析(PCA)在高维数据降维中的应用。PCA通过线性变换找到最大化方差的主成分,从而降低数据维度,简化存储和计算,同时去除噪声。文章介绍了PCA的基本原理、步骤,强调了PCA在数据降维、可视化和特征提取上的优势,并提供了Python实现示例。PCA广泛应用在图像压缩、机器学习和数据分析等领域,但降维后可能损失解释性,需注意选择合适主成分数量及数据预处理。
|
4天前
|
机器学习/深度学习 数据采集 SQL
【Python机器学习专栏】使用Pandas处理机器学习数据集
【4月更文挑战第30天】本文介绍了如何使用Python的Pandas库处理机器学习数据集,涵盖数据读取、概览、清洗、转换、切分和保存等步骤。通过Pandas,可以从CSV等格式加载数据,进行缺失值、异常值处理,数据类型转换,如归一化、类别编码,并实现训练集与测试集的划分。此外,还展示了如何保存处理后的数据,强调了Pandas在数据预处理中的重要性。
|
5天前
|
机器学习/深度学习 算法 数据可视化
机器学习——主成分分析(PCA)
机器学习——主成分分析(PCA)
28 0

热门文章

最新文章