我有这个数据集,我使用y = (a * x^n) / (b + x^n)希尔函数作为模型,其中a是希尔曲线的极限,是达到b的点a/2(对于n= 1),n是曲线的协同性或陡度。
目前,我正在存储所有X,y值,从 计算参数scipy.optimize.curve_fit并绘制曲线。如果出现新数据点,我会使用旧+新数据重新计算参数。
一旦从先前的数据点获得初始参数,有没有办法在不存储所有先前的旧数据点的情况下更新模型的参数?
例如,我将曲线拟合到前 1000 个数据点并有我的参数。接下来,我丢弃部分或全部旧数据。然后,当我看到第 1001 个点时,我只需更新我的参数并再次为每个新数据点绘制曲线等等。
编辑
我现有的代码如下(不是超级优雅)。
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
def file_stream(file_name):
with open(file_name, 'r') as in_file:
for line in in_file:
yield map(float, line.strip().split('\t'))
def hill_model(X, a, b, n):
return [float((a * x**n)) / (b + x**n) for x in X]
def get_params(X_all, y_all, prev_par=None, fn=hill_model):
if prev_par is None:
a_init, b_init, n_init = y_all[-1], y_all[0], 1.0
else:
a_init, b_init, n_init = prev_par
opt_par, opt_cov = curve_fit(fn, X_all, y_all, p0=[a_init, b_init, n_init])
a_final, b_final, n_final = opt_par
return a_final, b_final, n_final
def main():
file_name = 'data.tsv'
file_streamer = file_stream(file_name)
X_all, y_all = [], []
# Get some intial data from stream
for _ in xrange(1000):
X, y = file_streamer.next()
X_all.append(X)
y_all.append(y)
plt.scatter(X_all, y_all)
# Initialize params of model
a, b, n = get_params(X_all, y_all)
y_model = hill_model(X_all, a, b, n)
plt.plot(X_all, y_model, 'r-')
plt.show()
# Rolling update
seen_all = False # Helps stop when all data is fit
while True:
for _ in xrange(1000):
try:
X, y = file_streamer.next()
X_all.append(X)
y_all.append(y)
except:
seen_all = True
break
a, b, n = get_params(X_all, y_all, prev_par=[a, b, n], fn=hill_model)
y_model = hill_model(X_all, a, b, n)
plt.scatter(X_all, y_all)
plt.plot(X_all, y_model, 'r-')
plt.show()
# Nothing more to update, return
if seen_all:
return
if __name__ == '__main__':
main()
代码当前读入一些X,y值,计算a, b,n参数,当X,y添加更多值时,代码更新a, b, 和nparams。如您所见,我需要存储X,y我不想要的以前的值。我想在X,y看到新值时更新参数,并且仅从以前a的 ,b和n值中更新参数。