为了将高维度的能谱数据进行降维,在学习PCA降维时,了解到Matlab中的drtoolbox工具箱,这个Matlab数据降维工具箱,包括了包含PCA在内的几乎所有的数据降维方法,使用起来非常方便。下面是这个工具箱的安装方式(我使用的是Matlab R2016a)
下载地址:
https://lvdmaaten.github.io/drtoolbox/code/drtoolbox.tar.gz
下载后,将其解压到Matlab目录下的的toolbox文件夹中,并将其全部添加到路径。
完成后,在命令行输入rehash toolboxcache 命令,完成工具箱加载。
>>rehash toolboxcache
可以在命令行输入what drtoolbox和what drtoolbox\techniques测试安装是否成功。
>>what drtoolbox
>>what drtoolbox\techniques
起初我意向将4096*1的能谱数据降低维度,后来了解到drtoolbox 的 compute_mapping
函数接受一个数据矩阵作为输入,其中每一行代表一个样本,每一列代表一个特征。于是我将数据转置为1*4096的形式,进行PCA降维。
data = importdata('1.txt');
data = data.data;
X = data(9:end, 1);
Y = X';
[mappedX, mapping] = compute_mapping(Z, 'PCA', 32);
遇到如下报错
警告: Target dimensionality reduced to 1.
> In pca (line 53)
In compute_mapping (line 378)
提示我PCA (主成分分析) 算法在降维过程中自动将目标维度调整为 1。
参考了相关博客 https://blog.csdn.net/mingtian715/article/details/54172281
了解到了PCA降维后的维数一定要小于数据样本数!!!(详情请见上博客)
为了验证该结论,我使用reshape函数将该1*4096的矩阵转换为16*256的,并试图将其降维为16*32。
提示我维度自动调整到了16,刚好为数据样本数,降维后的矩阵也为16*16,验证了以上说法。于是我将1*4096的矩阵reshape为32*128,设置PCA降维后的矩阵维度为2,并以散点图形式显示。
data = importdata('1.txt');
X = data(9:end, 1);
Y = X';
Z=reshape(Y,32,128)
[mappedX, mapping] = compute_mapping(Z, 'PCA', 2);
scatter(mappedX(:, 1), mappedX(:, 2));
title('Result of Dimensionality Reduction');
成功将其降维为32*2,实现了使用Matlab数据降维工具箱进行PCA降维。