我有一个n个值(特征)的m个向量(样本)矩阵,其中m~10 ^ 6,n = 20,所有特征在[0,1]中都有值。
如果我计算每个特征的直方图,那么它们就完全不同了。我计算了一个简单的10箱直方图,我可以看到,对于某些直方图,只有几个箱(甚至两个)包含所有样本,有些是高斯偏斜的,有些是近似均匀的。
我想对这些矢量的一个子集进行采样,以便得到一个"制服"分发所有功能。 这基本上意味着我希望对于每个尚未为空的bin具有近似相同数量的元素。 该子集的合理最小元素为~100。
我选择的语言是MATLAB,但我更感兴趣的是知道我是否有可以使用的算法,而不是实际的代码(我可以自己工作)。
答案 0 :(得分:1)
一种方法是建立每个特征值分布的近似值 - 或拟合分析分布函数 - 然后相应地对每个样本进行加权。
vfNormValues = randn(1, 10000); % Samples from Normal distribution with mu=1, sigma=0
fMean = 0; mean(vfNormValues);
fStd = 1; std(vfNormValues);
vfWeights = 1./normpdf(vfNormValues, fMean, fStd); % Assume the underlying distribution is Normal
vfSamples = randsample(vfNormValues, 8000, true, vfWeights); % Weighted random sample with replacement
figure;
subplot(1, 2, 1);
hist(vfNormValues);
title('Original samples');
subplot(1, 2, 2);
hist(vfSamples);
title('Weighted re-sampling');
或者,您可以通过直方图使用完全经验的分布估计:
nNumBins = floor(sqrt(numel(vfNormValues)));
[vnCounts, ~, vnBin] = histcounts(vfNormValues, nNumBins); % Set number of bins according to desired accuracy
vfBinWeights = 1./(vnCounts ./ sum(vnCounts));
vfWeights = vfBinWeights(vnBin);
然后,您需要了解如何组合多个功能的分布。在统计独立性的假设下,您可以简单地组合每个特征的权重以使用边际分布。如果要素在统计上不独立,则必须构建20维直方图。