您的问题与 Mahoney 和 Drineas 中讨论的 COLUMNSELECT 问题相同“用于改进数据分析的 CUR 矩阵分解”.
他们首先计算每个维度的杠杆分数,然后使用杠杆分数作为权重随机选择其中的 3 个维度。或者,您可以选择最大的。这是解决您问题的脚本:
我首先从网上获得了一张真实的自然图像,并将其调整为您要求的尺寸。图片如下:
%# Example data from real image of size 179x8
%# You can skip it for your own data
features = im2double(rgb2gray(imread('img.png')));
%# m samples, n dimensions
[m,n] = size(features);
然后,计算集中数据:
%# Remove the mean
features = features - repmat(mean(features,2), 1, size(features,2));
我使用 SVD 来计算 PCA,因为它可以提供主成分和系数。如果样本位于列中,则U
持有主要成分。检查第二页这张纸为了关系。
%# Compute the SVD
[U,S,V] = svd(features);
这里的关键思想是我们想要获得具有大部分变化的维度。一个假设是数据中存在一些噪音。我们只选择主要特征向量,例如代表了95%的数据。
%# Compute the number of eigenvectors representing
%# the 95% of the variation
coverage = cumsum(diag(S));
coverage = coverage ./ max(coverage);
[~, nEig] = max(coverage > 0.95);
然后使用以下公式计算杠杆分数nEig
的主要成分。也就是说,我们取范数nEig
系数。
%# Compute the norms of each vector in the new space
norms = zeros(n,1);
for i = 1:n
norms(i) = norm(V(i,1:nEig))^2;
end
然后,我们可以对杠杆分数进行排序:
%# Get the largest 3
[~, idx] = sort(norms);
idx(1:3)'
并获取具有最大杠杆分数的向量的索引:
ans =
6 8 5
您可以查看论文以了解更多详细信息。
但是,请记住,如果您有很多维度,基于 PCA 的技术会很好。就您而言,搜索空间非常小。我的建议是在空间中进行详尽的搜索,并按照 @amit 的建议获得最佳选择。