【发布时间】:2016-02-08 04:48:39
【问题描述】:
我有一个包含 35 列的矩阵,我正在尝试使用 PCA 减少维度。我对我的数据运行 PCA:
[coeff,score,latent,tsquared,explained,mu] = pca(data);
explained =
99.9955
0.0022
0.0007
0.0003
0.0002
0.0001
0.0001
0.0001
然后,通过查看向量explained,我注意到第一个元素的值是99。基于此,我决定只取第一个组件。所以我做了以下操作:
k=1;
X = bsxfun(@minus, data, mean(data)) * coeff(:, 1:k);
现在,我使用X 进行 SVM 训练:
svmStruct = fitcsvm(X,Y,'Standardize',true, 'Prior','uniform','KernelFunction','linear','KernelScale','auto','Verbose',0,'IterationLimit', 1000000);
但是,当我尝试预测和计算错误分类率时:
[label,score,cost] = predict(svmStruct, X);
结果令人失望。我注意到,当我只选择一个组件(k=1)时,我所有的分类都是错误的。但是,随着我增加包含组件的数量k,结果会有所改善,如下图所示。但是根据explained,这没有意义,这表明我应该只使用第一个特征向量。
我做错了吗?
下图显示了分类误差作为包含的 eginvectors 数量的函数:
按照@zelanix 的建议,此图是在进行 PCA 之前进行归一化之后生成的:
这解释了在 PCA 之前进行标准化后获得的值:
>> [coeff,score,latent,tsquared,explained,mu] = pca(data_normalised);
Warning: Columns of X are linearly dependent to within machine precision.
Using only the first 27 components to compute TSQUARED.
> In pca>localTSquared (line 501)
In pca (line 347)
>> explained
explained =
32.9344
15.6790
5.3093
4.7919
4.0905
3.8655
3.0015
2.7216
2.6300
2.5098
2.4275
2.3078
2.2077
2.1726
2.0892
2.0425
2.0273
1.9135
1.8809
1.7055
0.8856
0.3390
0.2204
0.1061
0.0989
0.0334
0.0085
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
【问题讨论】:
-
矩阵有多少行你正在运行
pca? -
你的特征是不是比观测值多?
-
我的数据矩阵大约是 100K 行 X 35 列。
-
在这 100K 中,大约 8K 是正数,92K 是负数,