为 numpy polyfit 设置限制
set limits to numpy polyfit
我有两个包含一些数据的数组。特别是,y 数组包含不能超过 y = 100 值的百分比。
y值满足条件y <100 但是如果我进行拟合,结果是曲线超过y = 100,如下图
有什么方法可以使曲线拟合不超过y = 100?
import numpy as np
import matplotlib.pyplot as plt
import numpy.polynomial.polynomial as poly
x = [0.25,0.75,1.25,1.75,2.15,2.75,3.15,3.75,4.15,4.75,5.15,5.75]
y = [ 100.,100.,90.,69.23076923,47.36842105,39.13043478,
35.71428571,26.31578947,22.22222222,18.86792453,
11.76470588,9.43396226]
coefs = poly.polyfit(x, y, 3)
ffit = poly.polyval(x, coefs)
plt.plot(x, ffit)
plt.show()
您可以将要拟合的度数列表传递给 polyfit
函数,这意味着您可以省略某些度数(例如常数值)。通过一些操作,你可以得到你想要的。
假设您希望拟合函数在最小 x 值 (0.25) 处达到 100,您可以从所有 y 值中减去 100,从所有 x 值中减去 0.25,然后拟合一个多项式,使得只有一阶、二阶和三阶项的系数是拟合参数,但不是第零项(或常数项)。然后,在拟合之后,您可以将该常数项设置为 100 并计算新的拟合值。我调整了你的示例代码来说明我的意思:
import numpy as np
import matplotlib.pyplot as plt
import numpy.polynomial.polynomial as poly
fig, ax = plt.subplots()
x = np.array([0.25,0.75,1.25,1.75,2.15,2.75,3.15,3.75,4.15,4.75,5.15,5.75])
y = np.array([ 100.,100.,90.,69.23076923,47.36842105,39.13043478,
35.71428571,26.31578947,22.22222222,18.86792453,
11.76470588,9.43396226])
x_new = np.linspace(x[0],x[-1], 100)
##the original way to fit
coefs = poly.polyfit(x, y, 3)
ffit = poly.polyval(x_new, coefs)
##the adjusted way to fit
coefs2 = poly.polyfit(x-0.25, y-100, [1,2,3])
coefs2[0] = 100
ffit2 = poly.polyval(x_new-0.25,coefs2)
ax.plot(x_new, ffit, label = 'without constraints')
ax.plot(x_new, ffit2, label = 'with constraints')
ax.plot(x, y, 'ro', label = 'data')
ax.legend()
plt.show()
结果如下所示:
希望对您有所帮助。
我有两个包含一些数据的数组。特别是,y 数组包含不能超过 y = 100 值的百分比。 y值满足条件y <100 但是如果我进行拟合,结果是曲线超过y = 100,如下图
有什么方法可以使曲线拟合不超过y = 100?
import numpy as np
import matplotlib.pyplot as plt
import numpy.polynomial.polynomial as poly
x = [0.25,0.75,1.25,1.75,2.15,2.75,3.15,3.75,4.15,4.75,5.15,5.75]
y = [ 100.,100.,90.,69.23076923,47.36842105,39.13043478,
35.71428571,26.31578947,22.22222222,18.86792453,
11.76470588,9.43396226]
coefs = poly.polyfit(x, y, 3)
ffit = poly.polyval(x, coefs)
plt.plot(x, ffit)
plt.show()
您可以将要拟合的度数列表传递给 polyfit
函数,这意味着您可以省略某些度数(例如常数值)。通过一些操作,你可以得到你想要的。
假设您希望拟合函数在最小 x 值 (0.25) 处达到 100,您可以从所有 y 值中减去 100,从所有 x 值中减去 0.25,然后拟合一个多项式,使得只有一阶、二阶和三阶项的系数是拟合参数,但不是第零项(或常数项)。然后,在拟合之后,您可以将该常数项设置为 100 并计算新的拟合值。我调整了你的示例代码来说明我的意思:
import numpy as np
import matplotlib.pyplot as plt
import numpy.polynomial.polynomial as poly
fig, ax = plt.subplots()
x = np.array([0.25,0.75,1.25,1.75,2.15,2.75,3.15,3.75,4.15,4.75,5.15,5.75])
y = np.array([ 100.,100.,90.,69.23076923,47.36842105,39.13043478,
35.71428571,26.31578947,22.22222222,18.86792453,
11.76470588,9.43396226])
x_new = np.linspace(x[0],x[-1], 100)
##the original way to fit
coefs = poly.polyfit(x, y, 3)
ffit = poly.polyval(x_new, coefs)
##the adjusted way to fit
coefs2 = poly.polyfit(x-0.25, y-100, [1,2,3])
coefs2[0] = 100
ffit2 = poly.polyval(x_new-0.25,coefs2)
ax.plot(x_new, ffit, label = 'without constraints')
ax.plot(x_new, ffit2, label = 'with constraints')
ax.plot(x, y, 'ro', label = 'data')
ax.legend()
plt.show()
结果如下所示:
希望对您有所帮助。