методы приближения - PullRequest
       18

методы приближения

3 голосов
/ 07 января 2010

Я прикрепил изображение: alt text
(источник: piccy.info )

Итак, на этом изображении показана схема функции, которая определена по заданным точкам. Например, по точкам x = 1..N.

Другая диаграмма, которая была нарисована как полупрозрачная кривая, Это то, что я хочу получить из исходной диаграммы, я хочу приблизить исходную функцию, чтобы она стала плавной.

Есть ли способы сделать это?

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

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

Ответы [ 5 ]

8 голосов
/ 08 января 2010

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

a) Теория приближений: если у вас есть очень четкая определенная функция без ошибок (заданная либо определением, либо данными), и вы хотите отслеживать ее как можно точнее, вы используете полиномиальная или рациональная аппроксимация полиномами Чебышева или Лежандра, означая, что вы приближать функцию полиномом или, если периодичен, рядами Фурье.

b) Интерполяция: если у вас есть функция, в которой заданы некоторые точки (но не вся кривая!), И вам нужна функция для прохождения этих точек, вы можете использовать несколько методов:

Ньютон-Грегори, Ньютон с разделенными отличиями, Лагранж, Эрмит, Сплайн

в) Подгонка кривой: у вас есть функция с заданными точками, и вы хотите нарисовать кривую с заданной (!) Функцией, которая максимально приближает кривую. Есть линейные и нелинейные алгоритмы для этого случая.

Ваш рисунок подразумевает:

  • Это не похоже на математическую функцию.
  • Это не четко определено данными или функцией
  • Вы должны соответствовать кривой, а не некоторым точкам.

Что вам нужно и нужно, это

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

Вы можете сделать это с МЕНЬШЕЙ, как предложил Джейкоб (но я нахожу это излишним, особенно потому, что выбор разумного промежутка требует некоторого опыта). Для вашей проблемы я просто рекомендую скользящее среднее, как предложено Джимом С.

http://en.wikipedia.org/wiki/Running_average

Извините, cdonner и Orendorff, ваши предложения хорошо продуманы, но совершенно неверны, потому что вы используете правильные инструменты для неправильного решения.

Эти парни использовали шестой полином, чтобы соответствовать климатическим данным, и полностью смутились.

http://scienceblogs.com/deltoid/2009/01/the_australians_war_on_science_32.php

http://network.nationalpost.com/np/blogs/fullcomment/archive/2008/10/20/lorne-gunter-thirty-years-of-warmer-temperatures-go-poof.aspx

3 голосов
/ 07 января 2010

Использование Лёсс в R (бесплатно).

например. здесь функция loess аппроксимирует зашумленную кривую синуса.

sine
(источник: stowers-institute.org )

Как видите, вы можете настроить плавность кривой с помощью span

Вот пример кода R от здесь :

Пошаговая процедура

Давайте возьмем синусоидальную кривую, добавим немного «шум», а затем посмотреть, как параметр loess "span" влияет на вид сглаженной кривой.

  1. Создайте кривую синуса и добавьте шум:

    период <- 120 x <- 1: 120 лет <- грех (2 * пи * х / точка) + runif (длина (х), - 1,1) </p>

  2. Построить точки на этой шумовой кривой синуса:

    plot (x, y, main = "Sine Curve + 'Uniform' Noise ") mtext (" показывающий сглаживание лёсса (локальная регрессия Сглаживание) ")

  3. Применить сглаживание по Лессу, используя значение диапазона по умолчанию 0,75:

    y.loess <- loess (y ~ x, span = 0,75, data.frame (x = x, y = y)) </p>

  4. Вычислить сглаженные лессовые значения для всех точек на кривой:

    y.predict <- прогнозировать (y.loess, data.frame (х = х)) </p>

  5. Построить сглаженную кривую лёсса вместе с точками, которые уже были график:

    линии (х, y.predict)

2 голосов
/ 07 января 2010

Это называется подгонка кривой . Лучший способ сделать это - найти цифровую библиотеку, которая сможет сделать это за вас. Вот страница, показывающая , как это сделать, используя scipy . Изображение на этой странице показывает, что делает код:

график, показывающий два набора данных с шумом и две наиболее подходящие синусоиды http://www.scipy.org/Cookbook/FittingData?action=AttachFile&do=get&target=datafit.png

Сейчас это всего 4 строки кода, но автор не объясняет это вообще. Я постараюсь кратко объяснить здесь.

Сначала вы должны решить, в какой форме вы хотите получить ответ. В этом примере автор хочет кривую вида

f (x) = p 0 cos (2π / p 1 x + p 2 ) + p 3 x

Вместо этого вам может потребоваться сумма нескольких кривых. Это нормально; формула является входом для решателя.

Целью примера, таким образом, является поиск констант от p 0 до p 3 для завершения формулы. scipy может найти этот массив из четырех констант. Все, что вам нужно, это функция ошибок , которую Сципи может использовать, чтобы увидеть, насколько близки его догадки к фактическим точкам выборочных данных.

fitfunc = lambda p, x: p[0]*cos(2*pi/p[1]*x+p[2]) + p[3]*x # Target function
errfunc = lambda p: fitfunc(p, Tx) - tX # Distance to the target function

errfunc принимает только один параметр: массив длины 4. Он включает эти константы в формулу и вычисляет массив значений на кривой-кандидате, затем вычитает массив точек выборки данных tX. Результатом является массив значений ошибок; предположительно scipy возьмет сумму квадратов этих значений.

Затем просто добавьте несколько начальных догадок, и scipy.optimize.leastsq сократит числа, пытаясь найти набор параметров p , где ошибка минимизирована.

p0 = [-15., 0.8, 0., -1.] # Initial guess for the parameters
p1, success = optimize.leastsq(errfunc, p0[:])

Результат p1 - это массив, содержащий четыре константы. success равно 1, 2, 3 или 4, если решатель действительно нашел решение. (Если errfunc достаточно сумасшедший, решатель может дать сбой.)

2 голосов
/ 07 января 2010

Вы можете использовать цифровой фильтр, такой как FIR-фильтр. Самый простой FIR-фильтр - это просто скользящее среднее. Для более изощренного лечения выглядело нечто вроде БПФ.

1 голос
/ 07 января 2010

Это похоже на полиномиальное приближение. Вы можете играть с полиномами в Excel («Добавить линию тренда» к диаграмме, выбрать «Полином», а затем увеличить порядок до необходимого уровня аппроксимации). Не должно быть слишком сложно найти алгоритм / код для этого. Excel может показать уравнение, которое он придумал для аппроксимации.

...