Python评估多项式回归

时间:2019-10-01 20:33:34

标签: python numpy regression linear-algebra polynomial-math

我需要一个python函数在一组输入点处评估多项式。该函数将多项式权重的向量和输入点的向量作为输入,其中x:输入值的向量,{ {1}:多项式权重的向量(顺序为第j个元素是第w次单项式的线性系数,即j)。该函数在每个输入点输出多项式的预测。

有没有内置的python函数?

3 个答案:

答案 0 :(得分:2)

请参见numpy.poly1d

  

构造多项式x ^ 2 + 2x + 3:

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

答案 1 :(得分:1)

您似乎在描述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)。

答案 2 :(得分:1)

出于娱乐目的,您可以尝试实现基本算法,迭代器最差,角控器更好(我相信唐津是最好的)。这是前两个:

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级代码时,在所有情况下都更快。