Python polyfit(x,y,100)将是100阶多项式,但matplotlib.pyplot.legend显示53?

Python polyfit(x,y,100)将是100阶多项式,但matplotlib.pyplot.legend显示53?,python,numpy,matplotlib,curve-fitting,Python,Numpy,Matplotlib,Curve Fitting,我很难弄明白为什么我的plt.legend显示了错误的多项式度数。上面写的是53而不是100。我的代码如下所示: import scipy as sp import numpy as np import urllib2 import matplotlib.pyplot as plt url = 'https://raw.github.com/luispedro/BuildingMachineLearningSystemsWithPython/master/ch01/data/web_traff

我很难弄明白为什么我的plt.legend显示了错误的多项式度数。上面写的是53而不是100。我的代码如下所示:

import scipy as sp
import numpy as np
import urllib2
import matplotlib.pyplot as plt

url = 'https://raw.github.com/luispedro/BuildingMachineLearningSystemsWithPython/master/ch01/data/web_traffic.tsv'
src = urllib2.urlopen(url)
data = np.genfromtxt(src)

x = data[:, 0]
y = data[:, 1]
x = x[~sp.isnan(y)] 
y = y[~sp.isnan(y)] 

def error(f, a, b):
    return sp.sum((f(a) - b) ** 2)

fp100 = sp.polyfit(x, y, 100)
f100 = sp.poly1d(fp100)
plt.plot(x, f100(x), linewidth=4)
plt.legend("d={num}".format(num=f100.order), loc=2)
plt.show()

我可以用您的数据复制:

>>> np.__version__
1.8.0
>>> fp100 = sp.polyfit(x, y, 100)
polynomial.py:587: RankWarning: Polyfit may be poorly conditioned
  warnings.warn(msg, RankWarning)
>>> f100 = sp.poly1d(fp100)
>>> f100.order
53
注意警告并咨询:

当最小二乘拟合条件较差时,polyfit会发出RankWarning。这意味着由于数值误差,最佳拟合没有得到很好的定义可以通过降低多项式次数或用x-x替换x来改善结果。平均值()

您的
y
方差较低:

>>> y.mean()
1961.7438692098092
>>> y.std()
860.64491521872196
因此,人们不会期望更高的政治经济学能很好地适应它。请注意,按照docs的建议,将x替换为
x-x.mean()
,然后近似为较低阶次的多项式,但不比较高阶次的多项式差:

>>> xp=x-x.mean()
>>> f100 = sp.poly1d(sp.polyfit(xp, y,100))
>>> max(abs(f100(xp)-y)/y)
2.1173504721727299
>>> abs((f100(xp)-y)/y).mean()
0.18100985148093593

>>> f4 = sp.poly1d(sp.polyfit(xp, y, 4))
>>> max(abs(f4(xp)-y)/y)
2.1228866902203842
>>> abs((f4(xp)-y)/y).mean()
0.20139219654066282

>>> print f4
           4             3             2
8.827e-08 x + 3.161e-05 x + 0.0003102 x + 0.06247 x + 1621
事实上,最重要的部分似乎是2级。所以这是正常的,最好的近似度不大于100的数据多项式,实际上是53度。所有高等单项式都是退化的。下图表示近似值,红线对应4度多项式,绿色对应53度多项式:


请提供您的数据,没有它就不可能重现您的问题。这里是:我还删除了nan值:x=x[~sp.isnan(y)]y=y[~sp.isnan(y)]
f100。订单为me@joris我为来自评论的数据添加了代码,并成功地复制了行为。非常感谢,这是非常有用的!)哇,我的第一个问题,我已经对这个问答板着迷了。再次感谢你!