PCA(主成分分析)的理解与应用(学习笔记)

这篇具有很好参考价值的文章主要介绍了PCA(主成分分析)的理解与应用(学习笔记)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

PCA

        主成分分析(Principal Component Analysis, PCA)是一种线性降维算法,也是一种常用的数据预处理(Pre-Processing)方法。它的目标是是用方差(Variance)来衡量数据的差异性,并将差异性较大的高维数据投影到低维空间中进行表示。绝大多数情况下,我们希望获得两个主成分因子:分别是从数据差异性最大和次大的方向提取出来的,称为PC1(Principal Component 1) 和 PC2(Principal Component 2)。


PCA的具体实现

随机选取的六名学生的数学和语文考试成绩
student_id 1 2 3 4 5 6
scores1 92 70 95 73 72 87
scores2 74 87 70 92 97 74

制作为散点图:

PCA(主成分分析)的理解与应用(学习笔记)

         图中每个点代表了一个学生,X轴代表语文成绩,Y轴代表数学成绩。然后分别取所有样本的X平均值和Y平均值,并将这两个值变为X、Y坐标,在图中画出这个点(用五角星表示):

PCA(主成分分析)的理解与应用(学习笔记)

         按照图中箭头所示方向,将整个坐标系平移,使原点与五角星重叠。这样就获得了一个新的平面直角坐标系:

PCA(主成分分析)的理解与应用(学习笔记)

         尽管此时坐标系和每个点的值都发生了变化,点与点之间的相对位置仍保持一致。找到这些点的最优拟合线(Line of Best Fit),也就找到了PC1,再通过原点做PC1的垂线,就找到PC2:

PCA(主成分分析)的理解与应用(学习笔记)

         处理三维数组时便会产生第三个因子(PC3),以此类推,数据的维度越大,因子的数量也就越多。当维度大于等于4的时候,我们是无法想象出图像的,但PC4确实存在;假设有x个维度,便可以做x-1条垂线,就能得到PCx。接下来要做的便是选取最能代表数据差异性的两个因子,作为PC1和PC2。

按照下图所示,将点A投影到PC1上(六角星的位置),并计算其与原点之间的距离称为d1

PCA(主成分分析)的理解与应用(学习笔记)

        其余的五个点也做同样操作,得出d2至d5,再求这六个距离的平方和,称为PC1的特征值(Eigenvalue)。然后将PC1的特征值除以总样本数量减一(n-1),就计算出了PC1的差异值(Variation)。 

PCA(主成分分析)的理解与应用(学习笔记)

        以此类推,并选择差异值最大的两个因子作为PC1 和 PC2。假设在某个三维数组中,获得了PC1、PC2和PC3的差异值分别为18,7,5。通过计算(18+7)/ (18+7+5) ≈ 83.3% 得到结论:PC1 和 PC2 代表了这个三维数组83.3%的差异性。在本次分析的13个因子中,PC1和PC2描述了整组数据约81%的差异性: 

PCA(主成分分析)的理解与应用(学习笔记)

         最后,再通过选中的PC1和PC2将样本映射回本身所在的坐标,就可以得到降维后的图像(PCA Plot)。

PCA(主成分分析)的理解与应用(学习笔记)


协方差矩阵基本知识点: 

矩阵中的数据按行排列和按列排列求出的协方差矩阵是不同的,这里默认数据是按行排列。即每一行是一个observation(样本),那么每一列就是一个随机变量(特征)。

举个例子,矩阵X按行排列:

PCA(主成分分析)的理解与应用(学习笔记)

1.求每个维度的平均值

PCA(主成分分析)的理解与应用(学习笔记)

2.将X的每一列减去平均值

 PCA(主成分分析)的理解与应用(学习笔记)

3.计算协方差矩阵

PCA(主成分分析)的理解与应用(学习笔记)


 矩阵特征值和特征向量计算方法:

PCA(主成分分析)的理解与应用(学习笔记)

计算A的特征值和特征向量 

计算行列式得

化简得:

得到特征值:

化简得:

令得到特征矩阵:

同理,当得:

令得到特征矩阵:


 代码实现(依次由繁到简实现效果)

方法一:

# -*- coding: utf-8 -*-
"""
@author: 绯雨千叶

用PCA求样本矩阵X的K阶降维矩阵Z
请保证输入的样本矩阵X shape=(m, n),m行样例,n个特征
"""
import numpy as np

class PCA(object):
    def __init__(self, X, K):
        self.X = X  # 训练样本矩阵X
        self.K = K  # X的降维矩阵的阶数,即X要特征降维成k阶
        self.centrX = []  # 矩阵X的中心化
        self.C = []  # 样本集的协方差矩阵C
        self.U = []  # 样本矩阵X的降维转换矩阵
        self.Z = []  # 样本矩阵X的降维矩阵Z

        self.centrX = self._centralized()
        self.C = self._conv()
        self.U = self._U()
        self.Z = self._Z()  # Z=XU求得

    def _centralized(self):  # 矩阵X的中心化
        print('样本矩阵X:\n', self.X)
        centrX = []
        mean = np.array([np.mean(attr) for attr in self.X.T])  # mean()函数功能:求取均值;样本集的特征均值(每一列的平均数)
        centrX = self.X - mean  # 样本集的中心化(减去他那行的特征均值)
        print('样本集的特征均值:\n', mean)
        print('样本矩阵X的中心化centrX:\n', centrX)
        return centrX

    def _conv(self):  # 求样本矩阵X的协方差矩阵C
        ns = np.shape(self.centrX)[0]  # 样本集的样例总数
        C = np.dot(self.centrX.T, self.centrX) / (ns - 1)  # 样本矩阵的协方差矩阵C;.dot向量点积和矩阵乘法
        print('样本矩阵X的协方差矩阵C:\n', C)
        return C

    def _U(self):  # 求X的降维转换矩阵U, shape=(n,k), n是X的特征维度总数,k是降维矩阵的特征维度
        a, b = np.linalg.eig(self.C)  # 第一个返回值是X的协方差矩阵C的特征值,第二个返回值是特征向量
        print('样本集的协方差矩阵C的特征值:\n', a)
        print('样本集的协方差矩阵C的特征向量:\n', b)
        ind = np.argsort(-1 * a)  # 给出特征值降序的topK的索引序列
        UT = [b[:, ind[i]] for i in range(self.K)]  # 构建K阶降维的降维转换矩阵U
        U = np.transpose(UT)
        print('%d阶降维转换矩阵U:\n' % self.K, U)
        return U

    def _Z(self):  # 按照Z=XU求降维矩阵Z, shape=(m,k), n是样本总数,k是降维矩阵中特征维度总数
        Z = np.dot(self.X, self.U)
        print('X shape:', np.shape(self.X))
        print('U shape:', np.shape(self.U))
        print('Z shape:', np.shape(Z))
        print('样本矩阵X的降维矩阵Z:\n', Z)
        return Z

if __name__ == '__main__':
    '10样本3特征的样本集, 行为样例,列为特征维度'
    X = np.array([[10, 15, 29],
                  [15, 46, 13],
                  [23, 21, 30],
                  [11, 9, 35],
                  [42, 45, 11],
                  [9, 48, 5],
                  [11, 21, 14],
                  [8, 5, 15],
                  [11, 12, 21],
                  [21, 20, 25]])
    K = np.shape(X)[1] - 1
    print('样本集(10行3列,10个样例,每个样例3个特征):\n', X)
    pca = PCA(X, K)

效果展示:

PCA(主成分分析)的理解与应用(学习笔记)PCA(主成分分析)的理解与应用(学习笔记)PCA(主成分分析)的理解与应用(学习笔记)PCA(主成分分析)的理解与应用(学习笔记)

 PCA(主成分分析)的理解与应用(学习笔记)


方法二:

# coding=utf-8
"""
@author: 绯雨千叶
"""
import numpy as np

class PCA():
    def __init__(self, n_components):
        self.n_components = n_components

    def fit_transform(self, X):
        self.n_features_ = X.shape[1]
        # 求协方差矩阵
        X = X - X.mean(axis=0)
        self.covariance = np.dot(X.T, X) / X.shape[0]
        # 求协方差矩阵的特征值和特征向量
        eig_vals, eig_vectors = np.linalg.eig(self.covariance)
        # 获得降序排列特征值的序号
        idx = np.argsort(-eig_vals)
        # 降维矩阵
        self.components_ = eig_vectors[:, idx[:self.n_components]]
        # 对X进行降维
        return np.dot(X, self.components_)

# 调用
pca = PCA(n_components=2)
X = np.array(
    [[-1, 2, 66, -1], [-2, 6, 58, -1], [-3, 8, 45, -2], [1, 9, 36, 1], [2, 10, 62, 1], [3, 5, 83, 2]])  # 导入数据,维度为4
newX = pca.fit_transform(X)
print(newX)  # 输出降维后的数据

效果展示: 

PCA(主成分分析)的理解与应用(学习笔记)


方法三: 

#coding=utf-8
"""
@author: 绯雨千叶
"""
import numpy as np
from sklearn.decomposition import PCA
X = np.array([[-1,2,66,-1], [-2,6,58,-1], [-3,8,45,-2], [1,9,36,1], [2,10,62,1], [3,5,83,2]])  #导入数据,维度为4
pca = PCA(n_components=2)   #降到2维
pca.fit(X)                  #训练
newX=pca.fit_transform(X)   #降维后的数据
PCA(copy=True, n_components=2, whiten=False)
print(pca.explained_variance_ratio_)  #输出贡献率
print(newX)                  #输出降维后的数据

效果展示:

PCA(主成分分析)的理解与应用(学习笔记)


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

参数:

n_components:  

意义:PCA算法中所要保留的主成分个数n,也即保留下来的特征个数n

类型:int 或者 string,缺省时默认为None,所有成分被保留。

          赋值为int,比如n_components=1,将把原始数据降到一个维度。

          赋值为string,比如n_components='mle',将自动选取特征个数n,使得满足所要求的方差百分比。

copy:

类型:bool,True或者False,缺省时默认为True。

意义:表示是否在运行算法时,将原始训练数据复制一份。若为True,则运行PCA算法后,原始训练数据的值不            会有任何改变,因为是在原始数据的副本上进行运算;若为False,则运行PCA算法后,原始训练数据的              值会改,因为是在原始数据上进行降维计算。

whiten:

类型:bool,缺省时默认为False

意义:白化,使得每个特征具有相同的方差。

PCA属性:

  • components_ :返回具有最大方差的成分。
  • explained_variance_ratio_:返回 所保留的n个成分各自的方差百分比。
  • n_components_:返回所保留的成分个数n。
  • mean_
  • noise_variance_:

PCA方法:

1、fit(X,y=None)

fit(X),表示用数据X来训练PCA模型。

函数返回值:调用fit方法的对象本身。比如pca.fit(X),表示用X对pca这个对象进行训练。

拓展:fit()可以说是scikit-learn中通用的方法,每个需要训练的算法都会有fit()方法,它其实就是算法中的“训练”这一步骤。因为PCA是无监督学习算法,此处y自然等于None。

2、fit_transform(X)

用X来训练PCA模型,同时返回降维后的数据。

newX=pca.fit_transform(X),newX就是降维后的数据。

3、inverse_transform()

将降维后的数据转换成原始数据,X=pca.inverse_transform(newX)

4、transform(X)

将数据X转换成降维后的数据。当模型训练好后,对于新输入的数据,都可以用transform方法来降维。

此外,还有get_covariance()、get_precision()、get_params(deep=True)、score(X, y=None)等方法,以后用到再补充吧。文章来源地址https://www.toymoban.com/news/detail-453862.html

到了这里,关于PCA(主成分分析)的理解与应用(学习笔记)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 机器学习强基计划8-1:图解主成分分析PCA算法(附Python实现)

    机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理;“广”在分析多个机器学习模型:决策树、支持向量机、贝叶斯与马尔科夫决策、强化学习等。强基计划实现从理论到实践的全面覆盖,由本人亲自从底层编

    2024年02月02日
    浏览(69)
  • PCA分析(主成分分析)--结果解读

    主成分分析( PCA )是一个很好的工具,可以用来降低特征空间的维数。 PCA 的显著优点是它能产生不相关的特征,并能提高模型的性能。 PCA 用于减少用于训练模型的特征维度数量,它通过从多个特征构造所谓的主成分( PC )来实现这一点。 PC 的构造方式使得 PC1 方向在最大

    2024年02月03日
    浏览(37)
  • PCA主成分分析

    目前图像特征的提取主要有两种方法:传统图像特征提取方法 和 深度学习方法。 传统的特征提取方法:基于图像本身的特征进行提取(PCA); 深度学习方法:基于样本自动训练出区分图像的特征分类器; 特征选择(feature selection)和特征提取(Feature extraction)都属于 降维

    2024年02月08日
    浏览(54)
  • 主成分分析(PCA)详解

    主成分分析(PCA)是一种比较基础的数据降维方法,也是多元统计中的重要部分,在数据分析、机器学习等方面具有广泛应用。主成分分析目的是用较少的变量来代替原来较多的变量,并可以反映原来多个变量的大部分信息。 对于一个含有n个数据,变量的个数为p的一个样本,

    2024年01月17日
    浏览(45)
  • 主成分分析(PCA)原理详解

    在许多领域的研究与应用中,通常需要对含有多个变量的数据进行观测,收集大量数据后进行分析寻找规律。多变量大数据集无疑会为研究和应用提供丰富的信息,但是也在一定程度上增加了数据采集的工作量。更重要的是在很多情形下,许多变量之间可能存在相关性,从而

    2024年02月07日
    浏览(46)
  • 主成分分析(PCA)实例讲解

        主成分分析(PCA)是一种降维算法,PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分(特征之间互相独立),是在原有n维特征的基础上重新构造出来的k维特征(k=n),会带来部分信息损失。     一般来说,当研究的问题涉及到多

    2024年02月09日
    浏览(45)
  • 主成分分析(PCA)步骤及代码

      主成分分析(Principal Component Analysis,PCA), 简称PCA,是一种统计方法。过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分。主成分分析是我们在数学建模的过程中最为常见的线性降维方式,在比赛中常常会用在数据指标过多

    2023年04月08日
    浏览(43)
  • PCA主成成分分析例题详解

    主成分分析是一种降维算法,它能将多个指标转换为少数几个主成分,这些主成分是原始变量的线性组合,且彼此之间互不相关,其能反映出原始数据的大部分信息 需要了解具体细节可看此视频👉:什么是主成成分分析PCA 计算步骤 假设有 n n n 个样本, p p p 个特征,则可构

    2024年02月03日
    浏览(47)
  • 主成分分析(PCA)——矩阵角度推导

    最近机器学习课上正式讲了主成分分析,只是老师说的很快,我并没有完全理解。随后我搜了很多关于这方面的讲解来进行理解,仅CSDN上就有很多讲的很好的文章,从协方差矩阵角度进行说明,基本上我也都理解了。但另一方面我发现可以结合我最近学的矩阵分析,从纯矩阵

    2024年03月15日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包