文章目录
降维技术(一)
降维方法:
(1)主成分分析(Principal Component Analysis, PCA)
(2)因子分析(Factor Analysis)
(3)独立成分分析(Independent Componet Analysis,ICA)
在上述三种降维方法中,PCA的应用最广泛,所以先学习介绍PCA。
PCA(主成分分析)
PCA通常用于高维数据集的探索与可视化。还可以用于数据压缩,数据预处理等。
一、 原理:
PCA可以把可能具有相关性的高维变量合成线性无关的低维变量,称为主成分( principal components)。新的低维数据集会尽可能的保留原始数据的变量。 数据从原来的坐标系换到了新的坐标系,新坐标系的选择是由数据本身决定的。第一个主成分选择的是原始数据中方差最大的方向,第二个主成分的选择和第一个主成分方向正交且具有最大方差的方向。
二、 优缺点
**优点:**降低数据的复杂性,识别最重要的多个特征。
**缺点:**不一定需要,且可能损失有用信息。
**适用数据类型:**数值型数据
三、 相关术语:
简单介绍一下算法过程中用到的统计量,并给出在算法实现过程中相应的代码实现。
1. 均值:
import numpy as np
myMat = np.mat([[4,4,0,2,2],
[4,0,0,3,3],
[4,0,0,1,1],
[1,1,1,2,0],
[2,2,2,0,0],
[1,1,1,0,0],
[5,5,5,0,0]])
meanVals = np.mean(myMat,axis = 0)
print(meanVals)
均值运行结果:
[[ 3. 1.85714286 1.28571429 1.14285714 0.85714286]]
2. 方差:
度量一组数据分散的程度,是各个样本与样本均值的差的平方和的均值:
3. 协方差:
是度量两个变量线性相关性程度。如果两个变量的协方差为0,则统计学上认为二者无关,这里的无关是线性无关。(独立一定不相关,不相关不一定独立)计算公式如下:
4. 协方差矩阵:
由数据集中两两变量的协方差组成。
covMat = np.cov(myMat.T)
协方差矩阵运行结果:
[[ 2.66666667 1.33333333 0.66666667 0.33333333 1. ]
[ 1.33333333 3.80952381 2.38095238 -0.80952381 -0.52380952]
[ 0.66666667 2.38095238 3.23809524 -1.38095238 -1.28571429]
[ 0.33333333 -0.80952381 -1.38095238 1.47619048 1.19047619]
[ 1. -0.52380952 -1.28571429 1.19047619 1.47619048]]
5. 特征值和特征向量:
eigVals, eigVects = np.linalg.eig(covMat)
print(eigVals)
print(eigVects)
特征值:
[ 7.06276993 3.86330361 1.08806848 0.12490052 0.52762412]
特征向量:
[[ 0.22031118 0.71806211 0.50900636 0.32781747 -0.26324516]
[ 0.65485245 0.24682707 -0.70201972 0.00334892 -0.13191578]
[ 0.62487261 -0.1591642 0.41299551 -0.23038585 0.60046486]
[-0.28445191 0.36523788 -0.27358812 0.40829523 0.73765368]
[-0.22639034 0.51452041 -0.05162453 -0.82020842 0.09278585]]
四、过程:
(1)去除平均值
(2)计算协方差矩阵
(3)计算协方差矩阵的特征值和特征向量
(4)将特征从大到小排序
(5)保留最上面的N个特征向量
(6)将数据转换到上述N各特征向量构建的新空间中
五、代码实现
我们要将5维特征变为3维,直接计算协方差矩阵,该过程的前四步已经在前面术语的介绍中完成。由于得到的特征值和特征向量不是有序的,而我们需要有序的挑选最大的几个特征值,所以要对特征值进行排序,从第四步开始实现。
#特征值从小到大的索引排序
eigSorted = np.argsort(eigVals)
#倒序排序
reSort = eigSorted[:-len(eigSorted)-1:-1]
#打印出排序的特征值和特征向量
print(eigVals[reSort])
##特征向量按行存储
reEigVects = eigVects[reSort,:]
lowDVects = reEigVects[0:3,]
print(lowDVects)
运行结果:
由大到小重新排序的特征值
[ 7.06276993 3.86330361 1.08806848 0.52762412 0.12490052]
降维后的特征向量
[[ 0.22031118 0.71806211 0.50900636 0.32781747 -0.26324516]
[ 0.65485245 0.24682707 -0.70201972 0.00334892 -0.13191578]
[ 0.62487261 -0.1591642 0.41299551 -0.23038585 0.60046486]
meanVals = np.mean(myMat,axis = 0)
lowDMat = meanRemoved * lowDVects.T
print(lowDMat)
均值化后的数据:
[[ 1. 2.14285714 -1.28571429 0.85714286 1.14285714]
[ 1. -1.85714286 -1.28571429 1.85714286 2.14285714]
[ 1. -1.85714286 -1.28571429 -0.14285714 0.14285714]
[-2. -0.85714286 -0.28571429 0.85714286 -0.85714286]
[-1. 0.14285714 0.71428571 -1.14285714 -0.85714286]
[-2. -0.85714286 -0.28571429 -1.14285714 -0.85714286]
[ 2. 3.14285714 3.71428571 -1.14285714 -0.85714286]]
降维后的数据
[[ 1.08471374 1.93847397 0.24158421]
[-1.72296241 0.82259885 1.24832004]
[-1.85210702 1.07973258 0.50816201]
[-0.69490944 -1.20475272 -1.94347523]
[ 0.09683527 -1.01179076 -0.60399962]
[-1.35054438 -1.21145055 -1.48270353]
[ 4.43897423 -0.41281137 2.03211212]]
六、SVD降维
在主成分分析(PCA)原理总结中,我们说要用PCA降维,需要找到样本协方差矩阵XTX最大的d个特征向量,然后用这最大的d个特征向量张成的矩阵来做低维投影降维。可以看出,在这个过程中需要先求出协方差矩阵XTX,当样本数多,样本特征数也多的时候,这种方法的计算量是很大的,因此就有了另一种计算主成分的方法。该方法可以不用先求出协方差矩阵XTX,只需要求出右奇异矩阵V就可以得到协方差矩阵,该方法就是利用SVD降维,公式如下:
将ATA的所有特征向量张成一个n×n的矩阵V,就是我们SVD公式里面的V矩阵了。一般我们将V中的每个特征向量叫做A的右奇异向量。右奇异矩阵可以用于列数即特征维度的压缩,也就是我们的PCA降维。
将AAT的所有特征向量张成一个m×m的矩阵U,就是我们SVD公式里面的U矩阵了。一般我们将U中的每个特征向量叫做A的左奇异向量。左奇异矩阵可以用于行数的压缩。
SVD得出的奇异向量也是从奇异值由大到小排列的,按PCA的观点来看,方差最大的坐标轴就是第一个奇异向量,方差次大的坐标轴就是第二个奇异向量。
U,Sigma,VT = np.linalg.svd(myMat)
rowD = U[:,:3].T * myMat
print(rowD)
lowDMat = myMat * VT.T[:,:3]
print(lowDMat)
lowDMat = U[:,:3] * reSigma *VT[:3,]
print(lowDMat)
行压缩
[[-8.63070081 -6.12462826 -4.1799896 -2.63667672 -2.29496669]
[-1.65910435 2.37323474 3.33156956 -2.91377856 -2.81449896]
[-1.06718321 1.95207108 -1.17602912 0.55265946 0.31086921]]
列降维
[[-5.78696082 -1.43541906 2.02943835]
[-4.14315795 -3.97597014 -0.64665815]
[-3.31454819 -2.06377322 -1.31216352]
[-2.03375835 -0.29740718 0.31373573]
[-3.18149317 1.35052378 -0.22437711]
[-1.59074659 0.67526189 -0.11218855]
[-7.95373293 3.37630945 -0.56094277]]
重构后的数据
[[ 3.75882897e+00 3.93552733e+00 3.14268322e-01 2.41213328e+00
2.03313584e+00]
[ 4.37098660e+00 7.04080744e-02 -4.62953777e-01 2.71367176e+00
2.58910050e+00]
[ 3.51434619e+00 -9.90889288e-02 6.10971280e-01 1.45843497e+00
1.45134300e+00]
[ 1.42793888e+00 1.16461243e+00 4.06617551e-01 6.61942661e-01
5.69400307e-01]
[ 2.02506118e+00 2.00314495e+00 1.96987305e+00 1.29268899e-04
-4.79169143e-02]
[ 1.01253059e+00 1.00157247e+00 9.84936526e-01 6.46344496e-05
-2.39584571e-02]
[ 5.06265296e+00 5.00786237e+00 4.92468263e+00 3.23172248e-04
-1.19792286e-01]]
##附:专业词汇
降维 dimensionality reduction
主成分分析 Principal Component Analysis
奇异值分解 Singular Value Decomposition
另:一些说明
1、本博客仅用于学习交流,欢迎大家瞧瞧看看,为了方便大家学习,相关论文请去知网等地方自行下载。
2、如果原作者认为侵权,请及时联系我,我的qq是1294865211,邮箱是1294865211@qq.com,我会及时删除侵权文章。
3、我的文章大家如果觉得对您有帮助或者您喜欢,请您在转载的时候请注明来源,不管是我的还是其他原作者,我希望这些有用的文章的作者能被大家记住。
4、最后希望大家多多的交流,提高自己,从而对社会和自己创造更大的价值。