Python 用 numpy 拟合数据
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/18767523/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
fitting data with numpy
提问by ezitoc
Let me start by telling that what I get may not be what I expect and perhaps you can help me here. I have the following data:
让我首先告诉我我得到的可能不是我所期望的,也许你可以在这里帮助我。我有以下数据:
>>> x
array([ 3.08, 3.1 , 3.12, 3.14, 3.16, 3.18, 3.2 , 3.22, 3.24,
3.26, 3.28, 3.3 , 3.32, 3.34, 3.36, 3.38, 3.4 , 3.42,
3.44, 3.46, 3.48, 3.5 , 3.52, 3.54, 3.56, 3.58, 3.6 ,
3.62, 3.64, 3.66, 3.68])
>>> y
array([ 0.000857, 0.001182, 0.001619, 0.002113, 0.002702, 0.003351,
0.004062, 0.004754, 0.00546 , 0.006183, 0.006816, 0.007362,
0.007844, 0.008207, 0.008474, 0.008541, 0.008539, 0.008445,
0.008251, 0.007974, 0.007608, 0.007193, 0.006752, 0.006269,
0.005799, 0.005302, 0.004822, 0.004339, 0.00391 , 0.003481,
0.003095])
Now, I want to fit these data with, say, a 4 degree polynomial. So I do:
现在,我想用 4 度多项式拟合这些数据。所以我这样做:
>>> coefs = np.polynomial.polynomial.polyfit(x, y, 4)
>>> ffit = np.poly1d(coefs)
Now I create a new grid for x values to evaluate the fitting function ffit
:
现在我为 x 值创建一个新网格来评估拟合函数ffit
:
>>> x_new = np.linspace(x[0], x[-1], num=len(x)*10)
When I do all the plotting (data set and fitting curve) with the command:
当我使用以下命令进行所有绘图(数据集和拟合曲线)时:
>>> fig1 = plt.figure()
>>> ax1 = fig1.add_subplot(111)
>>> ax1.scatter(x, y, facecolors='None')
>>> ax1.plot(x_new, ffit(x_new))
>>> plt.show()
I get the following:
我得到以下信息:
What I expect is the fitting function to fit correctly (at least near the maximum value of the data). What am I doing wrong?
我期望的是拟合函数正确拟合(至少接近数据的最大值)。我究竟做错了什么?
Thanks in advance.
提前致谢。
采纳答案by askewchan
Unfortunately, np.polynomial.polynomial.polyfit
returns the coefficients in the opposite order of that for np.polyfit
and np.polyval
(or, as you used np.poly1d
). To illustrate:
不幸的是,np.polynomial.polynomial.polyfit
返回系数的顺序与 fornp.polyfit
和np.polyval
(或,如您使用的那样np.poly1d
)的顺序相反。为了显示:
In [40]: np.polynomial.polynomial.polyfit(x, y, 4)
Out[40]:
array([ 84.29340848, -100.53595376, 44.83281408, -8.85931101,
0.65459882])
In [41]: np.polyfit(x, y, 4)
Out[41]:
array([ 0.65459882, -8.859311 , 44.83281407, -100.53595375,
84.29340846])
In general: np.polynomial.polynomial.polyfit
returns coefficients [A, B, C]
to A + Bx + Cx^2 + ...
, while np.polyfit
returns: ... + Ax^2 + Bx + C
.
通常:np.polynomial.polynomial.polyfit
将系数返回[A, B, C]
到A + Bx + Cx^2 + ...
,而np.polyfit
返回:... + Ax^2 + Bx + C
。
So if you want to use this combination of functions, you must reverse the order of coefficients, as in:
因此,如果要使用这种函数组合,则必须颠倒系数的顺序,如下所示:
ffit = np.polyval(coefs[::-1], x_new)
However, the documentationstates clearly to avoid np.polyfit
, np.polyval
, and np.poly1d
, and instead to use only the new(er) package.
但是,文档明确指出要避免np.polyfit
,np.polyval
和np.poly1d
, 而是仅使用 new(er) 包。
You're safest to use only the polynomial package:
只使用 polynomial 包是最安全的:
import numpy.polynomial.polynomial as poly
coefs = poly.polyfit(x, y, 4)
ffit = poly.polyval(x_new, coefs)
plt.plot(x_new, ffit)
Or, to create the polynomial function:
或者,创建多项式函数:
ffit = poly.Polynomial(coefs) # instead of np.poly1d
plt.plot(x_new, ffit(x_new))
回答by Charles Harris
Note that you can use the Polynomial class directly to do the fitting and return a Polynomial instance.
请注意,您可以直接使用 Polynomial 类进行拟合并返回 Polynomial 实例。
from numpy.polynomial import Polynomial
p = Polynomial.fit(x, y, 4)
plt.plot(*p.linspace())
p
uses scaled and shifted x values for numerical stability. If you need the usual form of the coefficients, you will need to follow with
p
使用缩放和移位的 x 值来保证数值稳定性。如果您需要系数的通常形式,则需要遵循
pnormal = p.convert(domain=(-1, 1))