摘要
第3章
CHAPTER 3
Python数据降维
伴随ICT(通信与信息技术)和互联网技术的不断发展,人们收集和获得数据的能力越来越强。而这些数据已呈现出维数高、规模大和结构复杂等特点。
人们想利用这些大数据(维数大、规模大、复杂大),挖掘其中有意义的知识和内容以指导实际生产和具体应用,数据的降维就显得尤为重要了。数据降维又称为维数约简。顾名思义,就是降低数据的维数。为什么要降低数据的维数?如何有效地降低数据的维数?由此问题引发了广泛的研究和应用。
数据降维,一方面可以解决“维数灾难”,缓解“信息丰富、知识贫乏”现状,降低复杂度; 另一方面可以更好地认识和理解数据。
截止到目前,数据降维的方法很多。从不同的角度入手可以有着不同的分类,主要分类方法有: 根据数据的特性可以划分为线性降维和非线性降维,根据是否考虑和利用数据的监督信息可以划分为无监督降维、有监督降维和半监督降维,根据保持数据的结构可以划分为全局保持降维、局部保持降维和全局与局部保持一致降维等。
总之,数据降维意义重大,数据降维方法众多,很多时候需要根据特定问题选用合适的数据降维方法。数据降维是机器学习领域中非常重要的内容。
3.1维度灾难与降维
1. 维度灾难
维度灾难(curse of dimensionality)用来描述当(数学)空间维度增加时,分析和组织高维空间(通常有成百上千维),因体积指数增加而遇到各种问题场景。在机器学习中,维度灾难常指以下问题:
在高维情况下,数据样本稀疏。
例如,k近邻法的讨论中经常涉及维度灾难,是因为k近邻法基于一个重要的基本假设: 任意样本附近任意小的距离内总能找到一个训练样本,即训练样本的采样密度足够大,也称为“密采样”,才能保证分类性能; 当特征维度很大时,满足密采样的样本数量会呈指数级增长,大到几乎无法达到。
在高维情况下,涉及距离、内积的计算变得困难。
其实,不仅是k近邻,其他机器学习算法几乎都会遇到维度灾难的问题。
2. 降维
缓解维度灾难的一个重要途径就是降维。
1) 为什么能够进行降维
这是因为很多时候,数据是高维的,但是与学习任务(分类、回归等)密切相关的仅是某个低维分布,即高维空间中的某个低维难嵌入。因此,很多情况下,高维空间中的样本点,在低维嵌入子空间中更容易学习。
2) 线性降维
一般来说,想获得低维子空间,最简单的方法是对原始高维空间进行线性变换:
给定d维空间中的样本X=(x1,x2,…,xm)∈Rd×m,变换之后得到d′≤d维空间中的样本
Z=WTX
其中,W∈Rd×d′是变换矩阵,Z∈Rd′×m是样本在新空间中的表达。
变换矩阵W可视为d′个d维基向量,新空间中的属性是原空间属性的线性组合,基于线性变换来进行降维的方法称为线性维方法,都符合上面的式子,主要区别在于对低维子空间的性质有所不同,相当于对W施加了不同的约束。
3) 降维效果的评估
通常通过比较降维前后学习器性能,若性能有提高,则认为降维起到了作用。针对已经降到二维或者三维的情况,可以利用可视化技术直观地判断降维效果。
3.2主成分分析
主成分分析(Principal Component Analysis,PCA)是一种最常用的无监督降维方法,通过降维技术把多个变量化为少数几个主成分(综合变量)的统计分析方法。这些主成分能够反映原始变量的绝大部分信息,它们通常表示为原始变量的某种线性组合。
3.2.1PCA原理
为了便于维度变换,有如下假设。
假设样本数据是n维的。
假设原始坐标系为: 由标准正交基向量{i→1,i→2,…,i→n}张成的空间,其中‖i→s‖=1; i→s·i→t=0,s≠t。
假设经过线性变换后的新坐标系为: 由标准正交基向量j→1,j→2,…,j→n张成的空间,其中‖j→s‖=1; j→s·j→t=0,s≠t。
根据定义,有:
j→s=(i→1,i→2,…,i→n)j→s·i→1
j→s·i→n,s=1,2,…,n
记ws=(j→s·i→1,j→s·i→2,…,j→s·i→n)T(它是一个列向量,但是为了与基向量做区分,这里没有给出向量的箭头符号),其各分量就是基向量j→s在原始坐标系{i→1,i→2,…,i→n}中的投影。即: j→s=(i→1,i→2,…,i→n)·ws。根据标准正交基的性质,有:
‖ws‖=1,s=1,2,…,n;
ws·wt=0,s≠t。
根据定义,有:
(j→1,j→2,…,j→n)=(i→1,i→2,…,i→n)(w1,w2,…,wn)
令坐标变换矩阵W为:
W=(w1,w2,…,wn)=j→1·i→1j→2·i→1…j→n·i→1
j→1·i→2j→2·i→2…j→n·i→2
return newData
def CSVD_manual():
#训练数据集,用户对商品的评分矩阵,行为多个用户对单个商品的评分,列为用户对每个
#商品的评分
data = np.array([[5, 5, 0, 5],
[5, 0, 3, 4],
[3, 4, 0, 3],
[0, 0, 5, 3],