在向量中找到合理的(无噪声)最大元素

时间:2009-07-21 22:56:31

标签: math matlab vector max

考虑一个带有嘈杂元素的矢量 V 。找到合理的最大元素的最快(或任何)方法是什么?

例如,

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

我正在考虑对元素进行排序并找到第二个差异{即差异(差异(唯一的(V)))}。

编辑:对延迟感到抱歉。

我无法发布任何代表性数据,因为它包含6.15e5元素。但这是一个已排序元素的图。

sorted

通过观察图表,分段线性函数可能起作用。

无论如何,关于我之前关于使用差异的猜想,这里是diff(sort(V))的图;

diff vs x

我希望现在更清楚了。

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

5 个答案:

答案 0 :(得分:4)

新答案:

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

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

另一种选择,如果您有兴趣玩弄它,就是使用HISTC来分类数据。你最终会得到低强度和高强度的人口密集的垃圾箱,其间有人烟稀少的垃圾箱。然后,这将决定您将哪些箱子视为低振幅组的一部分(例如包含至少X个计数的第一组箱)。例如:

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

OLD ANSWER(后代):

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

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

答案 1 :(得分:3)

我不会那么区别。如果您有某种理由期望连续性或有限变化(向量是连续的传感器读数),那么排序将破坏时间信息(或矢量索引表示的任何内容)。通过检测大的尖峰进行过滤并不是一个坏主意,但是你想要将尖峰与较大的邻域进行比较(第二个差异有效地让你在+ -2的窗口内看到)。

您需要正式描述矢量中的预期信息和噪声类型。

您需要知道错误和非错误的频率和分布。在最简单的模型中,向量中的元素是独立且相同的分布,并且错误是全部或无(您随机选择存储真值或错误)。你应该能够找出每个元素准确的机会,以及它的噪音几率。这可能非常简单(错误数据值总是在一定范围内,与非错误值不重叠),或非常困难。

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

答案 2 :(得分:3)

首先,选择您最喜欢的method for identifying outliers ...

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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

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

max( v( find(v<=10 & v>=-10) ) )