numpy.polyfit与numpy.polynomial.polynomial.polyfit

时间:2019-11-23 02:48:22

标签: python numpy

为什么numpy.polyfitnumpy.polynomial.polynomial.polyfit 在下面的测试中产生不同的情节?

const datos = [{
    Description: 'Puede Insertar',
    Id: 1,
    Type: 'ADMON',
    Value: '1'
  },
  {
    Description: 'Puede Insertar',
    Id: 1,
    Type: 'ADMON',
    Value: '2'
  },
  {
    Description: 'Puede Insertar',
    Id: 1,
    Type: 'ADMON',
    Value: '3'
  },
  {
    Description: 'Puede Insertar',
    Id: 1,
    Type: 'USER',
    Value: '1'
  },
  {
    Description: 'Puede Insertar',
    Id: 1,
    Type: 'USER',
    Value: '2'
  },
  {
    Description: 'Puede Insertar',
    Id: 1,
    Type: 'USER',
    Value: '4'
  }
];

const grouped = datos.reduce((acc, el) => {
  if (!acc[el.Type]) acc[el.Type] = {};
  const index = Object.values(acc[el.Type]).length;
  acc[el.Type] = {
    ...acc[el.Type],
    [index]: el.Value
  }
  return acc;
}, {});

const final = Object.entries(grouped).map(([key, val]) => {
  return { [key]: val }
});

console.log(final);

enter image description here

1 个答案:

答案 0 :(得分:1)

乍一看,文档似乎表明它们应该给出相同的结果-

  

import numpy as np from numpy.polynomial.polynomial import polyfit import matplotlib.pyplot as plt x = np.linspace(0, 10, 50) y = 5 * x + 10 + (np.random.random(len(x)) - 0.5) * 5 plt.scatter(x, y,marker='.', label='Data for regression') plt.plot(np.unique(x), np.poly1d(np.polyfit(x, y, 1))(np.unique(x)), label='numpy.polyfit') plt.plot(np.unique(x), np.poly1d(polyfit(x, y, 1))(np.unique(x)), label='polynomial.polyfit') plt.legend() plt.show()
  
  最小二乘多项式拟合。
  
  将多项式p(x)= p [0] * x ** deg + ... + p°度deg拟合为点(x,y)。返回系数p的向量,该向量将deg,deg-1,…0的阶数的平方误差最小化。

  

numpy.polyfit(x, y, deg, rcond=None, full=False, w=None, cov=False)
  
  多项式与数据的最小二乘拟合。
  
  返回度deg的多项式的系数,该系数是与点x上给出的数据值y最小二乘的平方。如果y为一维,则返回的系数也将为一维。如果y是二维拟合,则对y的每一列进行一次拟合,并将所得系数存储在二维返回的相应列中。拟合多项式的形式为
  
  p(x)= c_0 + c_1 * x + ... + c_n * x ^ n

但是区别在于,至少对于所讨论的用例,这两种方法返回的系数顺序不同。

  • numpy.polynomial.polynomial.polyfit(x, y, deg, rcond=None, full=False, w=None)根据生成方程式以阶数返回系数
    p(x)= c_n * x ^ n + c_(n-1)+ x ^(n-1)+ ... + c_1 * x + c_0
  • numpy.polyfit根据生成方程式以阶返回系数。
    p(x)= c_0 + c_1 * x + ... + c_(n-1)+ x ^(n-1)+ c_n * x ^ n

尽管在数学上相同,但是这两个方程在numpy.polynomial.polynomial.polyfit表示中是不同的。在文档中使用不同的符号可能会混淆这一点。为了演示,请考虑以下内容

ndarray
import numpy as np

x = np.linspace(0, 10, 50)
y = x**2 + 5 * x + 10

print(np.polyfit(x, y, 2))
print(np.polynomial.polynomial.polyfit(x, y, 2))

两种方法都得到相同的结果,但是顺序相反,前一种是np.poly1d()的期望-

[ 1.  5. 10.]
[10.  5.  1.]
print(np.poly1d(np.polyfit(x, y, 2)))
print(np.poly1d(np.polynomial.polynomial.polyfit(x, y, 2)))

,而后者是np.polynomial.polynomial.Polynomial()构造函数所期望的。 Flipping来自 2 1 x + 5 x + 10 2 10 x + 5 x + 1 的结果,然后传递给np.polynomial.polynomial.polyfit或使用poly1d()将产生预期的结果:

Matching output