我有一组数据点(代码中的x和y)。我想绘制这些点,并为它们拟合一条曲线,表明需要x的值才能使y = 100.0(y值为百分比)。这是我尝试过的,但我的曲线是3阶多项式(我知道这是错误的)。对我来说,数据看起来是对数的,但我现在知道如何将对数曲线与我的数据进行聚合。
import numpy as np
import matplotlib.pyplot as plt
x = np.array([4,8,15,29,58,116,231,462,924,1848])
y = np.array([1.05,2.11,3.95,7.37,13.88,25.46,43.03,64.28,81.97,87.43])
for x1, y1 in zip(x,y):
plt.plot(x1, y1, 'ro')
z = np.polyfit(x, y, 3)
f = np.poly1d(z)
for x1 in np.linspace(0, 1848, 110):
plt.plot(x1, f(x1), 'b+')
plt.show()
答案 0 :(得分:3)
它看起来像一个绑定curve:
def binding(x,kd,bmax):
return (bmax*x)/(x+kd)
param=sp.optimize.curve_fit(binding, x,y)
plt.plot(x,y,'o',np.arange(2000),binding(np.arange(2000),*param[0]))
在这种情况下,严格来说,y = 100%只会发生在x = inf
答案 1 :(得分:2)
我解决这些问题的方法是使用scipy.optimize.curve_fit
。当然,这是您必须导入的功能scipy.optimize
。
该函数将您使用def f( x, a, b )
定义的函数作为第一个参数。该函数必须将自变量作为第一个参数,所有其他参数应该是函数的参数
然后.curve_fit()
获取x数据,然后获取y数据(numpy
1-D数组是好的)。它返回一个具有最佳拟合参数的数组。最后你应该有这样的东西。
import numpy as np
from scipy.optimize import curve_fit
def l( x, a, b, c, d ):
return a*np.log( b*x + c ) + d
param = curve_fit( l, x, y )
答案 2 :(得分:2)
你实际上并不需要使用Numpy或Scipy的任何拟合功能,因为那里有一个简单的"" closed form formula for finding the least-squares fit to a logarithmic curve。这是Python中的一个实现:
def logFit(x,y):
# cache some frequently reused terms
sumy = np.sum(y)
sumlogx = np.sum(np.log(x))
b = (x.size*np.sum(y*np.log(x)) - sumy*sumlogx)/(x.size*np.sum(np.log(x)**2) - sumlogx**2)
a = (sumy - b*sumlogx)/x.size
return a,b
然后您可以将其应用于您的问题:
x = np.array([4,8,15,29,58,116,231,462,924,1848])
y = np.array([1.05,2.11,3.95,7.37,13.88,25.46,43.03,64.28,81.97,87.43])
def logFunc(x, a, b):
return a + b*np.log(x)
plt.plot(x, y, ls="none", marker='.')
xfit = np.linspace(0,2000,num=200)
plt.plot(xfit, logFunc(xfit, *logFit(x,y)))
我不认为你的数据是对数的,但是: