用新数据更新模型参数,丢弃旧数据

计算科学 Python scipy 机器学习 麻木的 回归
2021-12-17 21:19:53

我有这个数据集,我使用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的 ,bn值中更新参数。

0个回答
没有发现任何回复~