降维技术(一)主成分分析

降维技术(一)

降维方法:
(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、最后希望大家多多的交流,提高自己,从而对社会和自己创造更大的价值。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
主成分分析(Principal Component Analysis,PCA)是一种常用的降维技术,用于减少高维数据的特征数量。在Matlab中,可以使用内置函数`pca`来进行主成分分析。 下面是一个简单的示例代码,展示如何使用Matlab进行主成分分析降维: ```matlab % 假设有一个包含m个样本和n个特征的数据矩阵X X = [x1, x2, x3, ..., xn]; % 对数据进行中心化处理 X_centered = X - mean(X); % 计算协方差矩阵 covariance_matrix = cov(X_centered); % 进行特征值分解 [eigenvectors, eigenvalues] = eig(covariance_matrix); % 将特征向量按照对应的特征值大小降序排列 [~, index] = sort(diag(eigenvalues), 'descend'); eigenvectors_sorted = eigenvectors(:, index); % 选择前k个特征向量作为新的基,k为降维后的维度 k = 2; new_basis = eigenvectors_sorted(:, 1:k); % 将数据投影到新的基上得到降维后的数据 reduced_data = X_centered * new_basis; ``` 在上述代码中,通过计算数据矩阵的协方差矩阵,然后进行特征值分解,得到特征向量和特征值。将特征向量按照对应的特征值大小降序排列,选择前k个特征向量作为新的基,然后将数据投影到新的基上得到降维后的数据。 需要注意的是,上述代码中的`X`表示输入的数据矩阵,每一列代表一个特征,每一行代表一个样本。`x1, x2, x3, ..., xn`是数据矩阵的列向量。 希望以上代码能够帮助到你!如有任何问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值