LINUX.ORG.RU

Поиск пиков

 


4

5

Ситуация для моей области типичная. Попадается типичная кривая. Надо её аппроксимировать до суммы нескольких кривых плотностей распределений Лоренца. Для начала хотелось бы разобраться с поиском пиков (x_1, x_2 и x_3). Хочется отметить, что пик на x_2 особый и в его окрестности первая производная нигде нулю не равна. Вроде бы всё ничего, но если увеличить хорошенько масштаб то вся кривая у нас такая.

Мои товарищи по цеху в отличие от меня уже все почти профессора и с умным софтом каким-то имели дело (проприетарным), но всё равно делают почти всё вручную. Я вот не унимаюсь и думаю что со всем этим могла бы неплохо справиться машина. Хотя бы с поиском пиков, для начала.

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

В голову также приходила скользящая средняя, но она мне что-то не нравится.

Может можно бы каким нибудь хитрым статистическим методом определить области пиков и там рассчитывать более простой сплайн. Прошу совета в общем.

★★★★★

Последнее исправление: ados (всего исправлений: 2)

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

Это точка перегиба. Нулем будет вторая производная (школьный матанализ). :)

https://ru.wikipedia.org/wiki/Точка_перегиба_функции

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

Я школу заканчивал и понимаю что вторая производная много чего скажет. Но для производных нужна какая-никакая гладкая функция, а не «забор».

И всё же мне кажется, что пик плотности распределения будет слегка отходить в сторону.

ados ★★★★★
() автор топика
Ответ на: комментарий от ados

А основной вопрос топика про методы сглаживания «забора» на большом числе точек, а потом поиск экстремумов?

Zubok ★★★★★
()
Ответ на: комментарий от ados

Ну тогда сглаживай и ищи. Методы сглаживания есть. Можно moving average, гауссовкий фильтр, полиномами, wavelets, сплайнами и т. д.

Zubok ★★★★★
()

Чем именно не нравится скользящее среднее?

Gvidon ★★★★
()

определить области пиков

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

Gvidon ★★★★
()
Ответ на: комментарий от ados

Ну так, ЧМы гоорят очень много интересного про производную и порядки. Так что можно и не только соседние точки брать.

Quickern ★★
()

первая производная нигде нулём не равна.

ahaha, oh wow!

anonymous
()

находишь y(x + dx) - y(x) и y(x) - y(x - dx) если знаки разные - подозрение на пик.

anonymous
()

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

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

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от greenman

мужики не надо велосипеды предлагать ...
ftp://root.cern.ch/root/Spectrum.doc
задача решена и есть «рабочий класс», который всё это делает за тебя.
На пример, я его пользую для нахождения QRS пиков электрокардиограмме,
с вычитанием фона :)

Valeriy_Onuchin ★★
()
Ответ на: комментарий от Valeriy_Onuchin

задача решена и есть «рабочий класс», который всё это делает за тебя.

Это же c++? Класс на страничку... А что с ним делать, если плюсов почти не знаешь?

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

greenman ★★★★★
()
Последнее исправление: greenman (всего исправлений: 1)
Ответ на: комментарий от Gvidon

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

Эта херня работать толком не будет.

anonymous
()

Я правильно понимаю, что исходная кривая задана своей дискретизацией? Может быть, методом найменьших квадратов её аппроксимироват и ну его, этот поиск экстремумов?

anonymous
()
Ответ на: комментарий от anonymous

у него по твоему совету каждая вторая точка - пик.

cdshines ★★★★★
()

Не могу определиться с методом.

Теория: Хемминг Р.В. Цифровые фильтры. ©

Практика: MATLAB/Signal Processing Toolboх. ©

quickquest ★★★★★
()
Ответ на: комментарий от ados

На картинке у тебя гладкая функция и ты говоришь, что она «типичная».

buddhist ★★★★★
()
Ответ на: комментарий от greenman

1. ставишь ROOT https://root.cern.ch/drupal/content/production-version-534

2. там есть root/tutorials/spectrum/peaks.C (~100 LOC, достаточно первых 50)
https://root.cern.ch/root/html534/tutorials/spectrum/peaks.C.html

вместо функции в примере подставь
https://root.cern.ch/root/html534/TMath.html#TMath:CauchyDist

3. на выходе что-то типа такого http://cern.ch/onuchin/upload/peak.png

Valeriy_Onuchin ★★
()
Последнее исправление: Valeriy_Onuchin (всего исправлений: 1)

В голову также приходила скользящая средняя, но она мне что-то не нравится.

btw, там используются цепи Маркова

Valeriy_Onuchin ★★
()

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

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

Можно посчитать значение численной свертки с каким нить ядром типа 1/(x-x0) - это такое псевдодифференцирование, оно само дрожание сгладит. Вообще в теории обработки сигналов это все должно быть уже проработано, я к сожалению не специалист.

AIv ★★★★★
()
Ответ на: комментарий от AIv

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

Вот, да.

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

У него есть один правильный пик на картинке. Состоящий из двух пиков, но при этом производная обнуляется только один раз. С этим шагом у него и загвостка, насколько я понял ТС'а.

nezamudich ★★
()
Ответ на: комментарий от ados

Но для производных нужна какая-никакая гладкая функция, а не «забор»

Построй полином по своему забору. От полинома возьми производную.

Aswed ★★★★★
()
Ответ на: комментарий от Aswed

Эти данные почти идеальны для изучения феномена Рунге. Так что сам сперва проделай, что рекомендуешь. Получится совсем не та картина, которую ожидаешь.

nezamudich ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.