机器学习_降维模型

目录

基本概念论述

维度定义

维度就是描述一个事物所需要的性质的数量
针对每一张表,维度指的是样本的数量或特征的数量,一般无特别说明,指的都是特征的数量。除了索引之外,一个特征是一维,两个特征是二维,n个特征是n维。对图像来说,维度就是图像中特征向量的数量。

降维的目的

降维算法中的降维,指的是降低特征矩阵中特征的数量,目的是为了让算法运算更快,效果更好,更便于数据可视化。
以分类为例,并不是特征数量越多,分类越快,效果越好。事实上,特征数量超过一定值的时候,分类器的效果反而下降,这就是“维度灾难”

sklearn中的降维算法

sklearn中降维算法都被包括在模块decomposition中,这个模块本质是一个矩阵分解模块。
这里只简单介绍主成分分析(PCA)分奇异值分解(SVD) ,尤其是PCA,使用较多。

主成分分析(PCA)

最常用的PCA类就是sklearn.decomposition.PCA。

基本原理为线性映射,简单的来说就是将高维空间数据投影到低维空间上,将数据的主成分(包含信息量大的维度)保留下来,忽略掉对数据描述不重要的成分。在降维中,PCA使用的信息衡量指标是样本方差,又称可解释性方差。方差越大,特征所带的信息量越多

其他PCA类:
KernelPCA——主要用于非线性数据的降维
IncrementalPCA——主要是为了解决单机内存限制
SparsePCA、MiniBatchSparsePCA——使用了L1的正则化

名词解释:
正则化,损失函数后面通常会添加一个额外项,也即损失函数的惩罚项,用于对损失函数中的某些参数做一些限制。对于线性回归模型,使用L1正则化的模型建叫做Lasso回归,使用L2正则化的模型叫做Ridge回归(岭回归)。

分奇异值分解(SVD)

奇异值往往对应着矩阵中隐含的重要信息,且重要性和奇异值大小正相关。奇异值分解即将矩阵分解成若干个秩一矩阵之和,而奇异值则衡量了这些“小矩阵”对于原矩阵的权重选择合适的前k个奇异值,即可保留矩阵包含的绝大部分特征信息
A = σ 1 u 1 v 1 T + σ 2 u 2 v 2 T + … + σ r u r v r T A = \sigma_{1}u_{1}v_{1}^{T}+\sigma_{2}u_{2}v_{2}^{T}+…+\sigma_{r}u_{r}v_{r}^{T} A=σ1u1v1T+σ2u2v2T++σrurvrT

名词解释
奇异值,设 A 为 m ∗ n m*n mn阶矩阵, q = m i n ( m , n ) q=min(m,n) q=min(m,n) A ∗ A A^{*}A AA的q个非负特征值的算术平方根叫作 A 的奇异值。
秩一矩阵,秩等于1的矩阵是一类特殊的矩阵,它一定可以表示为一个非零列向量 (列矩阵)与一个非零行向量 (行矩阵)的乘积。

降维算法应用实例

人脸识别初步(降维部分)

python的scikit_learn库(注意是scikit-learn库,不是sklearn,虽然这个库常缩写为sklearn)提供了一份人脸信息数据集,搜集了共计一千多张照片,需要提前下载对应的数据集,并将数据包下载完成后放入scikit_learn_data文件夹(在此电脑中搜索该文件夹)下的lfw_home中,该数据集见文章开头提供的附件。

头文件
from sklearn.datasets import fetch_lfw_people
# 提供数据集
from sklearn.decomposition import PCA
# 加载降维模型
import matplotlib.pyplot as plt
# 画图部分
数据集加载
# 加载数据集,限制每个人最少60张图片
faces = fetch_lfw_people(min_faces_per_person=60)
# 观察数据集的基本特性
print('data:', faces.data.shape)
print('images:', faces.images.shape)

这个数组共有1348张照片,每张照片由62*47个像素点组成,其中每个像素点构成一个特征,每张照片2914个特征。

数据降维处理
# 降维
X = faces.data
pca = PCA(150).fit(X)  # 每张图片降至150个特征
# 获取特征矩阵,矩阵的每一行是一个特征向量。按照特征值由大到小的顺序排列。
V = pca.components_
# 将新特征空间矩阵可视化
# 创建一个图形对象 fig 和一个包含4行8列子图,禁用了子图的x轴和y轴刻度标签
fig, axes = plt.subplots(4, 8, figsize=(12, 6), subplot_kw={'xticks': [], 'yticks': []})
# 用于表明将要显示的图像的索引(第几个图片)
a = -1
for r in range(0, 4):
    for c in range(0, 8):
        a += 1
        # 这一行在第r行第c列的子图中显示灰度图像。faces.images是图像数据集,a是当前图像的索引。cmap='gray' 指定了使用灰度颜色映射来显示图像,使其变成黑白图像。
        axes[r, c].imshow(V[a, :].reshape(62,47),cmap="gray")
# 调用tight_layout函数,自动调整子图的布局,确保它们不重叠,并且适应图形的大小。
plt.tight_layout()
plt.show()
# 保存降维后的图像数据
X_new = pca.transform(X)
print(X_new.shape)
结果可视化
# 降维前后对比

# 使用pca.inverse_transform对 X_new 进行升维至(1348, 2914),即还原成原始维度,用以方便进行 62*47 像素点的绘图工作和前后对比。
X_inverse = pca.inverse_transform(X_new)
fig, axes = plt.subplots(2, 4, figsize=(12, 6), subplot_kw={'xticks': [], 'yticks': []})
for i in range(0, 4):
    #  降维前的照片前4张
    axes[0, i].imshow(faces.images[i, :, :], cmap='gray')
    axes[0, i].set_title(f'image{i+1}---before')
    # 降维后的照片前4张
    # X_inverse是降维后再升维的数据,reshape(62, 47) 将数据重新排列成62行47列的形状,以匹配图像的维度。
    axes[1, i].imshow(X_inverse[i].reshape(62, 47), cmap='gray')
    axes[1, i].set_title(f'image{i+1}---after')
plt.show()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值