Найти только соответствующие точки в MATLAB - PullRequest
2 голосов
/ 28 октября 2009

У меня есть функция MATLAB, которая находит характерные точки в образце. К сожалению, это работает только в 90% случаев. Но когда я знаю, какие места в образце я должен посмотреть, я могу увеличить это почти до 100%. Поэтому я хотел бы знать, есть ли в MATLAB функция, которая позволила бы мне найти диапазон, в котором находится большинство моих результатов, чтобы затем я мог пересчитать свои характерные точки. У меня есть вектор, в котором хранятся все результаты, и правильные результаты должны лежать в диапазоне 3% от -24.000 до 24.000. Если неправильные результаты всегда ниже правильного диапазона. К сожалению, мой фон в статистике очень ржавый, поэтому я не уверен, как это будет называться. Может ли кто-нибудь дать мне подсказку, что я буду искать? Есть ли встроенная в MATLAB функция, которая дала бы мне наименьший возможный диапазон, например, где 90% результатов лгут.

РЕДАКТИРОВАТЬ: Я извиняюсь, если я не разъяснил свой вопрос. Все в моем векторе может колебаться от -24.000 до 24.000. Около 90% моих результатов будут в диапазоне, который охватывает примерно 1,44 ([24 - (- 24)] * 3% = 1,44). Скорее всего, это будут правильные результаты. Остальные 10% находятся за пределами этого диапазона и всегда ниже (почему я не уверен, что брать среднее значение - хорошая идея). Эти 10% являются ложными и являются результатом всплесков в моих входных данных. Чтобы найти оставшиеся 10%, я хочу повторить свои расчеты, но теперь я хочу проверить только небольшой диапазон. Итак, моя цель - определить, где находится мой правильный диапазон. Удалите значения, которые я нашел за пределами этого диапазона. А затем пересчитайте мои значения не в диапазоне от -24 000 до 24 000, а скорее в небольшом диапазоне, где я уже нашел 90% своих значений.

Ответы [ 3 ]

3 голосов
/ 29 октября 2009

Соответствующие пункты, которые вы ищете: процентили :

% 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));

Существуют и другие подходы для обнаружения выбросов , такие как IQR-тест и правило трех стандартных отклонений и многие другие:

%% 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));

Кстати, если вы хотите получить значение z (|X|<z), которое соответствует 90% площади под кривой, используйте:

area = 0.9;                 % two-tailed probability
z = norminv(1-(1-area)/2)
1 голос
/ 28 октября 2009

Может быть, вам стоит попробовать среднее значение (в matlab: mean) и стандартное отклонение (в matlab: std)?

Каково статистическое распределение ваших данных?

См. Также вики-страницу , раздел «Интерпретация и применение».В целом почти для каждого распределения имеют место очень полезные неравенства Чебышева.

В большинстве случаев это должно работать:

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

и, вероятно, большинство (75%) ваших значений будутнаходиться в диапазоне:

<meanVal - 2*stDev, meanVal + 2*stDev>
0 голосов
/ 03 ноября 2009

может показаться, что вы хотите найти число x в [-24,24], которое максимизирует количество точек выборки в [x, x + 1.44]; Вероятно, самый быстрый способ сделать это включает в себя выбор точек выборки, что в конечном итоге 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

это решение действительно выдумывает некоторые из угловых материалов о нижнем и верхнем бункере и т. Д.

обратите внимание, что если вы собираетесь пойти по маршруту неравенства Чебышева, неравенство Петунина, вероятно, применимо и даст небольшой импульс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...