python - 在 numpy 中使用多项式时如何向量化预测

标签 python numpy vectorization polynomials

本质上希望找到最有效的解决方案(numpy),它本质上允许我将np.poly1d扩展到K维。

测试用例:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


class Polyfit:

    @staticmethod
    def from_fit_to_forecast(df, forecast_values, dates_forward, x_data, y_data, order=2):
        # nice vectorized params estimation
        all_params = np.polyfit(x_data, y_data, order)

        # terrible fit of data as I loop over them
        new_df = pd.DataFrame([np.poly1d(i)(x_data) for i in all_params.T], columns=df.index, index=df.columns).T
        forecast_df_second = pd.DataFrame(
            [np.poly1d(i)(forecast_values) for i in all_params.T], columns=dates_forward, index=df.columns).T

        return new_df, forecast_df_second

    @staticmethod
    def gen_data(k_steps):
        data = 1 + np.random.rand(100, 4) / 300 - (np.random.rand(100, 4) / 10) ** 2
        dates = pd.date_range('2010-1-1', freq='D', periods=100)
        dates_forward = pd.date_range(max(dates) + pd.Timedelta(1, unit='d'), freq='D', periods=k_steps)
        return pd.DataFrame(data, columns=list('ABCD'), index=dates).cumprod(), dates_forward

    def __init__(self, k_steps_forward=20):
        self.original_data, dates_forward = self.gen_data(k_steps_forward)

        x_data = list(range(len(self.original_data.index)))
        max_x_data = max(x_data)
        forecast_values = list(range(max_x_data + 1, max_x_data + 1 + k_steps_forward, 1))
        y_data = self.original_data.values

        self.fit_df_2, self.forecast_2 = self.from_fit_to_forecast(
            self.original_data, forecast_values, dates_forward, x_data, y_data, order=2)

cls = Polyfit(k_steps_forward=30)

print(cls.fit_df_2)
print(cls.forecast_2)

关键点在于我执行此操作的 from_fit_to_forecast :

[np.poly1d(i)(forecast_values) for i in all_params.T]

这会大大减慢速度。另外,由于我也会使用二阶多项式,因此我尝试使用 np.dot 或其他与矩阵一起使用的东西,但没有效果。

有什么建议吗?

最佳答案

所以你得到了一堆多项式系数

all_params = np.polyfit(x_data, y_data, order)

(其中 y_data 是一个二维数组),并且您希望在点 x_data 处计算所有这些值。如下所述,执行此操作的矢量化方法是:

(x_data.reshape(-1, 1)**np.arange(order, -1, -1)).dot(all_params)

这是一个完美拟合的小示例(通过三个点的二阶多边形),因此您可以看到评估是正确的

x_data = np.array([1, 2, 3])
y_data = np.array([[5, 6,], [9, 8], [7, 4]])
order = 2
all_params = np.polyfit(x_data, y_data, order)
(x_data.reshape(-1, 1)**np.arange(order, -1, -1)).dot(all_params)

输出

array([[ 5.,  6.],
       [ 9.,  8.],
       [ 7.,  4.]])

说明

x_data.reshape(-1, 1)**np.arange(order, -1, -1) 创建 x_data 点的幂矩阵,从最高的开始,例如,

x1**2 x1**1 x1**0
x2**2 x2**1 x2**0

通过矩阵乘法,该矩阵与二次 ax**2 + bx + c 的系数相乘,如下所示

a1 a2
b1 b2
c1 c2

结果正是多项式的值。

关于python - 在 numpy 中使用多项式时如何向量化预测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46665864/

相关文章:

python - 方法中具有递归的自定义类,未定义全局名称

python - 在 Python/pandas 中使用正则表达式查找城市名称

python - 如何使用 'pip install' 在 Windows 上安装 NumPy?

python - 如何向量化Python for循环来修改数据帧的每个元素?

python - 从两个数组中获取相同数量的元素,使得所取值的重复项尽可能少

python asyncio REST api 调用给出错误

python - 如何在opengl中制作坐标Y的动画

python - 使用 numpy 生成带状矩阵

python - numpy dot() 和 Python 3.5+ 矩阵乘法之间的区别@

c - 我怎样才能让 GCC 用 SSE 指令向量化这个简单的复制循环?