Как автоматически рассчитать нижний и верхний порог для данных?

У нас есть длинная последовательность точек данных (около 60 000) в виде массива (при необходимости может быть преобразована в ndarray.) Когда мы отображаем их как гистограмму, это выглядит примерно так.

порог

Красные линии - это установленные вручную нижние и верхние пороговые значения около 25 и 67. Я пытаюсь найти хороший подход для автоматического поиска таких пороговых значений. На основании этих порогов мы исключаем точки данных, которые не очень похожи на большинство точек данных.

До сих пор я исследовал подход, основанный на процентилях (np.percentile), но искал более подходящий / питонный подход.

fg = np.array([rox_val])

# precentile

q75, q50, q25 = np.percentile(fg, [75, 50, 25])
iqr = q75 - q25
qmin = np.amin(fg)
qmax = np.amax(fg)

print(qmin, q25, q50, q75, qmax, iqr)
print(q75 + 0.5 * iqr, q25 - 0.5 * iqr)
# returns :
# 4.0476 5.1071 37.6786 47.6667 255.0 42.5596
# 68.9465 -16.1727

Редактировать:

пример того, что я ищу: если вы заметили прикрепленное изображение, то вы найдете около 1,40000 сэмплов со значением от 4,04 до 5,00. Однако у него нет правильной группировки, и это всего лишь один пик на графике.

Теперь, если вы заметите в середине изображения, у нас самое большое количество строк (около 17 000) со значением от 46,28 до 47,24. и этот пик сопровождается с обеих сторон одинаковыми пиками до значений 25 и 67 на оси X.

Я ищу функцию, которая работает как метод Оцу в обработке изображений, чтобы найти автоматический порог, и когда массив данных передается через функцию, он должен предоставить мне более высокий и более низкий порог (в этом случае где-то близко к 25 и 67 скажем так).

x, y = get_threshold(rox_val)
print(x, y)
# 26.125 65.749

0 ответов

Другие вопросы по тегам