降维就是一种对高维度特征数据预处理方法。降维是将高维度的数据保留下最重要的一些特征,去除噪声和不重要的特征,从而实现提升数据处理速度的目的。
降维具有如下一些优点:
主要的方法是线性映射和非线性映射方法两大类。
PCA(Principal Components Analysis)即主成分分析,是一种图像处理中使用最广泛的数据降维算法。它不仅仅是对高维数据进行降维,更重要的是经过降维去除了噪声,发现了数据中的模式。PCA把原先的n个特征用数目更少的m个特征取代,新特征是旧特征的线性组合,这些线性组合最大化样本方差,尽量使新的m个特征互不相关。
PCA方法通过消除数据的相关性,找到一个空间,使得各个类别的数据在该空间上能够很好地分离。在下图中,有一些离散的二维分布点,其中棕色表示一类集合,黄色表示另一类集合,假设这两个类别可以用特征X和特征Y进行描述,由图可知,在X轴和Y轴上这两个类别的投影是重叠的,表明这些点的两个特征X和Y没有表现出突出的识别性。但是两个类的投影在Z轴上区分度较大,显示出很好的识别性。PCA就是这样的一个工具,它可以产生非常好的降维效果。
PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上重新构造出来的k维特征。PCA的工作就是从原始的空间中顺序地找一组相互正交的坐标轴,新的坐标轴的选择与数据本身是密切相关的。其中,第一个新坐标轴选择是原始数据中方差最大的方向,第二个新坐标轴选取是与第一个坐标轴正交的平面中使得方差最大的,第三个轴是与第1,2个轴正交的平面中方差最大的。依次类推,可以得到n个这样的坐标轴。通过这种方式获得的新的坐标轴,我们发现,大部分方差都包含在前面k个坐标轴中,后面的坐标轴所含的方差几乎为0。于是,我们可以忽略余下的坐标轴,只保留前面k个含有绝大部分方差的坐标轴。事实上,这相当于只保留包含绝大部分方差的维度特征,而忽略包含方差几乎为0的特征维度,实现对数据特征的降维处理。
操作方法:
通过计算数据矩阵的协方差矩阵,然后得到协方差矩阵的特征值特征向量,选择特征值最大(即方差最大)的k个特征所对应的特征向量组成的矩阵。这样就可以将数据矩阵转换到新的空间当中,实现数据特征的降维。
由于得到协方差矩阵的特征值特征向量有两种方法:特征值分解协方差矩阵、奇异值分解协方差矩阵,所以PCA算法有两种实现方法:基于特征值分解协方差矩阵实现PCA算法、基于SVD分解协方差矩阵实现PCA算法。
样本均值:
x ˉ = 1 n ∑ i = 1 n x i \bar x = \frac{1}{n}\sum_{i=1}^nx_i xˉ=n1∑i=1nxi
样本方差:
S 2 = 1 n − 1 ∑ i = 1 n ( x i − x ˉ ) 2 S^2 = \frac{1}{n-1}\sum_{i=1}^{n}(x_i - \bar x)^2 S2=n−11∑i=1n(xi−xˉ)2
样本X和样本Y的协方差:
C o n v ( X , Y ) = E [ ( X − E ( X ) ) ( Y − E ( Y ) ) ] Conv(X,Y) = E[(X - E(X))(Y - E(Y))] Conv(X,Y)=E[(X−E(X))(Y−E(Y))]
= 1 n − 1 ∑ i = 1 n ( x i − x ˉ ) ( y i − y ˉ ) =\frac{1}{n-1}\sum_{i=1}^n(x_i - \bar x)(y_i - \bar y) =n−11∑i=1n(xi−xˉ)(yi−yˉ)
由上面的公式,我们可以得到以下结论:
特征值与特征向量, 其中,λ是特征向量v对应的特征值,一个矩阵的一组特征向量是一组正交向量。
A v = λ v Av = \lambda v Av=λv
特征值分解矩阵, 对于矩阵A,有一组特征向量v,将这组向量进行正交化单位化,就能得到一组正交单位向量。特征值分解,就是将矩阵A分解为如下式, 其中,P是矩阵A的特征向量组成的矩阵, ∧ \wedge ∧则是一个对角阵,对角线上的元素就是特征值。
A = P ∧ P − 1 A = P \wedge P^{-1} A=P∧P−1
是一种因子分解运算,将一个矩阵分解为3个矩阵的乘积:
3个矩阵: U, Σ 和 V,其中U和V是正交矩阵,分别称为左奇异值、右奇异值,Σ 为奇异值
奇异值分解是一个能适用于任意矩阵的一种分解的方法,对于任意矩阵A总是存在一个奇异值分解:
A ≈ U Σ V T A \approx UΣV^T A≈UΣVT
full_matrices=True时,表示U和V是全矩阵, 假设A是一个 m ∗ n m*n m∗n的矩阵,那么得到的U是一个 m ∗ m m*m m∗m的方阵,U里面的正交向量被称为左奇异向量。Σ是一个 m ∗ n m*n m∗n的矩阵,Σ除了对角线其它元素都为0,对角线上的元素称为奇异值。
full_matrices=False时,表示U和V不是全矩阵, 假设A是一个 m ∗ n m*n m∗n的矩阵,那么得到的U是一个 m ∗ k m*k m∗k的方阵,U里面的正交向量被称为左奇异向量。Σ是一个 k ∗ k k*k k∗k的矩阵,Σ除了对角线其它元素都为0,对角线上的元素称为奇异值。
LDA线性判别分析也是一种经典的降维方法,LDA是一种监督学习的降维技术,也就是说它的数据集的每个样本是有类别输出的。这点和PCA不同。PCA是不考虑样本类别输出的无监督降维技术。LDA的思想可以用一句话概括,就是“投影后类内方差最小,类间方差最大”。什么意思呢? 我们要将数据在低维度上进行投影,投影后希望每一种类别数据的投影点尽可能的接近,而不同类别的数据的类别中心之间的距离尽可能的大。
给定训练集样例,设法将样例投影到一条直线上,使得同类样例的投影尽可能接近,异类样例的投影点尽可能原理;在对新的样本进行分类时,将其投影到同样的这条直线上,再根据投影点的位置来确定新样本的类别。
LDA算法实现方式:
NMF的基本思想可以简单描述为:对于任意给定的一个非负矩阵A,NMF算法能够寻找到一个非负矩阵U和一个非负矩阵V,使得满足 ,从而将一个非负的矩阵分解为左右两个非负矩阵的乘积。
解前后可理解为:原始矩阵V的列向量是对左矩阵W中所有列向量的加权和,而权重系数就是右矩阵对应列向量的元素,故称W为基矩阵,H为系数矩阵。
原矩阵V中的一列向量可以解释为对左矩阵W中所有列向量(称为基向量)的加权和,而权重系数为右矩阵H中对应列向量中的元素。这种基于基向量组合的表示形式具有很直观的语义解释,它反映了人类思维中“局部构成整体”的概念。
虽然NMF是一个很厉害的算法,但其实质是加权和,我们可以在原理上等效为基本的线性方程。
所谓LLE(局部线性嵌入)即”Locally Linear Embedding”的降维算法,在处理所谓流形降维的时候,效果比PCA要好很多。首先,所谓流形,我们脑海里最直观的印象就是Swiss roll,在吃它的时候喜欢把它整个摊开成一张饼再吃,其实这个过程就实现了对瑞士卷的降维操作,即从三维降到了两维。降维前,我们看到相邻的卷层之间看着距离很近,但其实摊开成饼状后才发现其实距离很远,所以如果不进行降维操作,而是直接根据近邻原则去判断相似性其实是不准确的。
和传统的PCA,LDA等关注样本方差的降维方法相比,LLE关注于降维时保持样本局部的线性特征(保持原有拓扑结构),由于LLE在降维时保持了样本的局部特征,它广泛的用于图像识别,高维数据可视化等领域。LLE是非线性降维技术,可以说是流形学习方法最经典的算法之一。很多后续的流形学习、降维方法都与LLE有密切联系。
# 降维,高维数据降成低维的数据
# manifold 流形
from sklearn.manifold import LocallyLinearEmbedding
from sklearn.decomposition import PCA
from sklearn import datasets
import matplotlib.pyplot as plt
%matplotlib inline
from mpl_toolkits.mplot3d.axes3d import Axes3D
X,t = datasets.make_swiss_roll(n_samples=1500,noise=0.05,random_state= 1024)
fig = plt.figure(figsize=(12,9))
# axes3D = Axes3D(fig)
axes3D = fig.add_subplot(projection = '3d')
axes3D.view_init(7,-80)
axes3D.scatter(X[:,0],X[:,1],X[:,2],c = t)
pca = PCA(n_components= 2)
X_pca = pca.fit_transform(X)
plt.scatter(X_pca[:,0],X_pca[:,1],c = t)
lle = LocallyLinearEmbedding(n_neighbors=10,n_components=2)
lle.fit(X)
X_lle = lle.transform(X)
plt.scatter(X_lle[:,0],X_lle[:,1],c = t)