【问题标题】:Find only relevant points in MATLAB在 MATLAB 中仅查找相关点
【发布时间】:2010-12-10 20:04:51
【问题描述】:

我有一个 MATLAB 函数,可以在样本中找到特征点。不幸的是,它仅在大约 90% 的时间内有效。但是当我知道我应该查看样本中的哪些位置时,我可以将其增加到几乎 100%。所以我想知道 MATLAB 中是否有一个函数可以让我找到大部分结果所在的范围,这样我就可以重新计算我的特征点。我有一个存储所有结果的向量,正确的结果应该在 -24.000 到 24.000 之间的 3% 范围内。而错误的结果总是低于正确的范围。不幸的是,我的统计背景非常生疏,所以我不确定如何称呼它。 有人可以给我一个提示我会寻找什么吗?是否有一个内置到 MATLAB 中的函数可以给我最小的可能范围,例如90% 的结果都是谎言。

编辑:如果我没有把我的问题说清楚,我很抱歉。我向量中的所有内容都只能在 -24.000 和 24.000 之间。我大约 90% 的结果将在大约 1.44 ([24-(-24)]*3% = 1.44) 的范围内。这些很可能是正确的结果。剩下的 10% 超出了这个范围,而且总是更低(为什么我不确定取平均值是个好主意)。这 10% 是错误的,并且是由于我的输入数据中的光点造成的。为了找到剩余的 10%,我想重复计算,但现在我只想检查小范围。 所以,我的目标是确定我的正确范围在哪里。删除我在该范围之外找到的值。然后重新计算我的值,不是在 -24.000 和 24.000 之间的范围内,而是在我已经找到 90% 值的小范围内。

【问题讨论】:

  • 我不确定我是否理解......你是说你特别想在你的向量中找到 -24 到 24 之间的点,而忽略该范围之外的任何东西?或者您是否正在寻找一种通用方法来选择一个能够捕获 90% 点的范围?

标签: matlab statistics


【解决方案1】:

也许您应该尝试平均值(在 matlab 中:mean)和标准差(在 matlab 中:std)?

您的数据的统计分布是怎样的?

另见wiki page,“解释和应用”部分。 一般而言,几乎所有分布都会出现非常有用的切比雪夫不等式。

在大多数情况下,这应该有效:

meanval = mean(data)
stDev = std(data)

并且可能大部分 (75%) 的值将放在范围内:

<meanVal - 2*stDev, meanVal + 2*stDev>

【讨论】:

  • 错字,应该是 95% 的值应该在 + 或 - 2*stDev 范围内,假设它是正态分布的数据......
  • 是的,你是对的。但我不假设它是正态分布的。切比雪夫等式发生在一般情况下,2*stDev 有 75%
  • 感谢您的回答。我在帖子中添加了一些内容以使其更清晰。也许你的方法就足够了。不幸的是,我今天没有时间处理这个了。
  • 编辑后,我写的内容仍然存在。玩它,我相信它对你有用
【解决方案2】:

您要查找的相关点是percentiles

% generate sample data
data = [randn(900,1) ; randn(50,1)*3 + 5; ; randn(50,1)*3 - 5];
subplot(121), hist(data)
subplot(122), boxplot(data)

% find 5th, 95th percentiles (range that contains 90% of the data)
limits = prctile(data, [5 95])

% find data in that range
reducedData = data(limits(1) < data & data < limits(2));

存在检测outliers 的其他方法,例如IQR outlier testthree standard deviation rule 等等:

%% three standard deviation rule
z = 3;
bounds = z * std(data)
reducedData = data( abs(data-mean(data)) < bounds );

%% IQR outlier test
Q = prctile(data, [25 75]);
IQ = Q(2)-Q(1);
%a = 1.5;   % mild outlier
a = 3.0;    % extreme outlier
bounds = [Q(1)-a*IQ , Q(2)+a*IQ]
reducedData = data(bounds(1) < data & data < bounds(2));

顺便说一句,如果您想获得对应于曲线下 90% 面积的 z 值 (|X|&lt;z),请使用:

area = 0.9;                 % two-tailed probability
z = norminv(1-(1-area)/2)

【讨论】:

    【解决方案3】:

    您似乎想在 [-24,24] 中找到使 [x,x+1.44] 中的样本点数最大化的数字 x;最快的方法可能涉及一种样本点,最终是 nlog(n) 时间;一个俗气的近似值如下:

    brkpoints = linspace(-24,24-1.44,n_brkpoints); %choose n_brkpoints big, but < # of sample points?
    n_count = histc(data,[brkpoints,inf]); %count # data points between breakpoints;
    accbins = 1.44 / (brkpoints(2) - brkpoints(1); %# of bins to accumulate;
    cscount = cumsum(n_count); %half of the boxcar sum computation;
    boxsum  = cscount - [zeros(accbins,1);cscount(1:end-accbins)]; %2nd half;
    [dum,maxi] = max(boxsum); %which interval has the maximal # counts?
    lorange = brkpoints(maxi);   %the lower range;
    hirange = lorange + 1.44
    

    这个解决方案确实捏造了一些关于底部和顶部垃圾箱等的角落案例。

    请注意,如果您要走 Chebyshev 不等式路线,Petunin 不等式可能适用,并且会略有提升。

    【讨论】:

      猜你喜欢
      • 2015-08-24
      • 2015-02-16
      • 2022-01-19
      • 1970-01-01
      • 2015-01-17
      • 2012-11-14
      • 1970-01-01
      • 2015-07-29
      • 1970-01-01
      相关资源
      最近更新 更多