Мне нужно сравнить две кривые f (x) и g (x). Они находятся в том же диапазоне х (скажем, от -30 до 30). f (x) может иметь некоторые острые пики или гладкие пики и впадины. g (x) может иметь одинаковые пики и долины. Если это так, я хочу оценить, насколько хорошо эти функции совпадают без визуального контроля. Я попытался решить эту проблему следующим образом.
- Нормализуйте обе функции, разделив каждую точку данных на общую площадь функции. Теперь площадь нормализованной функции равна 1,0.
- В каждом x получить минимальное значение из f (x) и g (x). Это даст мне новую функцию, которая в основном является областью перекрытия между f (x) и g (x).
- Когда я интегрирую результирующую функцию шага 2, я получаю общую площадь перекрытия 1,0
Однако это не говорит мне, совпадают ли пики и долины или нет. Я не уверен, что это можно сделать, но если кто-то знает метод, я был бы признателен за вашу помощь.
== РЕДАКТИРОВАТЬ == Для пояснения я включил изображение.
Разница между двумя кривыми (черным и синим) может не совпадать, но будет иметь дополняющие формы.
Справочная информация: Функции - это прогнозируемая плотность состояний (PDOS) атомных орбиталей соединения. Итак, у меня есть состояния для s, p, d орбиталей. Я хочу определить, имеет ли материал sp, pd или dd гибридизации (орбитальное смешение). Единственные данные, которые у меня есть, это PDOS. Если, скажем, PDOS s-орбитали (функция f (x)) имеет пики и впадины при тех же энергиях (значениях x) PDOS p-орбитали (функция g (x)), то в этом материале происходит sp-смешивание.
Ответы:
Это общая и часто трудная проблема в аналитической химии, физике, спектроскопии и т. Д. Используемые подходы могут варьироваться от простого сравнения RMSD до очень сложных методов. Если эту задачу нелегко выполнить с помощью визуального осмотра (люди прекрасно разрабатываются для распознавания признаков), то, скорее всего, это будет трудно выполнить в вычислительном отношении.
Один из подходов состоит в том, чтобы попытаться удалить «базовые линии», чтобы функции имели нулевое значение, за исключением случаев, когда имеются особенности пиков или долин. Лучше всего это сделать с помощью подгонки кривой с использованием полинома низкого порядка или, что еще лучше, более подходящей принципиальной модели того, как базовая линия может и должна выглядеть. Если пики очень резкие, вы можете просто сгладить функцию и вычесть сглаженную функцию из исходной функции.
После удаления базовой линии вы можете нормализовать и сгенерировать невязки или выполнить RMSD (простые подходы) или попытаться обнаружить особенности пиков / долин, подгоняя гауссиан (или любую подходящую модель) к каждой характеристике, которую вы ищете. Если вы в состоянии соответствовать пикам, то вы можете сравнить положения пиков и полуширины.
Посмотрите на SciPy, если вы знаете Python. Удачи.
источник
Это просто «не в моей голове», поэтому я мог бы неправильно понять проблему, но, возможно, вы могли бы применить среднеквадратичное расстояние (RMSD) к функциям. Если вы просто заинтересованы в пиках и долинах, то примените их к областям вокруг этих пиков и долин (то есть для некоторого x +/- некоторого эпсилона, где производная любой функции равна нулю). Если RMSD этого диапазона близка к нулю, то, думаю, у вас хорошее совпадение.
источник
Как я понимаю, информация, которую вы ищете, передается «таблицей изменений» функции - мне очень жаль, что я не знаю английского названия для этого!
Эта таблица связана с дифференцируемой функцией f, и вы создаете ее путем нахождения корней f ' и определения знака f' на каждом интервале между этими нулями.
Итак, если нули f ' и g' более или менее совпадают и знаки этих функций совпадают, они будут иметь аналогичный профиль.
Первое, что я попытался бы запрограммировать, было бы:
Нарисуйте случайным образом большое количество N точек x [i] в интервале, где определены функции.
Для каждого узла вычислите разности F [i] = f (x [i] + ε) - f (x [i] - ε) и G [i] = g (x [i] + ε) - g (x) [i] - ε) .
Если в каждом узле F [i] и G [i] меньше, чем ε² ИЛИ имеют одинаковый знак, заключите, что две функции почти имеют одинаковый профиль.
Это работает?
источник
Грубая сила: найдите наименьшее ненулевое значение с плавающей запятой с этим значением в качестве шага, пройдите весь домен и проверьте, равны ли значения?
== РЕДАКТИРОВАТЬ ==
Хммм ... Если под "той же формой" вы подразумеваете g (x) = c * f (x), это решение следует изменить - для каждого элемента домена вы вычисляете f (x) / g (x) и проверяете, результат одинаков для каждой точки (конечно, если g (x) == 0, то вы проверяете, если f (x) == 0, вы не пытаетесь разделить).
Если «одна и та же форма» означает «локальные оптимумы и точки изгиба одинаковы» ... Ну, найдите локальные оптимумы и точки изгиба для f (x) и g (x) (как наборы доменных элементов) и проверьте, если они наборы равны.
Третий вариант: f (x) = g (x) + c. Просто проверьте, имеет ли каждый элемент домена одинаковую разницу f (x) -g (x). Это почти идентично первому случаю, но вместо деления у вас есть различие.
== ЕЩЕ ДРУГОЕ РЕДАКТИРОВАНИЕ ==
Хорошо ... Второй подход из редактирования выше может быть полезным. Кроме того, вы можете объединить его со сравнением знака первого производного (не символического, а рассчитанного как df (x) = f (x) - f (x-step)). Если обе функции имеют один и тот же знак производной во всей области, просто проверьте оптимумы и точки изгиба. Я бы сказал, что этих условий должно быть достаточно, чтобы делать то, что вам нужно.
источник
Вероятно, самый простой способ - это вычислить коэффициент корреляции Пирсона . То есть, используйте ваше f (x) в качестве X и g (x) в качестве Y. По сути, «нарисуйте g (x) как функцию от f (x) и посмотрите, насколько хорошо он образует прямую линию».
Коэффициент корреляции популярен, потому что его легко вычислить, и он часто оправдывается только маханием руками. Это может быть хорошим начальным приближением для некоторых применений, но это определенно не панацея.
Чтобы получить лучшие результаты в реальных приложениях, вам необходимо понимать, что происходит с данными, то есть процесс, который генерирует данные. Часто есть какой-то фон , и интересные фоны движутся поверх этого фона. Если вы выбросите все данные в черный ящик, вы можете сравнить главным образом фоны: черный ящик не знает, какая часть данных является интересной. Поэтому, чтобы получить лучшие результаты, часто неплохо как-то удалить фон, а затем сравнить то, что у вас осталось. Подгонка линий или кривых или средних значений и вычитание или деление на них, низкочастотная, полосовая или высокочастотная фильтрация, подача данных через какую-то нелинейную функцию ... Вы называете это
Там нет однозначного правильного ответа. Вы получите столько же результатов, сколько и методов. Но некоторые результаты лучше некоторых. Теоретические рассуждения могут помочь начать работу в правильном направлении, но как установить параметры и отрегулировать ваш метод, в конечном итоге можно узнать только путем их опробования и сравнения реальных результатов.
источник