代码之家  ›  专栏  ›  技术社区  ›  Lucas

在matlab中只找到相关点

  •  2
  • Lucas  · 技术社区  · 15 年前

    我有一个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%值的小范围内。

    3 回复  |  直到 9 年前
        1
  •  3
  •   Amro    9 年前

    你要找的相关点是 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 test 以及 three 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));
    

    btw如果你想得到z值( |X|<z )相当于曲线下90%的面积,使用:

    area = 0.9;                 % two-tailed probability
    z = norminv(1-(1-area)/2)
    
        2
  •  1
  •   Gacek    15 年前

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

    你的数据的统计分布是什么?

    也见此 wiki page “解释和应用”一节。 一般来说,对于几乎所有的分布,切比雪夫的不等式都是非常有用的。

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

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

    您的值中的大部分(75%)可能会放在范围内:

    <meanVal - 2*stDev, meanVal + 2*stDev>
    
        3
  •  0
  •   shabbychef    15 年前

    似乎您希望找到在[-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
    

    这个解决方案确实会篡改一些关于底部和顶部垃圾箱等的角箱内容。

    请注意,如果你要走切比雪夫不平等的道路,佩图宁的不平等可能是适用的,并且会稍微增加。