sklearn入门——降维算法

概述
  • 什么是维度
    对于数组和Series来说,维度就是shape返回的结果,返回几个数字就是几维。不分行和列的是一维,有行和列之分的是二维,也称为表,一张表最多有二维。有多张表时就是多维的数据。
    每张表都可以是一个特征矩阵或者是DataFrame,这些结构永远只有一张表,它们的维度指的是样本数量或特征数量,一般是指特征的数量。几个特征就是几维。
    对于图像来说,维度是图像中特征向量的数量。
    降维算法中的降维指的是降低特征向量中特征的数量。
  • sklearn中的降维算法
    图片来自B站课程
主成分分析PCA
算法原理

PCA的主要思想是将n维2数据特征映射到k维上,这k维是全新的正交特征,也被称为主成分,是在原有n维特征的基础上重新构造出来的,与数据筛选不同,构造出来的k维特征是不可解释的,很难明确具体的意义。

以二维数据映射到一维为例:我们希望找到一个映射的轴使方差 V a r ( x ) = 1 n − 1 ∑ i = 1 n ( x i − x − ) 2 Var(x)=\frac{1}{n-1}\sum_{i=1}^{n}(x_i-x^{-})^2 Var(x)=n11i=1n(xix)2最大,就是保证数据拥有更高的可区分度,同时还保留着部分映射之间的空间信息。
步骤:
1.样本归0。就是让所有样本减去样本均值,样本的分布没有改变,只是坐标轴进行了移动。这样对于方差公式就变成了 V a r ( x ) = 1 n − 1 ∑ i = 1 n ( x i ) 2 Var(x)=\frac{1}{n-1}\sum_{i=1}^{n}(x_i)^2 Var(x)=n11i=1n(xi)2,计算更加方便。
2.找到样本映射后方差最大的单位向量w。定义轴的方向为w=(w1,w2),使得样本映射到w后,方差最大,即
V a r ( X p r o j e c t ) = 1 n − 1 ∑ i = 1 n ( X p r o j e c t i ) 2 Var(X_{project})=\frac{1}{n-1}\sum_{i=1}^n(X^i_{project})^2 Var(Xproject)=n11i=1n(Xprojecti)2
括号中是一个向量,可以用模代替:
V a r ( X p r o j e c t ) = 1 n − 1 ∑ i = 1 n ∣ ∣ X p r o j e c t i ∣ ∣ 2 Var(X_{project})=\frac{1}{n-1}\sum_{i=1}^n||X^i_{project}||^2 Var(Xproject)=n11i=1nXprojecti2

映射时,就是从原点向轴做垂线,交点即是映射点
X i . w = ∣ ∣ X i ∣ ∣ ∗ ∣ ∣ w ∣ ∣ ∗ c o s θ X^i.w=||X^i||*||w||*cosθ Xi.w=Xiwcosθ
X i . w = ∣ ∣ X i ∣ ∣ c o s θ X^i.w=||X^i||cosθ Xi.w=Xicosθ
X i . w = ∣ ∣ X p r o j e c t i ∣ ∣ X^i.w=||X^i_{project}|| Xi.w=Xprojecti
最终是求w使得 V a r ( X p r o j e c t ) = 1 n − 1 ∑ ( X i . w ) 2 Var(X_{project})=\frac{1}{n-1}\sum(X^i.w)^2 Var(Xproject)=n11(Xi.w)2最大。

sklearn中的PCA
  • 重要参数n_components
    n_components是降维后需要的维度,即降维后保留的特征数量。一般输入[0,min(X.shapw)]中的整数。
    PCA的操作也是实例化、fit、transform等。。。
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
pca = pca.fit(X)
X_dr = pca.transform(X)
# 可以通过切片操作获取某个特征对应的降维后的数据

# 降维后的数据信息
# 属性explained_variance_,查看降维后每个新特征向量上所带的信息量大小(可解释性方差的大小)
pca.explained_variance_

# 属性explained_variance_ratio,查看降维后新特征向量所占的信息量占原始数据总信息量的百分比
pca.explained_variance_ratio_

n_components的选择可以画出累计可解释方差贡献率曲线,来选择最好的n_components的整数取值。

  • 极大似然估计自选超参数
    除了输入整数,n_components可以用极大似然估计mle来自选超参数,操作如下:
pca_mle = PCA(n_components='mle')
pca_mle = pca_mle.fit(X)
# 只是改变了一个参数,其他操作和属性都一样
  • 按信息量占比选择超参数
    输入[0,1]之间的浮点数,并且让参数svd_solver=‘full’,来表示希望降维后的总解释方差占比大于n_components指定得百分比,这里的百分比是降维后特征信息量百分比的累计。
pca_f = PCA(n_components=0.97,svd_solver='full')
# 然后就是fit、transform、vatiance等等
PCA中的SVD应用

在PCA计算过程中需要计算协方差矩阵,计算量较大,而SVD的运用可以不计算协方差矩阵直接求出新特征空间和降维后的特征矩阵。
在这里插入图片描述
(图片来自菜菜的sklearn教程,仅为学习记录)
fit的奇异值分解的结果V(k,n)保存在属性components_中,可以调用查看。

  • componsents_中保存的V(k,n)的作用
    通常,V(k,n)中的数据很难解释具体的意义,但对于图像而言,生成的V(k,n)仍然是图像信息,且从V(k,n)中可以发现降维时选择的信息是什么。以人脸识别的数据集为例进行观察:
from sklearn.datasets import fetch_lfw_people
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import numpy as np

faces = fetch_lfw_people(min_faces_per_person=60)
faces.data.shape # (1348, 2914),表示有1348个样本,2914个图像特征

faces.images.shape
#(1348, 62, 47), 62*47是图像的特征矩阵

X = faces.data
# 画出未降维时的图像,如下边第一个图
fig, axes = plt.subplots(3,8,figsize=(8,4),subplot_kw={'xticks':[],'yticks':[]})
for i, ax in enumerate(axes.flat):# 是一个元组,有索引和对象
    ax.imshow(faces.images[i,:,:],cmap='gray')

# 降维
pca = PCA(150).fit(X)
V = pca.components_ #V(k,n)
# 画出中间v的信息,如下边第二个图
fig, axes = plt.subplots(3,8,figsize=(8,4),subplot_kw={'xticks':[],'yticks':[]})
for i, ex in enumerate(axes.flat):
    ex.imshow(V[i,:].reshape(62,47),cmap='gray')
    

在这里插入图片描述
在这里插入图片描述

  • inverse_transform(X_dr)返回原来的特征矩阵
    这个操作可以返回原来大小的特征矩阵,但并不是原来的特征矩阵。因为在降维时是选择最相关的特征进行降维,而把相关性不高的特征去除了,返回原来大小特征矩阵时也不可能包含那些被去除的信息。由这个特性,可以用来降噪。具体可以在PCA学习曲线中选择转折处的特征数来进行降维,然后再返回原来大小的特征矩阵,就可以实现数据的降噪。
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

up-to-star

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值