2009-07-31 3 views
1

Я использую C++ для написания сценария ROOT для некоторой задачи. В какой-то момент у меня есть массив двойников, в которых многие довольно похожи, а один или два разные. Я хочу усреднить весь номер, кроме тех, что болели большими пальцами. Как мне подойти к нему? Для примера, давайте рассмотрим:Как выбрать непохожий номер в массиве в C++?

x = [2.3, 2.4, 2.11, 10.5, 1.9, 2.2, 11.2, 2.1] 

Я хочу, чтобы как-то среднее все числа, кроме 10.5 и 11.2, разнородных из них. Этот алгоритм будет повторяться несколько тысяч раз, а массив удваивает 2000 записей, поэтому желательно оптимизировать (при сохранении читаемости). Спасибо!

Ознакомиться: http://tinypic.com/r/111p0ya/3 «Несравненные» числа значений y импульса.

Точка этого определения основного значения для формы волны. Я сравниваю самое отрицательное значение с землей и надеялся получить лучший метод заземления, чем средний первый N баллов в выборке.

+1

Дайте строгое определение 'diffimilar' для вашей задачи. –

+0

Что представляют эти цифры? Что такое источник ошибок? Любая информация о распространении. Если вы можете добавить эту информацию, вам будет легче ответить. –

+0

outlier это термин, который вы ищете. – Eric

ответ

1

Учитывая, что вы используете КОРЕНЬ вы можете рассмотреть глядя на TSpectrum классов, которые имеют поддержку извлечения фона из-под неопределенным количеством пиков ...

Я никогда не использовал их с такими исходным шум, но они должны быть надежными.

BTW: что является источником этих данных. Пик выглядит как импульс детектора частиц, но высокий уровень фонового дрожания говорит о том, что вы действительно можете улучшить ситуацию с помощью некоторых незначительных корректировок аппаратного обеспечения DAQ, что может быть лучше, чем попытка решить сложную проблему с программным обеспечением.

Наконец, если вы не ограничены каким-то очень примитивным оборудованием (в этом случае, почему и как вы работаете с ROOT?), Если у вас есть только несколько тысяч таких спектров, вы можете позволить себе довольно медленный алгоритм. Или это 2000 спектров за событие и высокий уровень событий?

+0

Я использовал TSpectrum в более поздней части моего анализа; подумал рано, чтобы исследовать его использование для сигналов. Хорошее предложение. Сигнал - от Hamamatsu PMT и отстойника. DAQ через область Tektronix с использованием LabVIEW -> Форма волны вывода для текста. Анализ выполняется с помощью ROOT после передачи текстовых файлов. Скрипт ROOT создает узлы области импульса и высоты импульса. 10 000 захватов формы волны (2000 образцов очков) занимает около часа. Анализ всего лишь порядка минут, поэтому у меня есть свободное время, я просто нетерпелив. j – physicsmichael

+0

Да, я знаю, что 2.7 waveforms/sec - медленный DAQ. =) Есть много недостатков в моей настройке, но она выполняется. – physicsmichael

+0

Не аппаратная цепочка, с которой у меня есть опыт. Тем не менее: если вертикальная шкала находится в вольтах, пик довольно мал. Можете ли вы добиться большего выигрыша (лучше всего с большим количеством HV, но даже в области действия могут работать). – dmckee

0

Быстрый способ может состоять в том, чтобы взять медиану, а затем взять средние числа, не так далеко от медианного.

«Не так далеко», будучи зависимым от вашего проекта.

0

Хорошим эмпирическим указателем для определения вероятных выбросов является вычисление Interquartile Range (IQR), а затем любые значения, равные 1,5 * IQR от ближайшего квартиля, являются выбросами.

Это основной метод, используемый многими системами статистики (например, R) для автоматического обнаружения выбросов.

0

Любой метод, который является статистически значимым и подходит для него (Dark Eru, Daniel White), будет слишком интенсивным для вычисления, и я думаю, что нашел работу вокруг, которая позволит более позднюю коррекцию (что означает, оставьте его без заземления).

Спасибо за предложения. Я посмотрю на них, если у меня будет время и хочу посмотреть, стоит ли их выигрыш в замедлении.

+0

Ум просветляет нас по методу, который вы планируете использовать? –

0

Вот быстрый и грязный метод, который я использовал раньше (работает хорошо, если есть очень мало выпадающие в начале, и вы не очень сложные условия для того, что представляет собой выброс)

Алгоритм O (N). Единственная действительно дорогая часть - это разделение.

Настоящим преимуществом здесь является то, что вы можете запустить его через пару минут.

avgX = Array[0] // initialize array with the first point 
N = length(Array) 
percentDeviation = 0.3 // percent deviation acceptable for non-outliers 
count = 1 
foreach x in Array[1..N-1] 
    if  x < avgX + avgX*percentDeviation 
     and x > avgX - avgX*percentDeviation 
      count++ 
      sumX =+ x 
      avgX = sumX/count 
    endif 
endfor 

return avgX 
1

Если вы можете, сохраните отсортированный список; то вы можете легко отрубить голову и хвост списка каждый раз, когда вы работаете в среднем.

Это очень похоже на удаление выбросов на основе медианы (т. Е. Вам понадобятся два прохода над данными, один - медианный, который почти такой же медленный, как и сортировка для данных с плавающей запятой, а другой - вычислить среднее значение), но требует меньших накладных расходов во время разработки среднего значения за счет сохранения отсортированного списка. Какой из них быстрее всего будет зависеть от ваших обстоятельств. Конечно, может быть, что вы действительно хотите, медиана в любом случае!

Если у вас есть дискретные данные (скажем, байты = 256 возможных значений), вы можете использовать 256 гистограммных бункеров с одним проходом над вашими данными, считая значения, которые идут в каждом ящике, тогда очень легко найти медиана/приблизительная средняя/удаление выбросов и т. д. Это был бы мой предпочтительный вариант, если бы вы могли позволить себе потерять некоторую точность в своих данных, а затем сохранить отсортированный список, если это подходит для ваших данных.

+0

Сортировка - неплохая идея, и если бы я гистограммировал эти значения, я бы очень легко соответствовал гауссовскому пику, средним из которых было бы основное значение, которое я получаю, но может быть слишком вовлечено. – physicsmichael