1

考虑一个充满噪声元素的向量V。找到合理的最大元素的最快(或任何)方法是什么?

例如,

V = [1 2 3 4 100 1000]
rmax = 4;

我正在考虑对元素进行排序并找到第二个微分 {ie diff(diff(unique(V)))}。

编辑:抱歉耽搁了。

我不能发布任何有代表性的数据,因为它包含 6.15e5 元素。但这是排序元素的图。

排序的

只看图,分段线性函数可能会起作用。

无论如何,关于我之前关于使用微分的猜想,这里有一个 diff(sort(V)); 的图。

差异与 x

我希望现在更清楚了。

编辑:为了清楚起见,所需的“最大值”值将是排序元素图中步骤之前的值。

4

5 回答 5

4

新答案:

根据您的排序幅度图,您的diff(sort(V))算法可能会运行良好。您只需为排序值之间的差异“太大”选择一个阈值。然后使用向量中超过该阈值的第一个点diff(sort(V))来获取用于 的阈值V。例如:

diffThreshold = 2e5;
sortedVector = sort(V);
index = find(diff(sortedVector) > diffThreshold,1,'first');
signalThreshold = sortedVector(index);

如果您有兴趣使用它,另一种选择是使用HISTC对您的数据进行分箱。您最终会得到一组低振幅和高振幅的人口稠密的箱子,中间是人口稀少的箱子。然后,需要决定将哪些 bin 计为低幅度组的一部分(例如第一组至少包含 X 个计数的 bin)。例如:

binEdges = min(V):1e7:max(V);  % Create vector of bin edges
n = histc(V,binEdges);         % Bin amplitude data
binThreshold = 100;            % Pick threshold for number of elements in bin
index = find(n < binThreshold,1,'first');  % Find first bin whose count is low
signalThreshold = binEdges(index);

旧答案(为后代):

找到“合理的最大元素”完全取决于您对合理的定义。您可以通过多种方式将点定义为异常值,例如简单地选择一组阈值并忽略您定义为“合理”之外的所有内容。假设您的数据具有正态分布,您可以使用简单的数据驱动阈值方法来V使用函数MEANSTD从向量中删除异常值:

nDevs = 2;    % The number of standard deviations to use as a threshold
index = abs(V-mean(V)) <= nDevs*std(V);  % Index of "reasonable" values
maxValue = max(V(index));              % Maximum of "reasonable" values
于 2009-07-22T00:19:13.960 回答
3

我不会排序然后差异。如果您有某种理由期望连续性或有界变化(向量是连续传感器读数),那么排序将破坏时间信息(或向量索引所代表的任何内容)。通过检测大尖峰进行过滤并不是一个坏主意,但您可能希望将尖峰与更大的邻域进行比较(第二个差异实际上让您在 +-2 的窗口内查看)。

您需要正式描述向量中的预期信息以及噪声类型。

您需要知道错误和非错误的频率和分布。在最简单的模型中,向量中的元素是独立同分布的,错误是全部或没有(您随机选择存储真值或错误)。您应该能够计算出每个元素准确的可能性与噪音的可能性。这可能非常容易(错误数据值始终在一定范围内,不会与非错误值重叠),也可能非常困难。

简化:不要对错误产生什么样的数据做任何假设(最坏的情况是:你不能排除任何错误数据点是荒谬的,但它们都等于或高于非-误差测量)。然后,如果错误概率为 p,并且您的向量有 n 个元素,那么向量中第 k 个最高元素小于或等于真实最大值的机会由累积二项分布给出 - http://en。 wikipedia.org/wiki/Binomial_distribution

于 2009-07-21T23:46:19.050 回答
3

首先,选择您最喜欢的识别异常值的方法...

于 2009-07-21T23:49:06.610 回答
2

如果您希望这些数字来自正态分布,您可以使用高于平均值的 2xsd(标准偏差)来确定您的最大值。

于 2009-07-22T00:09:47.830 回答
1

您是否可以访问无噪声元素的范围。例如,您是否知道您的无噪声元素介于 -10 和 10 之间?

在这种情况下,您可以去除噪音,然后找到最大值

max( v( find(v<=10 & v>=-10) ) )
于 2009-07-21T23:39:32.213 回答