Python 使用numpy polyfit无法获得正确的值

Python 使用numpy polyfit无法获得正确的值,python,numpy,curve-fitting,polynomials,data-fitting,Python,Numpy,Curve Fitting,Polynomials,Data Fitting,结果图是这样的——与数据完美吻合。数据和曲线拟合的两条重叠曲线,散布点显示X=100处的值,该值远离曲线拟合 这里怎么了?为什么trendpoly(100)的值与曲线拟合不一致?这是问题所在 设置多项式的阶数越多,过拟合的次数就越多。 尝试以3或更少的顺序观察变化 这就是问题所在 设置多项式的阶数越多,过拟合的次数就越多。 尝试以3或更少的顺序观察变化 如果绘制整个多项式,则拟合并分散数据点 import numpy as np from matplotlib import pyplot as

结果图是这样的——与数据完美吻合。数据和曲线拟合的两条重叠曲线,散布点显示X=100处的值,该值远离曲线拟合

这里怎么了?为什么trendpoly(100)的值与曲线拟合不一致?

这是问题所在

设置多项式的阶数越多,过拟合的次数就越多。 尝试以3或更少的顺序观察变化

这就是问题所在

设置多项式的阶数越多,过拟合的次数就越多。 尝试以3或更少的顺序观察变化


如果绘制整个多项式,则拟合并分散数据点

import numpy as np
from matplotlib import pyplot as plt
a = np.ndarray((2,8))

a[0] = [0,10,21.5,25.2,70,89,112,150] # row for all X values
a[1] = [0,5,10,15,20,25,30,35] # row for all Y values


#Value by curve fitting - 7th order polynomial            
trend = np.polyfit(a[0], a[1], 7)
trendpoly = np.poly1d(trend) #Values of the coefficients of 5th order polynomial
plt.plot(a[0],trendpoly(a[0]))
plt.plot(a[0],a[1])

Y4 = trendpoly(100)
plt.scatter(100,Y4)

print(Y4)
您可能会看到围绕数据点旋转的剧烈旋转曲线。确定拟合多项式阶数的方法是1)查看您希望数据遵循的函数类型。2) 尝试不同的多项式度数,直到你得到一个不会不合理地振荡的拟合

如果有n个数据点,则次数>=n-1的多项式将完美地截取每个数据点,但将远离数据点之间的曲线


如果你希望你的数据遵循一些非多项式函数,比如log(x)或exp(x)(或者在这种情况下可能是a*sqrt(b*x)),你可以研究scipy.curve_fit。

如果你绘制了你拟合的整个多项式并分散了你的数据点

import numpy as np
from matplotlib import pyplot as plt
a = np.ndarray((2,8))

a[0] = [0,10,21.5,25.2,70,89,112,150] # row for all X values
a[1] = [0,5,10,15,20,25,30,35] # row for all Y values


#Value by curve fitting - 7th order polynomial            
trend = np.polyfit(a[0], a[1], 7)
trendpoly = np.poly1d(trend) #Values of the coefficients of 5th order polynomial
plt.plot(a[0],trendpoly(a[0]))
plt.plot(a[0],a[1])

Y4 = trendpoly(100)
plt.scatter(100,Y4)

print(Y4)
您可能会看到围绕数据点旋转的剧烈旋转曲线。确定拟合多项式阶数的方法是1)查看您希望数据遵循的函数类型。2) 尝试不同的多项式度数,直到你得到一个不会不合理地振荡的拟合

如果有n个数据点,则次数>=n-1的多项式将完美地截取每个数据点,但将远离数据点之间的曲线


如果您希望数据遵循一些非多项式函数,如log(x)或exp(x)(在本例中可能是a*sqrt(b*x)),您可以查看scipy.曲线拟合。

谢谢您的回答。我试过用一个5阶多项式,它给出了一个更合理的值,但是趋势曲线与数据曲线不太吻合,所以我用了7阶多项式,它拟合得很好。科学地说,我应该相信哪一条曲线适合呢?如果我不需要X=100,我就不会遇到这个问题。有没有办法知道我们是否过度拟合数据?非常感谢你的帮助。是的,你说得对。确定这一点的一种方法是非常感谢,这非常相关。谢谢你的回答。我试过用一个5阶多项式,它给出了一个更合理的值,但是趋势曲线与数据曲线不太吻合,所以我用了7阶多项式,它拟合得很好。科学地说,我应该相信哪一条曲线适合呢?如果我不需要X=100,我就不会遇到这个问题。有没有办法知道我们是否过度拟合数据?非常感谢你的帮助。是的,你说得对。确定这一点的一种方法是非常感谢,这是非常相关的。问题是你只是在它们之间绘制了一些点和线。如果你做一些类似于
b=np.arange(0155,5)plt.scatter(b,trendpoly(b))plt.scatter(a[0],a[1])
的事情,你会看到给定点之外的过度拟合效果。谢谢你,我这样检查过了,我可以看到所有具有过度拟合效果的点。我想问你和我问另一个回答者一样的问题。非常感谢你的帮助。因此,我尝试了一个5阶多项式,它给出了一个更合理的值,但是趋势曲线与数据曲线不匹配。因此我使用了7阶多项式,它非常适合数据点,而不是linspace。科学地说,我应该相信哪一条曲线适合呢?如果我不需要X=100,我就不会遇到这个问题。有没有办法知道我们是否过度拟合数据?根据您的最终目标,您应该了解偏差-方差权衡。问题是您只在它们之间绘制了几点和几条线。如果你做一些类似于
b=np.arange(0155,5)plt.scatter(b,trendpoly(b))plt.scatter(a[0],a[1])
的事情,你会看到给定点之外的过度拟合效果。谢谢你,我这样检查过了,我可以看到所有具有过度拟合效果的点。我想问你和我问另一个回答者一样的问题。非常感谢你的帮助。因此,我尝试了一个5阶多项式,它给出了一个更合理的值,但是趋势曲线与数据曲线不匹配。因此我使用了7阶多项式,它非常适合数据点,而不是linspace。科学地说,我应该相信哪一条曲线适合呢?如果我不需要X=100,我就不会遇到这个问题。有没有办法知道我们是否过度拟合数据?根据您的最终目标,您应该了解偏差-方差权衡。非常感谢,您的答案非常有用。非常感谢,您的答案非常有用。