Интерполяция неотрицательных данных

biblioteka

Есть кривые пропускания фильтров

При интерполяции Б-сплайнами в обоих случаях результат хороший, но вот для одного из них
получаются отрицательные значения.

Есть ли какой-то простой метод наложения доп условий для выполнения неотрицательности?

vodnik2

Берешь логарифм, приближаешь сплайнами, обратно экспоненцируешь - пойдет?

biblioteka

Многие проблемы решились, но появились и новые (видимо из-за моей схемы обработки нулей 0=1е-15 ):



Зелёный - новая интерполяция. Синий - старая.
В случае с двумя и более идущими подряд ненулевыми значениями возникает спайк:

3080 0
3090 0
3100 0.0001
3110 0
3120 0.0001
3130 0.0001
3140 0
3150 0

biblioteka

Видно, что спайки могут быть значительными:

Niklz

а тебе сплайны обязательно нужны? попробуй kernel smoothig (ядерное сглаживание):
http://en.wikipedia.org/wiki/Kernel_smoother
http://en.wikipedia.org/wiki/Kernel_density_estimation
На русском
Логарифмировать данные с кучей нулей наверное не очень хорошая идея.

tester1

Если данных немного, и не нужно особо теоретизировать и махать статистическими критериями, а интерполяция нужна для внутреннего пользования, то можно сгладить вручную как сам считаешь нужным или, если данных много, то автоматически кусочно-линейно, но потом просмотреть глазами как кино то, что получится. В обоих случаях неотрицательные данные дадут неотрицательную интерполирующую функцию.
А вот если для глубоких научно обоснованных выводов, то я бы качеством данных озаботился в первую очередь. Как минимум, надо аккуратно проанализировать процесс получения данных и учесть все погрешности, вот ликбез. Плюс если данные получаются выборкой, то проверить репрезентативность выборки не только математикой, но и здравым смыслом. А при выборе метода обработки я бы старался подобрать наиболее подходящий к сути задачи метод, а не шаманил с логарифмами и прочим. Тут об истине заботиться надо, а не о простоте вычислений и красоте моделей.
Впрочем, я не статистик.

scorobei42ru

бля, нет слов просто

Nefertyty

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

Evgewkin

Многие проблемы решились, но появились и новые (видимо из-за моей схемы обработки нулей 0=1е-15 ):
Можешь ещё взять корень z=sqrt(y) или сделать z=log(C+y но тогда надо подобрать константу C, чтобы обратное y = exp(z)-C не стало отрицательным.

seregaohota

При интерполяции Б-сплайнами в обоих случаях результат хороший, но вот для одного из нихполучаются отрицательные значения.
если это у тебя одноразовая задача, то добавь новую точку/точки на кривой в том месте, где сплайн отрицательный получился, и посчитай заново

biblioteka

если это у тебя одноразовая задача,

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

biblioteka

а тебе сплайны обязательно нужны? попробуй kernel smoothig
Для функций с разрешением выше Найквесткого b-сплайны практически оптимальны:
MOMS: Maximal-Order Interpolation of Minimal Support (Thierry Blu, Member, IEEE, Philippe Thévenaz, and Michael Unser, Fellow, IEEE,IEEE TRANSACTIONS ON IMAGE PROCESSING, VOL. 10, NO. 7, JULY 2001)
Minimum Support Interpolators with Optimum Approximation Properties
Thierry Blu, Philippe Thkvenaz and Michael Unser 1998
Очевидно, что здесь как раз нарушается это условие в указанных областях. Что не отменят тот факт, что в других точках интерполяция просто превосходна.

tester1

Пока гарантировано не дающего нежелательные эффекты алгоритма не придумал.
Цель-то какая этого интерполирования, напиши. Какие требования к нему, кроме неотрицательности. Какие данные, куда интерполяция затем пойдёт. Это же самое главное при выборе метода.
А то можно просто положить значение переменной 1 всюду, тоже будет неотрицательная интерполяция :grin:

sveta555

гоно, похоже что это днище ...

biblioteka

Можешь ещё взять корень
Спайки практически убирает, но в другом месте не очень хороший результат даёт:

sveta555

по теме - если сплайны не обязательны и интеграл от этой штуки конечен, то можешь воспринимать эту функцию как плотность вероятности, а дальше восстановить эту плотность через фурье от дискретной характерестической функции (для дискретной х/ф возьми точки, в которых "вероятность" = k/N)
вот что получится по финалу: f(x) (та, что у тебя на графике) = sum(a_i * exp(-(x-m_i)^2/s_i/s_i/2)
для функции как та, что на картинке - в пять слагаемых уложишься
если будешь так делать - наверное стоит прологорифмировать абсциссу (это частота? она же строго больше нуля?)
и да, вроде это как раз то, что посоветовал че, только с другой колокольни

sveta555

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

sveta555

0
3090 0
3100 0.0001
3110 0
3120 0.0001
3130 0.0001
3140 0
3150 0
то, что у фильтра такое не тривиальное пропускание - это численный артефакт или важно именно что на 3100 именно 0.0001, а вокруг нули? судя по картинкам - ты пытаешься каждый изгиб воспроизвести, что за задача?

biblioteka

Это длины волн в Ангстремах.
Указанная часть просто для примера (это только маленькая часть где возникали проблемы(там по подписям длин волн хорошо видно какая часть
Фурье интерполяция гарантированно даст Гиббсовские осцилляции., тем более задача усложняется неравномерным шагом.

Niklz


функций с разрешением выше Найквесткого b-сплайны практически оптимальны:
в каком смысле оптимальны? тебе же скорее всего нужна оптимальность в смысле твоей задачи, а не в смысле оптимальности b-сплайна среди других сплайнов.
вообще сплайны для интерполяции шумных данных не очень хорошая штука, как раз из-за того, что их вот так расколбашивает между узлами.
ядерное сглаживание гораздо более устойчиво и дало бы натуральным образом только положительные значения. ширину окна можно подобрать для оптимальной аппроксимации.
логарифмировать данные с скошенной гистограммой (к примеру, с кучей нулей) тоже не очень хорошо - это деформирует аппроксимирующую кривую, она проходит значительно ниже, чем прошла бы на оригинальных данных.
самый практичный совет у гадфазера - рассматривай его как аппроксимацию классом функций "max(0, сплайн)". конечно, в идеале, это ограничение надо встроить и в фиттинг тоже, но и так должно сойти если тебе "нравится" все кроме отрицательности.

tester1

в каком смысле оптимальны? тебе же скорее всего нужна оптимальность в смысле твоей задачи, а не в смысле оптимальности b-сплайна среди других сплайнов.
видимо, всем это должно быть очевидно как 2+2=4
по крайней мере, я уже спрашивал ровно об этом выше, но ответа не получил
удивляюсь, как народ при этом ещё что-то отвечает, советует

Niklz

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

tester1

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

tester1

кстати, Фрау как-то мне объяснил, почему
минимизацию квадратичной ошибки
удобно выбирать.
если функция штрафа гладкая, в нуле ноль и имеет в нуле минимум (значит, и производная в нуле ноль то её разложение по Тейлору начинается с Сx^2, поэтому минимизация Сx^2 даст при малых ошибках результат, похожий на минимизацию исходной функции штрафа. константа С положительна, поэтому минимизация Сx^2 даст тот же результат, что и минимизация x^2. вот поэтому функция штрафа x^2 так часто бывает полезна.
но если производная функции штрафа в нуле не ноль, то x^2 уже не такая хорошая ей замена
Оставить комментарий
Имя или ник:
Комментарий: