对一组特征向量进行采样以获得" uniform"每个特征的直方图

时间:2016-11-02 10:38:41

标签: algorithm matlab histogram sampling

我有一个n个值(特征)的m个向量(样本)矩阵,其中m~10 ^ 6,n = 20,所有特征在[0,1]中都有值。

如果我计算每个特征的直方图,那么它们就完全不同了。我计算了一个简单的10箱直方图,我可以看到,对于某些直方图,只有几个箱(甚至两个)包含所有样本,有些是高斯偏斜的,有些是近似均匀的。

我想对这些矢量的一个子集进行采样,以便得到一个"制服"分发所有功能。 这基本上意味着我希望对于每个尚未为空的bin具有近似相同数量的元素。 该子集的合理最小元素为~100。

我选择的语言是MATLAB,但我更感兴趣的是知道我是否有可以使用的算法,而不是实际的代码(我可以自己工作)。

1 个答案:

答案 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');

Resampling from analytical distribution 如您所见,分析方法可能导致对异常值的过度采样。

或者,您可以通过直方图使用完全经验的分布估计:

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);

然后像以前那样用替换执行加权样本。 Resampling with empirical distribution

然后,您需要了解如何组合多个功能的分布。在统计独立性的假设下,您可以简单地组合每个特征的权重以使用边际分布。如果要素在统计上不独立,则必须构建20维直方图。