Подходящие многочлены к данным

Просто введите https://graph.facebook.com/?fields=share&id=https://www.example.com и замените пример своим URL-адресом или страницей, которую вы ищете.

Пример Google: https://graph.facebook.com/?fields=share& ; ID = https: //www.google.com

48
задан ShreevatsaR 19 December 2008 в 20:59
поделиться

10 ответов

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

НЕ полиномиальной интерполяция

Полиномиальной интерполяция соответствует многочлену градуса n, учитывая n+1 точки данных, например, находит кубическое, которое передает точно через четыре данных точки. Как сказано в вопросе, это не было, хотят меня wanted—, я имел много точек и хотел многочлен маленького градуса (который будет [только 1 128] [приблизительно 1 128] соответствие, если мы не были удачливы), —, но так как некоторые ответы настояли на том, чтобы говорить об этом, я должен упомянуть их:) Lagrange многочлен , матрица Vandermonde , и т.д.

, Что такое наименьшие квадраты?

"Наименьшие квадраты" конкретное определение/критерий / "метрика" "как хорошо" аппроксимации полиномом. (Существуют другие, но это является самым простым.) Говорят, что Вы пытаетесь соответствовать многочлену p (x, y) = + основной обмен + cy + дуплекс <глоток> 2 + ey <глоток> 2 + fxy к некоторым точкам определенных данных (x я , y я , Z я ) (где "Z я " был "f (x я , y я )" в вопросе). С наименьшими квадратами проблема состоит в том, чтобы найти "лучшие" коэффициенты (a, b, c, d, e, f), такими, что то, что минимизировано (сохранил "меньше всего"), является "суммой квадратов остатков", а именно,

S = ∑ я (+ основной обмен я + cy я + дуплекс я <глоток> 2 + ey я <глоток> 2 + fx я y я - Z я ) <глоток> 2

Теория

важная идея состоит в том, что при рассмотрении S как функции (a, b, c, d, e, f), тогда S , минимизировал в точке, в которой градиент 0 . Это означает это, например, ∂ S/∂ f=0, т.е. это

я 2 (+ … + fx я y я - Z я ) x я y я = 0

и подобные уравнения для a, b, c, d, e. Обратите внимание, что это просто линейные уравнения в a… f. Таким образом, мы можем решить их с [1 115] Исключение Гаусса или любой из [1 116] обычные методы .

Это все еще называют "линейными наименьшими квадратами", потому что, хотя функция мы хотели, был квадратичный многочлен, это все еще линейно в параметрах (a, b, c, d, e, f). Обратите внимание, что то же самое работает, когда мы хотим, чтобы p (x, y) был любой "линейной комбинацией" [1 130] произвольный fj функций вместо просто многочлена (= "линейная комбинация одночленов").

Код

Для одномерного случая (когда существует только переменный x — fj, одночлены x <глоток> j ), существует Numpy polyfit :

>>> import numpy
>>> xs = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> ys = [1.1, 3.9, 11.2, 21.5, 34.8, 51, 70.2, 92.3, 117.4, 145.5]
>>> p = numpy.poly1d(numpy.polyfit(xs, ys, deg=2))
>>> print p
       2
1.517 x + 2.483 x + 0.4927

Для многомерного случая или линейных наименьших квадратов в целом, существует SciPy. , Как объяснено в его документации , это берет матрицу fj значений ( x я ). (Теория состоит в том, что это находит псевдоинверсия Мура-Пенроуза из A.) С нашим выше вовлечения в качестве примера (x я , y я , Z я ), соответствуя многочлену означает, что fj является одночленами x <глоток> () y <глоток> () . Следующее находит лучшее квадратичное (или лучший многочлен любого другого градуса при изменении "градуса = 2" строки):

from scipy import linalg
import random

n = 20
x = [100*random.random() for i in range(n)]
y = [100*random.random() for i in range(n)]
Z = [(x[i]+y[i])**2 + 0.01*random.random() for i in range(n)]

degree = 2
A = []
for i in range(n):
    A.append([])
    for xd in range(degree+1):
        for yd in range(degree+1-xd):
            A[i].append((x[i]**xd)*(y[i]**yd)) #f_j(x_i)

c,_,_,_ = linalg.lstsq(A,Z)
j = 0
for xd in range(0,degree+1):
    for yd in range(0,degree+1-xd):
        print " + (%.2f)x^%dy^%d" % (c[j], xd, yd),
        j += 1

печать

 + (0.01)x^0y^0  + (-0.00)x^0y^1  + (1.00)x^0y^2  + (-0.00)x^1y^0  + (2.00)x^1y^1  + (1.00)x^2y^0

, таким образом, это обнаружило, что многочлен является x <глоток> 2 +2xy+y <глоток> 2 +0.01. [Последний срок иногда-0.01 и иногда 0, который должен ожидаться из-за случайных помех, которые мы добавили.]

Альтернативы Python+Numpy/Scipy R и Компьютерные Системы Алгебры: Sage, Mathematica, Matlab, Клен. Даже Excel мог бы быть в состоянии сделать это. Числовые Рецепты обсуждает методы для реализации его самостоятельно (в C, Фортране).

Проблемы

  • Это сильно под влиянием [1 153], как точки выбраны . Когда я имел x=y=range(20) вместо случайных точек, это всегда производило 1.33x <глоток> 2 +1.33xy+1.33y <глоток> 2 , который был озадачивающим..., пока я не понял, что, потому что я всегда имел x[i]=y[i], многочлены были тем же: x <глоток> 2 +2xy+y <глоток> 2 = 4x <глоток> 2 = (4/3) (x <глоток> 2 +xy+y <глоток> 2 ). Таким образом, мораль - то, что важно выбрать точки тщательно для получения "правильного" многочлена. (Если Вы можете, выбрал, необходимо выбрать Chebyshev узлы для полиномиальной интерполяции; не уверенный, если то же верно для наименьших квадратов также.)
  • Сверхустановка : многочлены более высокого градуса могут всегда соответствовать данным лучше. Если Вы изменяетесь degree на 3 или 4 или 5, это все еще главным образом распознает тот же квадратичный многочлен (коэффициенты 0 для условий более высокого градуса), но для больших градусов, это запускает подходящие многочлены более высокого градуса. Но даже с градусом 6, беря больший n (больше точек данных вместо 20, говорят 200), все еще соответствует квадратичному многочлену. Таким образом, мораль должна постараться не сверхсоответствовать, для которого она могла бы помочь взять как можно больше точек данных.
  • могли бы быть проблемы [1 124] числовая устойчивость , я не полностью понимаю.
  • , Если Вам не нужен многочлен, можно получить лучшие соответствия с другими видами функций, например, шлицы (кусочные полиномы).
57
ответ дан 6 revs 7 November 2019 в 22:34
поделиться

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

Ваш лучший выбор состоит в том, чтобы, вероятно, запуститься с Числовые Рецепты .

, R свободен и сделает все, что Вы хотите и больше, но это имеет большую кривую обучения.

, Если у Вас есть доступ к Mathematica, можно использовать Пригодную функцию, чтобы сделать подбор методом наименьших квадратов. Я предполагаю, что Matlab и его Октава дубликата с открытым исходным кодом имеют подобную функцию.

7
ответ дан John D. Cook 7 November 2019 в 22:34
поделиться

Для (x, f (x)) случай:

import numpy

x = numpy.arange(10)
y = x**2

coeffs = numpy.polyfit(x, y, deg=2)
poly = numpy.poly1d(coeffs)
print poly
yp = numpy.polyval(poly, x)
print (yp-y)
5
ответ дан jfs 7 November 2019 в 22:34
поделиться

Пустой в памяти, что многочлен более высокого градуса ВСЕГДА соответствует данным лучше. Многочлены более высокого градуса обычно приводят к очень невероятным функциям (см. Бритва Оккама ), хотя (сверхсоответствуя). Вы хотите найти баланс между простотой (степень многочлена) и соответствием (например, ошибка наименьшего квадрата). Количественно, существуют тесты для этого, информационный Критерий Akaike или байесовский информационный критерий . Эти тесты дают счет, какая модель должна быть предпочтена.

4
ответ дан Fredriku73 7 November 2019 в 22:34
поделиться

Lagrange многочлены (как @j w отправленный) дают Вам точное соответствие в точках, которые Вы определяете, но с многочленами градуса больше, чем говорят 5, или 6 можно столкнуться с числовой нестабильностью.

Наименьшие квадраты дает Вам "лучший пригодный" многочлен с ошибкой, определенной как сумма квадратов отдельных ошибок. (возьмите расстояние вдоль оси y между точками, которые Вы имеете и функция, которая заканчивается, придайте им квадратную форму и подведите итог их), функция MATLAB polyfit делает это, и с несколькими возвращаемыми аргументами, у Вас может быть он, автоматически заботятся о масштабировании/смещении проблем (например, если у Вас есть 100 точек все между x=312.1 и 312.3, и Вы хотите 6-й многочлен градуса, Вы собираетесь хотеть вычислить u = (x-312.2)/0.1, таким образом, u-значения распределяются между-1 и + =).

ПРИМЕЧАНИЕ , что результаты соответствий наименьших квадратов сильно под влиянием распределения значений оси X. Если x-значения будут равномерно распределены, то Вы получите большие ошибки в концах. Если у Вас будет случай, где Вы можете выбирать значения x, и Вы заботитесь о максимальном отклонении от Вашей известной функции и интерполяционного многочлена, то использование полиномы Чебышева дадут Вам что-то, что является близко к идеальному минимаксному многочлену (который очень трудно вычислить). Это обсуждено довольно долго в Числовых Рецептах.

Редактирование: Из того, что я собираюсь, это все работы хорошо для функций одной переменной. Для многомерных функций это, вероятно, будет намного более трудно, если градус будет больше, чем, скажем, 2. Я действительно находил ссылка на Google Books .

2
ответ дан Jason S 7 November 2019 в 22:34
поделиться

Если Вы хотите соответствовать (кси, f (xi)) к многочлену градуса n тогда, Вы настроили бы линейную проблему наименьших квадратов с данными (1, кси, кси, xi^2..., xi^n, f (xi)). Это возвратит ряд коэффициентов (c0, c1..., cn) так, чтобы многочлен оптимальной подгонки был *y = c0 + c1 * x + c2 * x^2 +... + cn * x^n.*

можно обобщить это два больше чем одна зависимая переменная включением полномочий y и комбинации x и y в проблеме.

2
ответ дан David Norman 7 November 2019 в 22:34
поделиться

Довольно легко вспугнуть быстрое использование соответствия матричные функции Excel, если Вы знаете, как представить проблему наименьших квадратов как проблему линейной алгебры. (Который зависит от того, как надежный Вы думаете, что Excel как решатель линейной алгебры.)

0
ответ дан duffymo 7 November 2019 в 22:34
поделиться

Помните, существует большая разница между приближение многочлен и нахождение точна один.

, Например, если я даю Вам 4 точки, Вы могли

  1. , Приближаются, строка с методом как наименьшие квадраты
  2. Приближаются, парабола с методом как наименьшие квадраты
  3. Находят точный кубическая функция через эти четыре точки.

убедиться выбрать метод правильно для Вас!

0
ответ дан stalepretzel 7 November 2019 в 22:34
поделиться

лагранжев многочлен находится в некотором смысле "самый простой" интерполяционный многочлен, который соответствует данному набору точек данных.

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

-1
ответ дан 7 November 2019 в 22:34
поделиться

В колледже у нас была эта книга, которую я до сих пор нахожу чрезвычайно полезно: Конте, де Бур; элементарный численный анализ; Макроу Хилл. Соответствующий параграф - 6.2: Подбор данных.
Пример кода представлен на ФОРТРАНЕ, и листинги тоже не очень читабельны, но в то же время объяснения глубоки и ясны. в конечном итоге вы понимаете, что делаете, а не просто делаете это (как мой опыт работы с числовыми рецептами).
Обычно я начинаю с числовых рецептов, но для подобных вещей мне быстро приходится брать Конте-де Бура.

Может быть, лучше опубликовать какой-нибудь код ... он немного урезан, но самые важные части там есть. очевидно, он полагается на numpy!

def Tn(n, x):
  if n==0:
    return 1.0
  elif n==1:
    return float(x)
  else:
    return (2.0 * x * Tn(n - 1, x)) - Tn(n - 2, x)

class ChebyshevFit:

  def __init__(self):
    self.Tn = Memoize(Tn)

  def fit(self, data, degree=None):
    """fit the data by a 'minimal squares' linear combination of chebyshev polinomials.

    cfr: Conte, de Boor; elementary numerical analysis; Mc Grow Hill (6.2: Data Fitting)
    """

    if degree is None:
      degree = 5

    data = sorted(data)
    self.range = start, end = (min(data)[0], max(data)[0])
    self.halfwidth = (end - start) / 2.0
    vec_x = [(x - start - self.halfwidth)/self.halfwidth for (x, y) in data]
    vec_f = [y for (x, y) in data]

    mat_phi = [numpy.array([self.Tn(i, x) for x in vec_x]) for i in range(degree+1)]
    mat_A = numpy.inner(mat_phi, mat_phi)
    vec_b = numpy.inner(vec_f, mat_phi)

    self.coefficients = numpy.linalg.solve(mat_A, vec_b)
    self.degree = degree

  def evaluate(self, x):
    """use Clenshaw algorithm

    http://en.wikipedia.org/wiki/Clenshaw_algorithm
    """

    x = (x-self.range[0]-self.halfwidth) / self.halfwidth

    b_2 = float(self.coefficients[self.degree])
    b_1 = 2 * x * b_2 + float(self.coefficients[self.degree - 1])

    for i in range(2, self.degree):
      b_1, b_2 = 2.0 * x * b_1 + self.coefficients[self.degree - i] - b_2, b_1
    else:
      b_0 = x*b_1 + self.coefficients[0] - b_2

    return b_0
2
ответ дан 26 November 2019 в 18:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: