1 主成分分析(PCA) -当今最广泛的降维技术
目录
一 引言
为了有效处理高维数据,我们必须有一套技术将维度降至可处理水平,降维的优势包括 可以在二维空间对多维数据进行可视化、用最少的特征描述数据集所包含的信息,以及在某些情况下识别模型向量的共线性
在机器学习中,共线性是指模型特征共有的接近线性的关系,但是这一特征的用处不大,因为相关特征不太可能比他们独立时提供更多的信息量;而且共线特征可能会突出局部极小值或给出错误的线索
主成分分析是一种分解方法。它能够将变量极多的数据集分解为一系列正交向量,取足够多的正交向量就能够解释数据集中近乎全部的方差(我们在使用主成分分析时必须要考虑对数据集有效建模的向量数,因为当分解后的向量维度小于原始数据集的变量个数时,会损失原始数据集中的一些信息,如果我们的向量数目足够多,那么这种损失将会很小;反之,将会损失惨重)
二 PCA 步骤
- 找出数据集的中心点
- 计算数据的协方差矩阵
- 计算协方差矩阵的特征向量
- 将特征向量标准正交化
- 计算每个特征向量表示的方差比例
1 协方差
多维数据的方差,两个或多个变量之间的方差。一维或者一个变量的方差可由一个值来描述,两个变量之间的方差需要用一个 2*2 的矩阵来描述,三个变量之间的方差需要用一个 3*3 的矩阵来描述,因此主成分分析的第一步就是计算协方差矩阵
2 特征向量
一种针对数据集或者线性变换的向量。具体来说,这种向量的方向在转换前后不会发生变化。为了便于理解,假设你的两手之间有一根直的橡皮筋,你伸展橡皮筋,直到他绷紧为止。特征向量正是伸展前和伸展过程中不会发生方向变化的向量,也就是直接穿过橡皮筋中心从一只手到另一只手的向量
3 正交化
寻找两个相互正交的向量的过程。在n维数据空间中,正交化的过程就是选取一系列的向量,然后转化为一系列正交向量
4 标准正交化
对积进行标准化的正交化的过程
5 特征值
(大致相当于特征向量的长度)用于计算由每个特征向量表示的方差比例,该比例由每一个特征向量的特征值除以所有特征向量的特征值之和得到的
综上,协方差矩阵用于计算特征向量,标准正交过程则是根据特征向量得出正交的、标准化向量。特征值最大的特征向量是第一个主成分,其他成分的特征值都相对较小,这样主成分分析算法就能够将数据集转化为用新的低维坐标来表示
三 PCA 的应用
# 对digits 数据集应用主成分分析技术
import numpy as np
from sklearn.datasets import load_digits
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.preprocessing import scale
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
import matplotlib.cm as cm
digits = load_digits()
data = digits.data
n_samples,n_features = data.shape
n_digits = len(np.unique(digits.target))
labels = digits.target
这段代码完成了以下工作
- 首先,加载了numpy、scikit-learn、matplotlib库,其中scikit-learn库主要包括digits数据集、主成分分析算法和数据标准化函数等一系列相关数据、算法和函数
- 接着,开始准备digits数据集
- 首先 在构造有用的变量前加载数据集
- 创建data变量用于表示数据集,并且根据digits数据集中的目标向量计算出因变量的类别数(因为数字取值范围是0-9,所以n_digits = 10)并存为变量,以供后续分析使用
- 将target向量存为变量,并且命名为labels,以便后续使用
- 准备好数据集后,对主成分分析算法进行初始化,并将其应用于数据集
pca = PCA(n_components = 10)
data_r = pca.fit(data).transform(data)
print('explained variance ratio (first two components): %s' %
str (pca.explained_variance_ratio_))
print('sum of explained variance (first two components): %s' %
str (sum(pca.explained_variance_ratio_)))
'''
explained variance ratio (first two components): [0.14890594 0.13618771 0.11794594 0.08409979 0.05782415 0.0491691 0.04315986 0.03661358 0.0335324 0.03078798]
sum of explained variance (first two components): 0.7382264440497482
'''
以上代码会输出由前十个主成分解释的方差,按解释能力由高到低进行排序
上述例子的十个主成分共同解释了0.589的总方差,结果不算太差,但也确实反映了主成分分析带来的潜在损失
但是关键问题是 精简后的变量集能否便于后续的分类或者分析,降维向量保留的方差信息是否会影响分类预测的结果
x = np.arange(10)
ys = [i+x+(i*x)**2 for i in range(10)]
plt.figure()
colors = cm,rainbow(np.linspace(0,1,len(ys)))
for c, i target_name in zip(colors,[1,2,3,4,5,6,7,8,9,10],labels):
plt.scatter(data_r[labels == I,0],data_r[labels == I,1],
c = c,alpha = 0.4)
plt.legend()
plt.title('Scatterplot of Points plotted in first \n'
'10 Principal Components')
plt.show()
用pca处理数据集后,将输出结果保存到新变量data_r中,对输出结果进行可视化,为此,首先需要构建colors向量来给类上色,然后便可绘制散点图,我们可以利用主成分分析来初步了解数据集的结构,然后再进一步分析
下一篇文章 毛卷卷将应用k均值聚类算法进一步探索聚类结果