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

Math 在向量中找到合理(无噪声)的最大元素,math,matlab,vector,max,Math,Matlab,Vector,Max,考虑一个向量V充满了嘈杂的元素。找到合理的最大元素的最快(或任何)方法是什么 例如 V = [1 2 3 4 100 1000] rmax = 4; 我在考虑对元素进行排序,并找到第二个微分{即diff(diff(unique(V))} 编辑:很抱歉耽搁了 我不能发布任何有代表性的数据,因为它包含6.15e5元素。但这里有一个排序元素的图 只要看一下图,分段线性函数就可以工作 无论如何,关于我之前关于使用微分的猜想,这里有一个diff(sort(V))的图 我希望现在更清楚了 编辑:为

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

例如

V = [1 2 3 4 100 1000]
rmax = 4;
我在考虑对元素进行排序,并找到第二个微分{即diff(diff(unique(V))}

编辑:很抱歉耽搁了

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

只要看一下图,分段线性函数就可以工作

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

我希望现在更清楚了


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

您是否有权访问无噪元素的边界。例如,您是否知道无噪元素介于-10和10之间

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

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

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

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

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

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

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

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


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

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

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

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


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

首先,选择您最喜欢的…

首先,选择你最喜欢的…

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

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

新答案:

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

diffThreshold = 2e5;
sortedVector = sort(V);
index = find(diff(sortedVector) > diffThreshold,1,'first');
signalThreshold = sortedVector(index);
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);
另一种选择是,如果您有兴趣玩弄它,可以使用。最终,你会发现一组高密度的垃圾箱,在低振幅和高振幅两种情况下,垃圾箱的密度都很低。这将是一个决定哪些料仓属于低振幅组的问题(例如,第一组料仓至少包含X个计数)。例如:

diffThreshold = 2e5;
sortedVector = sort(V);
index = find(diff(sortedVector) > diffThreshold,1,'first');
signalThreshold = sortedVector(index);
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);

新答案:

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