我正在尝试使用MATLAB princomp
进行降维,但我不确定我做对了。
这是我的代码仅用于测试,但我不确定我的投影是否正确:
A = rand(4,3)
AMean = mean(A)
[n m] = size(A)
Ac = (A - repmat(AMean,[n 1]))
pc = princomp(A)
k = 2; %Number of first principal components
A_pca = Ac * pc(1:k,:)' %Not sure I'm doing projection right
reconstructedA = A_pca * pc(1:k,:)
error = reconstructedA- Ac
我使用 ORL 数据集进行人脸识别的代码:
%load orl_data 400x768 double matrix (400 images 768 features)
%make labels
orl_label = [];
for i = 1:40
orl_label = [orl_label;ones(10,1)*i];
end
n = size(orl_data,1);
k = randperm(n);
s = round(0.25*n); %Take 25% for train
%Raw pixels
%Split on test and train sets
data_tr = orl_data(k(1:s),:);
label_tr = orl_label(k(1:s),:);
data_te = orl_data(k(s+1:end),:);
label_te = orl_label(k(s+1:end),:);
tic
[nn_ind, estimated_label] = EuclDistClassifier(data_tr,label_tr,data_te);
toc
rate = sum(estimated_label == label_te)/size(label_te,1)
%Using PCA
tic
pc = princomp(data_tr);
toc
mean_face = mean(data_tr);
pc_n = 100;
f_pc = pc(1:pc_n,:)';
data_pca_tr = (data_tr - repmat(mean_face, [s,1])) * f_pc;
data_pca_te = (data_te - repmat(mean_face, [n-s,1])) * f_pc;
tic
[nn_ind, estimated_label] = EuclDistClassifier(data_pca_tr,label_tr,data_pca_te);
toc
rate = sum(estimated_label == label_te)/size(label_te,1)
如果我选择足够多的主成分,它会给我相同的识别率。如果我使用少量的主成分(PCA),那么使用 PCA 的比率会更差。
这里有一些问题:
- 函数是使用 MATLAB
princomp
计算前k个主成分的最佳方法吗? - 使用 PCA 投影特征与原始特征并不能提供额外的准确性,而只能提供更小的特征向量大小?(更快地比较特征向量)。
- 如何自动选择与原始特征向量具有相同精度的最小k (主成分数)?
- 如果我有非常大的样本集,我可以只使用其中的子集并具有相当的准确性吗?或者我可以在某个集合上计算 PCA,然后“添加”一些其他集合(我不想为 set1+set2 重新计算 pca,但以某种方式迭代地将来自 set2 的信息添加到来自 set1 的现有 PCA)?
我还简单地尝试了 GPU 版本gpuArray
:
%Test using GPU
tic
A_cpu = rand(30000,32*24);
A = gpuArray(A_cpu);
AMean = mean(A);
[n m] = size(A)
pc = princomp(A);
k = 100;
A_pca = (A - repmat(AMean,[n 1])) * pc(1:k,:)';
A_pca_cpu = gather(A_pca);
toc
clear;
tic
A = rand(30000,32*24);
AMean = mean(A);
[n m] = size(A)
pc = princomp(A);
k = 100;
A_pca = (A - repmat(AMean,[n 1])) * pc(1:k,:)';
toc
clear;
它的工作速度更快,但不适合大型矩阵。也许我错了?
如果我使用一个大矩阵,它会给我:
使用 gpuArray 时出错 设备内存不足。