机器学习笔记12_主成分分析PCA

PCA

1. PCA 是什么?

机器学习:Principal Component Analysis(主成分分析 PCA)

首先区分清楚【机器学习】和【数学】中一些名词对应的关系。

【特征】----【变量】 -> 【图像】:表示一个轴,如x轴,也就是x变量。

【标签】:特征的具体表现 ->

【函数值】:具体的某一个变量的值

  1. 相关背景

在许多领域的研究与应用中,通常需要对含有【多个变量】的数据进行观测,收集大量数据后进行分析寻找规律。多变量大数据集无疑会为研究和应用提供丰富的信息,但是也在一定程度上增加了数据采集的工作量。更重要的是在很多情形下,许多【变量之间可能存在相关性】,从而增加了问题分析的复杂性。如果分别对每个指标进行分析,分析往往是孤立的,不能完全利用数据中的信息,因此盲目减少指标会损失很多有用的信息,从而产生错误的结论。

因此需要找到一种合理的方法,在减少需要分析的指标同时,尽量减少原指标包含信息的损失,以达到对所收集数据进行全面分析的目的。由于各变量之间存在一定的相关关系,因此可以考虑将关系紧密的变量变成尽可能少的新变量,使这些新变量是两两不相关的,那么就可以用较少的综合指标分别代表存在于各个变量中的各类信息。主成分分析与因子分析就属于这类降维算法。

  1. 数据降维

降维就是一种对高维度特征数据预处理方法。降维是将高维度的数据保留下最重要的一些特征,去除噪声和不重要的特征,从而实现提升数据处理速度的目的。在实际的生产和应用中,降维在一定的信息损失范围内,可以为我们节省大量的时间和成本。降维也成为应用非常广泛的数据预处理方法。

降维具有如下一些优点:

  1. 使得数据集更易使用。
  2. 降低算法的计算开销。
  3. 去除噪声。
  4. 使得结果容易理解。

降维的算法有很多,比如奇异值分解(SVD)、主成分分析(PCA)、因子分析(FA)、独立成分分析(ICA)


所以当我们觉得数据的噪声太大,或者计算开销多,我们可以利用主成分分析对数据进行降维。

PCA的理论

PCA的想法

PCA(Principal Component Analysis),即主成分分析方法,是一种使用最广泛的数据降维算法。PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上重新构造出来的k维特征。

PCA的工作就是从原始的空间中顺序地找一组相互正交的坐标轴,新的坐标轴的选择与数据本身是密切相关的。其中,第一个新坐标轴选择是原始数据中方差最大的方向,第二个新坐标轴选取是与第一个坐标轴正交的平面中使得方差最大的,第三个轴是与第1,2个轴正交的平面中方差最大的。依次类推,可以得到n个这样的坐标轴。通过这种方式获得的新的坐标轴,我们发现,大部分方差都包含在前面k个坐标轴中,后面的坐标轴所含的方差几乎为0。于是,我们可以忽略余下的坐标轴,只保留前面k个含有绝大部分方差的坐标轴。事实上,这相当于只保留包含绝大部分方差的维度特征,而忽略包含方差几乎为0的特征维度,实现对数据特征的降维处理。

看到上面的选择轴的方式我觉得还是不太理解,为什么要用方差最大的方向。接着我看了下面的链接,比较形象地讲了为什么要用方差,主要是因为:

我们要使降维后的数据,点与点之间有较高的可区分度,尽量保持原来的点之间距离。因此,我们可以将此问题转化为:找到一个轴,使得样本空间的所有点映射到这个轴后,方差最大。

https://blog.csdn.net/m0_38056893/article/details/103130968

PCA的数学过程

在推导PCA方法的过程中,我们需要先明白向量的内积,方差,协方差,和协方差矩阵。,在下面这篇文章中表述的比较清晰:

https://blog.csdn.net/zouxiaolv/article/details/100590725

在我看来,方差是一维数据自己内部的运算,协方差是两维(多维度)的计算,而协方差矩阵则是把方差与协方差统一到一个矩阵中去了。

学过概率论太久了,忘记了协方差的意义,协方差是指:两个变量(标签)的相关程度。协方差的结果有什么意义呢?如果结果为正值,则说明两者是正相关的(从协方差可以引出“相关系数”的定义)如果为0,也是就是统计上说的“相互独立”。

方法一

下面,我们PCA的数学过程:

设有m条n维数据。

1.将原始数据按列组成n行m列矩阵X;

2.将X的每一行进行零均值化,即减去这一行的均值;

13.求出协方差矩阵 C = 1 m X X T C=\frac{1}{m}XX^T C=m1XXT

4.求出协方差矩阵的特征值及对应的特征向量;.

5.将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P;

6. Y = P X Y= PX Y=PX 即为降维到k维后的数据。

https://blog.csdn.net/zouxiaolv/article/details/100590725

方法二

这种主成分分析是通过梯度上升法求得的,具体思路可以看:

https://blog.csdn.net/m0_38056893/article/details/103130968

reference:

https://blog.csdn.net/program_developer/article/details/80632779

https://blog.csdn.net/m0_38056893/article/details/103130968

https://www.jianshu.com/p/c486b0c5e506

sklearn中使用PCA的方法

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets

# import data 
digits = datasets.load_digits()
X = digits.data
y = digits.target
from sklearn.model_selection import train_test_split

# train test split
X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=666)
X_train.shape


# (1347, 64)
(1347, 64)
%%time
from sklearn.neighbors import KNeighborsClassifier

# normal way to fit data
knn_clf = KNeighborsClassifier()
knn_clf.fit(X_train, y_train)
knn_clf.score(X_train, y_train)

"""
    Wall time: 171 ms
    0.991833704528582
"""
Wall time: 162 ms





'\n    Wall time: 171 ms\n    0.991833704528582\n'
from sklearn.decomposition import PCA

pca = PCA(n_components=2)
pca.fit(X_train)
X_train_reduction = pca.transform(X_train)
X_test_reduction = pca.transform(X_test)  # transform train and test data in same way
%%time
# fit data after PCA
knn_clf = KNeighborsClassifier()
knn_clf.fit(X_train_reduction, y_train)
knn_clf.score(X_test_reduction, y_test)

"""
    Wall time: 9.97 ms
    0.6066666666666667
"""
Wall time: 9.97 ms





'\n    Wall time: 9.97 ms\n    0.6066666666666667\n'
pca.explained_variance_ratio_

# array([0.14566817, 0.13735469])
array([0.14566817, 0.13735469])

explained_variance_ratio_:解释方差的比例

(1)0.14566817 代表第一个主成分可以解释14%的原数据,0.13735469 代表第二个主成分可以解释13%的原数据。

(2)两个主成分加起来可以解释百分之27的原数据,而其他的信息丢失了。

(3)可以使用explained_variance_ratio_这个参数来查看每个主成分所解释的原数据,来判断要取多少个主成分。

确定合适的特征数

feature_num = X_train.shape[1]   # 64
new_pca = PCA(n_components=feature_num)
new_pca.fit(X_train)
new_pca.explained_variance_ratio_  # 从大到小排列
 
"""
array([1.45668166e-01, 1.37354688e-01, 1.17777287e-01, 8.49968861e-02,
       5.86018996e-02, 5.11542945e-02, 4.26605279e-02, 3.60119663e-02,
       3.41105814e-02, 3.05407804e-02, 2.42337671e-02, 2.28700570e-02,
       1.80304649e-02, 1.79346003e-02, 1.45798298e-02, 1.42044841e-02,
       1.29961033e-02, 1.26617002e-02, 1.01728635e-02, 9.09314698e-03,
       8.85220461e-03, 7.73828332e-03, 7.60516219e-03, 7.11864860e-03,
       6.85977267e-03, 5.76411920e-03, 5.71688020e-03, 5.08255707e-03,
       4.89020776e-03, 4.34888085e-03, 3.72917505e-03, 3.57755036e-03,
       3.26989470e-03, 3.14917937e-03, 3.09269839e-03, 2.87619649e-03,
       2.50362666e-03, 2.25417403e-03, 2.20030857e-03, 1.98028746e-03,
       1.88195578e-03, 1.52769283e-03, 1.42823692e-03, 1.38003340e-03,
       1.17572392e-03, 1.07377463e-03, 9.55152460e-04, 9.00017642e-04,
       5.79162563e-04, 3.82793717e-04, 2.38328586e-04, 8.40132221e-05,
       5.60545588e-05, 5.48538930e-05, 1.08077650e-05, 4.01354717e-06,
       1.23186515e-06, 1.05783059e-06, 6.06659094e-07, 5.86686040e-07,
       1.71368535e-33, 7.44075955e-34, 7.44075955e-34, 7.15189459e-34])
"""
'\narray([1.45668166e-01, 1.37354688e-01, 1.17777287e-01, 8.49968861e-02,\n       5.86018996e-02, 5.11542945e-02, 4.26605279e-02, 3.60119663e-02,\n       3.41105814e-02, 3.05407804e-02, 2.42337671e-02, 2.28700570e-02,\n       1.80304649e-02, 1.79346003e-02, 1.45798298e-02, 1.42044841e-02,\n       1.29961033e-02, 1.26617002e-02, 1.01728635e-02, 9.09314698e-03,\n       8.85220461e-03, 7.73828332e-03, 7.60516219e-03, 7.11864860e-03,\n       6.85977267e-03, 5.76411920e-03, 5.71688020e-03, 5.08255707e-03,\n       4.89020776e-03, 4.34888085e-03, 3.72917505e-03, 3.57755036e-03,\n       3.26989470e-03, 3.14917937e-03, 3.09269839e-03, 2.87619649e-03,\n       2.50362666e-03, 2.25417403e-03, 2.20030857e-03, 1.98028746e-03,\n       1.88195578e-03, 1.52769283e-03, 1.42823692e-03, 1.38003340e-03,\n       1.17572392e-03, 1.07377463e-03, 9.55152460e-04, 9.00017642e-04,\n       5.79162563e-04, 3.82793717e-04, 2.38328586e-04, 8.40132221e-05,\n       5.60545588e-05, 5.48538930e-05, 1.08077650e-05, 4.01354717e-06,\n       1.23186515e-06, 1.05783059e-06, 6.06659094e-07, 5.86686040e-07,\n       1.71368535e-33, 7.44075955e-34, 7.44075955e-34, 7.15189459e-34])\n'
plt.plot([i for i in range(X_train.shape[1])], 
        [np.sum(new_pca.explained_variance_ratio_[: i+1]) for i in range(X_train.shape[1])])
plt.show()

在这里插入图片描述

曲线的意思为:横轴上点取前30个主成分的话保留了大概百分之90多的信息。横轴取64时全部保留,取0时候全部丢弃。

此时我们可以通过曲线发现该把数据降至几维。例如,若我们想将数据保留95%时,可以使用pca = PCA(0.95)。如下例,可发现n_components取28时满足,而且精度达到98%。

reference:
https://blog.csdn.net/m0_38056893/article/details/103171263
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值