对一组特征向量进行采样以获得每个特征的 "uniform" 直方图
Sampling a set of vectors of features in order to obtain "uniform" histograms for every feature
我有一个包含 n 个值(特征)的 m 个向量(样本)的矩阵,其中 m ~ 10^6,n = 20,并且所有特征的值都在 [0,1] 中。
如果我为每个特征计算直方图,它们就会大不相同。我计算了一个简单的 10 bins 直方图,我可以看到对于某些直方图,只有几个 bins(甚至两个)包含所有样本,一些是倾斜的高斯分布,而另一些则是近似均匀的。
我想对这些向量的一个子集进行采样,以便对所有特征进行 "uniform" 分布。
这基本上意味着我想为每个还不是空的箱子拥有大约相同数量的元素。
该子集的合理最小元素为 ~100。
我选择的语言是 MATLAB,但我更想知道是否有我可以使用的算法,而不是实际代码(我可以自己编写)。
一种方法是建立一个近似值沿每个特征的分布——或者拟合一个分析分布函数——然后相应地对每个样本进行加权。
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 维直方图。
我有一个包含 n 个值(特征)的 m 个向量(样本)的矩阵,其中 m ~ 10^6,n = 20,并且所有特征的值都在 [0,1] 中。
如果我为每个特征计算直方图,它们就会大不相同。我计算了一个简单的 10 bins 直方图,我可以看到对于某些直方图,只有几个 bins(甚至两个)包含所有样本,一些是倾斜的高斯分布,而另一些则是近似均匀的。
我想对这些向量的一个子集进行采样,以便对所有特征进行 "uniform" 分布。 这基本上意味着我想为每个还不是空的箱子拥有大约相同数量的元素。 该子集的合理最小元素为 ~100。
我选择的语言是 MATLAB,但我更想知道是否有我可以使用的算法,而不是实际代码(我可以自己编写)。
一种方法是建立一个近似值沿每个特征的分布——或者拟合一个分析分布函数——然后相应地对每个样本进行加权。
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 维直方图。