• 【OpenCV 例程200篇】235. 特征提取之主成分分析(sklearn)


    『youcans 的 OpenCV 例程300篇 - 总目录』

    【youcans 的 OpenCV 例程 300篇】235. 特征提取之主成分分析(sklearn)

    特征提取是指从原始特征中通过数学变换得到一组新的特征,以降低特征维数,消除相关性,减少无用信息。

    特征提取分为线性映射方法和非线性映射方法。


    5.2 主成分分析的数学方法

    主成分分析(Principal Components Analysis,PCA)是一种基于统计的数据降维方法,又称主元素分析、主分量分析。主成分分析只需要特征值分解,就可以对数据进行压缩、去噪,应用非常广泛。

    众多原始变量之间往往具有一定的相关关系。这意味着相关变量所反映的信息有一定程度的重叠,因此可以用较少的综合指标聚合、反映众多原始变量所包含的全部信息或主要信息。主成分分析方法研究特征变量之间的相关性、相似性,将一组相关性高的高维变量转换为一组彼此独立、互不相关的低维变量,从而降低数据的维数。

    主成分分析方法的思想是,将高维特征(p维)映射到低维空间(k维)上,新的低维特征是在原有的高维特征基础上通过线性组合而重构的,并具有相互正交的特性,称为主成分特性。

    通过正交变换构造彼此正交的新的特征向量,这些特征向量组成了新的特征空间。将特征向量按特征值排序后,样本数据集中所包含的全部方差,大部分就包含在前几个特征向量中,其后的特征向量所含的方差很小。因此,可以只保留前 k个特征向量,而忽略其它的特征向量,实现对数据特征的降维处理。

    主成分分析的基本步骤是:对原始数据归一化处理后求协方差矩阵,再对协方差矩阵求特征向量和特征值;对特征向量按特征值大小排序后,依次选取特征向量,直到选择的特征向量的方差占比满足要求为止。

    主成分分析方法得到的主成分变量具有几个特点:(1)每个主成分变量都是原始变量的线性组合;(2)主成分的数目大大少于原始变量的数目;(3)主成分保留了原始变量的绝大多数信息;(4)各主成分变量之间彼此相互独立。

    算法的基本流程如下:

    (1)归一化处理,数据减去平均值;
    (2)通过特征值分解,计算协方差矩阵;
    (3)计算协方差矩阵的特征值和特征向量;
    (4)将特征值从大到小排序;
    (5)依次选取特征值最大的 k个特征向量作为主成分,直到其累计方差贡献率达到要求;
    (6)将原始数据映射到选取的主成分空间,得到降维后的数据。

    在图像处理中,把每幅二维图像拉伸为一维向量,即展平为一维数组。一组 m 幅图像就构造为一个 m 维向量,使用 Karhunen-Loève transform(KLT) 变换得到变换矩阵,选取特征值最大的 k个特征向量作为主成分,从而实现特征降维。

    图像压缩过程是把一组原始图像变换成低维向量的过程,图像重建就是由低维向量变换重建图像组的过程。使用主成分分析进行图像压缩和重建会有少量信息损失,但可以把损失控制到很小。


    5.3 SKlearn 的主成分分析方法

    SKlearn 工具包提供了多种降维分析方法。sklearn.decomposition.PCA 类是 PCA算法的具体实现,官网介绍详见:https://scikit-learn.org/stable/modules/decomposition.html#principal-component-analysis-pca

    sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False)

    class sklearn.decomposition.PCA(n_components=None, *, copy=True, whiten=False, svd_solver=‘auto’, tol=0.0, iterated_power=‘auto’, random_state=None)

    PCA 类的主要参数:

    • n_components:n 为正整数时,表示保留主成分的维数;n 为 (0,1] 范围的实数时,表示主成分的方差和所占的最小阈值
    • whiten:白化选项, 使得每个特征具有相同的方差 ,默认值为 False
    • svd_solver:奇异值分解 SVD 的算法选择,‘full’ 表示调用 scipy库的 SVD;‘arpack’ 调用 scipy 库的 sparse SVD;‘randomized’ 调用 SKlearn的SVD,适用于数据量大、变量维度多、主成分维数低的场景。默认值为 ‘auto’。

    PCA 类的主要属性:

    • components_:方差最大的 n-components 个主成分
    • n_features_:训练数据中的特征数
    • n_samples_:训练数据中的样本数
    • explained_variance_:各个主成分的方差值
    • explained_variance_ratio_:各个主成分的方差值的占比

    PCA 类的主要方法:

    • fit(X):表示用数据 X 训练 PCA 模型,维数 (m,p)。fit() 是 SKlearn中的通用方法,实现训练、拟合的步骤。
    • fit_transform(X):表示用数据 X 训练PCA模型,并返回降维后的数据
    • transform(X):将数据 X 转换成降维后的数据,用训练好的 PCA模型对新的数据集进行降维。
    • inverse_transform(Xnew):将降维后的数据转换成原始数据,维数(m,k)。

    SKlearn 工具包针对实际问题的特殊性,发展了各种改进算法,例如:

    • 增量主成分分析:针对大型数据集,为了解决内存限制问题,将数据分成多批,通过增量方式逐步调用主成分分析算法,最终完成整个数据集的降维。
    • 核主成分分析:针对线性不可分的数据集,使用非线性的核函数把样本空间映射到线性可分的高维空间,然后在这个高维空间进行主成分分析。
    • 稀疏主成分分析:针对主成分分析结果解释性弱的问题,通过提取最能重建数据的稀疏分量, 凸显主成分中的主要组成部分,容易解释哪些原始变量导致了样本之间的差异。

    例程 14.16:特征描述之主成分分析(sklearn.decomposition.PCA)

    本例程的图像来自 R.C.Gonzalez 《数字图像处理(第四版)》P622 例11.16。本例的目的是说明如何使用主分量作为图像特征。

        # # 14.16 特征描述之主成分分析 (sklearn)
        from sklearn.decomposition import PCA
    
        # 读取光谱图像组
        img = cv2.imread("../images/Fig1138a.tif", flags=0)
        height, width = img.shape[:2]  # (564, 564)
        nBands = 6  # 光谱波段种类
        snBands = ['a','b','c','d','e','f']  # Fig1138a~f
        imgMulti = np.zeros((height, width, nBands))  # (564, 564, 6)
        Xmat = np.zeros((img.size, nBands))  # (318096, 6)
        print(imgMulti.shape, Xmat.shape)
    
        # 显示光谱图像组
        # fig1 = plt.figure(figsize=(9, 6))  # 原始图像,6 个不同波段
        # fig1.suptitle("Spectral image of multi bands by NASA")
        for i in range(nBands):
            path = "../images/Fig1138{}.tif".format(snBands[i])
            imgMulti[:,:,i] = cv2.imread(path, flags=0)  # 灰度图像
            # ax1 = fig1.add_subplot(2,3,i+1)
            # ax1.set_xticks([]), ax1.set_yticks([])
            # ax1.imshow(imgMulti[:,:,i], 'gray')  # 绘制光谱图像 snBands[i]
        # plt.tight_layout()
    
        # 主成分分析 (principal component analysis)
        for i in range(nBands):
            Xarray = imgMulti[:,:,i].flatten()  # 转为一维数组
            Xmat[:,i] = (Xarray - Xarray.mean()) / Xarray.std()  # 数据标准化 (318096, 6)
    
        m, p = Xmat.shape  # m:训练集样本数量,p:特征维度数
        modelPCA = PCA(n_components=0.95)  # 建立 PCA 模型,设定主成分方差贡献率 95%
        Xpca = modelPCA.fit_transform(Xmat)  # 返回降维后的数据 (m,k)=(318096,3)
        k = modelPCA.n_components_  # 主成分方差贡献率 95% 时的特征维数 k=3
        print("number of samples: m=", m)  # 样本集的样本数量 m=318096
        print("number of features: p=", p)  # 样本集的特征维数 p=6
        print("number of PCA features: k=", k)  # 降维后的特征维数,主成分个数 k=3
        # print("principal axes in feature space:", modelPCA.components_)  # 各主成分的主轴方向
        print("explained variance:", modelPCA.explained_variance_.round(4))  # 各主成分的方差
        print("explained variance ratio:", modelPCA.explained_variance_ratio_.round(4))  # 各主成分的方差贡献率
        print("cumulative explained variance ratio:", np.cumsum(modelPCA.explained_variance_ratio_).round(4))
        # 主成分累计方差贡献率,[0.6496 0.9016 0.9744]
        print("singular values of each selected components:", modelPCA.singular_values_.round(4))  # 各主成分的奇异值
    
        # 显示主成分变换图像
        fig2 = plt.figure(figsize=(9, 6))  # 主元素图像
        fig2.suptitle("Principal component images")
        imgPCA = np.zeros((height, width, k))  # (564, 564, 6)
        for i in range(k):
            pca = Xpca[:, i].reshape(-1, img.shape[1])  # 主元素图像 (564, 564)
            imgPCA[:,:,i] = cv2.normalize(pca, (height, width), 0, 255,  cv2.NORM_MINMAX)
            ax2 = fig2.add_subplot(2,3,i+1)
            ax2.set_xticks([]), ax2.set_yticks([])
            ax2.imshow(imgPCA[:,:,i], 'gray')  # 绘制主成分图像
        plt.tight_layout()
    
        # 由主成分分析重建图像
        Xrebuild = modelPCA.inverse_transform(Xpca)  # 由降维特征数据恢复原始维数特征数据 (m,k)->(m,p)
        print(Xmat.shape, Xpca.shape, Xrebuild.shape)  # (318096, 6), (318096, 3), (318096, 6)
        fig3 = plt.figure(figsize=(9, 6))  # 重建图像,6 个不同波段
        fig3.suptitle("Rebuild images of multi bands by youcans")
        for i in range(nBands):
            rebuild = Xrebuild[:, i].reshape(-1, img.shape[1])  # 主元素图像 (564, 564)
            imgRebuild = cv2.normalize(rebuild, (height, width), 0, 255,  cv2.NORM_MINMAX)
            ax3 = fig3.add_subplot(2,3,i+1)
            ax3.set_xticks([]), ax3.set_yticks([])
            ax3.imshow(imgRebuild, 'gray')  # 绘制重建的光谱图像 (有信息损失)
        plt.tight_layout()
        plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67

    运行结果:

    number of samples: m=318096
    number of features: p=6
    number of PCA features: K=3
    explained variance: [3.8978 1.512 0.4368]
    explained variance ratio: [0.6496 0.252 0.0728]
    cumulative explained variance ratio: [0.6496 0.9016 0.9744]
    singular values of each selected components: [1113.4896 693.5156 372.764 ]
    (318096, 6) (318096, 3) (318096, 6)

    注意:
    建立模型时,PCA(n_components=2) 中的 n_components 为正整数,表示设定保留的主成份维数为 2;PCA(n_components=0.95) 中的 n_components 为 (0,1) 的小数,表示保留的主成分的累计方差贡献率大于设定值 0.95。


    在这里插入图片描述


    在这里插入图片描述


    【本节完】

    版权声明:
    本例程的图像来自 R.C.Gonzalez 《数字图像处理(第四版)》P622 例11.16。
    youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/125761698)
    Copyright 2022 youcans, XUPT
    Crated:2022-7-12

    234. 特征提取之主成分分析(PCA)
    235. 特征提取之主成分分析(sklearn)
    236. 特征提取之主成分分析(OpenCV)

  • 相关阅读:
    【shell】限制任务并发
    连接远程的kafka【linux】
    Wireshark学习 与 TCP/IP协议分析
    bootstarp+springboot基于Java的教学仪器设备商城销售网站_o9b00
    (个人杂记)第九章 串口实验2
    Distributed Trajectory Similarity Search(VLDB2017)
    领域驱动设计DDD实际项目落地最佳实践
    JS知识点,持续更新
    抖音矩阵系统,抖音SEO源码,抖音矩阵系统look。
    1107 老鼠爱大米 – PAT乙级真题
  • 原文地址:https://blog.csdn.net/youcans/article/details/125761698