为什么numpy.polyfit
和numpy.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);
答案 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)
根据生成方程式以降阶数返回系数numpy.polyfit
根据生成方程式以升阶返回系数。尽管在数学上相同,但是这两个方程在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()
将产生预期的结果: