Python Оценка полиномиальной регрессии - PullRequest
1 голос
/ 01 октября 2019

Мне нужна функция python, которая оценивает полином в наборе входных точек. Функция принимает в качестве входных данных вектор весов полинома и вектор входных точек, где x: вектор входных значений и w: вектор полиномиальных весов (упорядоченный таким образом, что j-й элемент является линейным коэффициентом для монома j -го порядка, т. е. x(j)). Функция выводит прогнозы полинома в каждой точке ввода.

Есть ли для этого встроенная функция python?

Ответы [ 3 ]

1 голос
/ 01 октября 2019

Кажется, вы описываете numpy.polyval():

import numpy as np

# 1 * x**2 + 2 * x**1 + 3 * x**0
# computed at points: [0, 1, 2]
y = np.polyval([1, 2, 3], [0, 1, 2])
print(y)
# [ 3  6 11]

Обратите внимание, что того же можно достичь с помощью np.poly1d(), что должно быть более эффективнымесли вы вычисляете значения из одного и того же полинома несколько раз:

import numpy as np

# 1 * x**2 + 2 * x**1 + 3 * x**0
my_poly_func = np.poly1d([1, 2, 3])
# computed at points: [0, 1, 2]
y = my_poly_func([0, 1, 2])
print(y)
# [ 3  6 11]

Если вы хотите использовать только встроенные модули Python, вы можете легко определить версию polyval() самостоятельно, например:

def polyval(p, x):
   return [sum(p_i * x_i ** i for i, p_i in enumerate(p[::-1])) for x_i in x]


y = polyval([1, 2, 3], [0, 1, 2])
print(y)
# [3, 6, 11]

или, более эффективно:

def polyval_horner(p, x):
    y = [] 
    for x_i in x:
        y_i = 0
        for p_i in p:
            y_i = x_i * y_i + p_i
        y.append(y_i)
    return y


y = polyval_horner([1, 2, 3], [0, 1, 2])
print(y)
# [3, 6, 11]

, но я бы порекомендовал использовать NumPy, если у вас нет веских причин не делать этого (например, если ваш результат будет переполнен NumPy, но не чистымPython).

1 голос
/ 02 октября 2019

Ради интереса вы можете попробовать реализовать базовые алгоритмы, потому что это хуже, а лучше - лучше (я считаю, что Карацуба - лучший). Вот первые два:

def iterative(coefficients, x): #very inefficient
    i = len(coefficients)
    result = coefficients[i - 1]
    for z in range(i - 1, 0, -1):
        temp = x
        for y in range(z - 1):
            temp = temp * x
        result += temp * coefficients[i - z - 1]
    return (x, result)

def horner(coefficients, x): 
    result = 0
    for c in coefficients:
        result = x * result + c
    return (x, result)

Я думаю, что numpy быстрее во всех случаях, поскольку он входит в код уровня C.

1 голос
/ 01 октября 2019

См. numpy.poly1d

Построить многочлен x ^ 2 + 2x + 3:

p = np.poly1d([1, 2, 3])
p(1) # prints 6
...