【问题标题】:How to remove bias when downsampling a vector in Matlab在 Matlab 中对向量进行下采样时如何消除偏差
【发布时间】:2020-03-24 02:38:42
【问题描述】:

我有一组包含任意形状的向量,例如具有单个最大值的三角形脉冲。 我需要通过整数因子对这些向量进行下采样。 最大值相对于向量长度的位置应保持不变。

下面的代码显示,当我这样做时,下采样步骤引入了一个bias=-0.0085,平均应该为零。

根据向量的数量,偏差似乎没有太大变化(尝试在 200 到 800 个向量之间) .

我还尝试了不同的重采样函数,例如 downsampledecimate,得到了相同的结果。

datapoints = zeros(1000,800);

for ii = 1:size(datapoints,2)

    datapoints(ii:ii+18,ii) = [1:10,9:-1:1]; 
end

%downsample each column of the data
datapoints_downsampled = datapoints(1:10:end,:);

[~,maxinds_downsampled] = max(datapoints_downsampled);

[~,maxinds] = max(datapoints);

%bias needs to be zero 
bias = mean(maxinds/size(datapoints,1)-maxinds_downsampled/size(datapoints_downsampled,1))

此图显示,存在不依赖于向量数量的系统偏差

如何消除这种偏见?有没有办法只给一个向量来确定它的大小?

它来自哪里?

【问题讨论】:

  • 你是如何得出这个分布的?分布的均值不等于偏差吗?

标签: matlab resampling downsampling


【解决方案1】:

代码有两个主要问题:

  1. 将索引除以向量的长度会导致小偏差:如果最大值在第一个元素处,则 1/1000 与 1/100 不同,即使二次采样保留了该元素包含最大值。这需要通过在除法前减 1,除法后加 1/1000 来纠正。

  2. 10 倍的二次采样也会导致偏差:由于我们仅确定整数位置,因此在 1/10 的情况下我们会保留该位置,在 4/10 的情况下我们会将位置移到一个位置方向,在 5/10 的情况下,我们将位置移动到另一个方向。解决方案是使用奇数的子采样因子,或者以子采样精度确定最大值的位置(这需要在子采样之前进行适当的低通滤波)。

下面的代码是对 OP 中代码的修改,它绘制了误差与位置的散点图,以及 OP 的偏差图。第一个图有助于识别上面的问题 #2。我已经为子采样变量设置了子采样因子和偏移量,我建议您使用这些值来了解正在发生的事情。我还做了最大随机的位置以避免抽样偏差。注意我也使用N/factor 而不是size(datapoints_downsampled,1)。如果N/factor 不是整数,则下采样向量的大小是错误的值。

N = 1000;
datapoints = zeros(N,800);
for ii = 1:size(datapoints,2)
    datapoints(randi(N-20)+(1:19),ii) = [1:10,9:-1:1]; 
end
factor = 11;
offset = round(factor/2);
datapoints_downsampled = datapoints(offset:factor:end,:);

[~,maxinds_downsampled] = max(datapoints_downsampled,[],1);
[~,maxinds] = max(datapoints,[],1);

maxpos_downsampled = (maxinds_downsampled-1)/(N/factor) + offset/N;
maxpos = (maxinds)/N;
subplot(121), scatter(maxpos,maxpos_downsampled-maxpos)

bias = cumsum(maxpos_downsampled-maxpos)./(1:size(datapoints,2));
subplot(122), plot(bias)

【讨论】:

  • 第二个问题现在很清楚了,我试图改写第一个问题:问题本质上是我无法在比索引 1 更接近 0 的点开始采样吗?
  • @MrVinagi:不,这种偏见同样适用于所有元素。当比例从 1 而不是 0 开始时,这是线性缩放的问题。修改后的代码锚定一个元素(在原始数组中的索引 offset 处,最终在子采样数组中的索引 1 处),使得线性缩放使该元素保持在数组长度的相同部分。通过锚定这一个元素,在二次采样后保留的所有其他元素也会自动锚定。目标是缩放两个数组的位置,以使所有保留的元素保留相同的分数。
猜你喜欢
  • 2014-06-19
  • 2021-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-09
  • 1970-01-01
相关资源
最近更新 更多