我有一个MATLAB函数可以在样本中找到特征点。不幸的是,它只占90%的时间。但是,当我知道样本中的哪个位置时,我应该将其增加到接近100%。所以我想知道MATLAB中是否有一个函数可以让我找到大部分结果的范围,这样我就可以重新计算我的特征点。我有一个存储所有结果的向量,正确的结果应该在-24.000到24.000之间的3%范围内。错误的结果始终低于正确的范围。 Unfortunatley我的统计背景非常生疏,所以我不确定如何调用它。 有人能给我一个暗示我会寻找什么吗?是否有一个构建到MATLAB中的函数可以给出尽可能小的范围,例如: 90%的结果都存在。
编辑:如果我没有说清楚我的问题,我很抱歉。我向量中的所有内容都只能在-24.000到24.000之间。大约90%的结果将在大约1.44([24 - ( - 24)] * 3%= 1.44)的范围内。这些很可能是正确的结果。剩下的10%超出了那个范围并且总是更低(为什么我不确定当时的平均值是个好主意)。这些10%是错误的,并且是由输入数据中的blip产生的。为了找到剩余的10%我想重复我的计算,但现在我只想检查小范围。 所以,我的目标是确定我的正确范围所在。删除我在该范围之外找到的值。然后重新计算我的值,而不是在-24.000到24.000之间的范围内,而是在我已经找到90%的值的小范围内。答案 0 :(得分:3)
您正在寻找的相关要点是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));
顺便说一句,如果你想获得对应曲线下90%面积的z值(|X|<z
),请使用:
area = 0.9; % two-tailed probability
z = norminv(1-(1-area)/2)
答案 1 :(得分:1)
也许你应该尝试平均值(在matlab:mean
中)和标准偏差(在matlab中:std
)?
您的数据的统计分布是什么?
另见wiki page,“解释和申请”部分。 一般来说,对于几乎所有的分布来说,切比雪夫的不平等都非常有用。
在大多数情况下,这应该有效:
meanval = mean(data)
stDev = std(data)
并且可能最多(75%)的值将放在范围内:
<meanVal - 2*stDev, meanVal + 2*stDev>
答案 2 :(得分:0)
似乎你想在[-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的不等式可能适用,并会略微提升。