考虑一个带有嘈杂元素的矢量 V 。找到合理的最大元素的最快(或任何)方法是什么?
例如,
V = [1 2 3 4 100 1000]
rmax = 4;
我正在考虑对元素进行排序并找到第二个差异{即差异(差异(唯一的(V)))}。
编辑:对延迟感到抱歉。我无法发布任何代表性数据,因为它包含6.15e5元素。但这是一个已排序元素的图。
通过观察图表,分段线性函数可能起作用。
无论如何,关于我之前关于使用差异的猜想,这里是diff(sort(V))的图;
我希望现在更清楚了。
编辑:为了清楚起见,所需的“最大”值将是排序元素图中步骤之前的值。
答案 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(后代):
找到“合理的最大元素”完全取决于您对合理的定义。您可以通过多种方式将点定义为异常值,例如简单地选择一组阈值并忽略您定义为“合理”之外的所有内容。假设您的数据具有正态分布,您可以使用简单的数据驱动阈值方法,使用函数MEAN和STD从V
向量中移除异常值:
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) ) )