ML 能否用于基于示例拟合数据集的曲线拟合数据?

人工智能 机器学习 深度学习 scikit-学习
2021-10-27 22:33:41

假设我有 x,y 数据由带有一些附加参数 (a,b,c) 的函数连接:

是的=F(X;一个,b,C)

现在给定一组数据点(x 和 y),我想确定 a、b、c。如果我知道模型F,这是一个简单的曲线拟合问题。如果我没有怎么办F但是我确实有很多 y 具有相应 a、b、c 值的示例?(或者F计算起来很昂贵,我想要一种更好的方法来猜测正确的参数而无需暴力曲线拟合。)简单的机器学习技术(例如来自 sklearn)是否可以解决这个问题,或者这需要更像深度学习的东西吗?

这是一个生成我正在谈论的数据类型的示例:

import numpy as np                                                                                                                                                                                                                           
import matplotlib.pyplot as plt                                                                                                                                                                                                              

Nr = 2000                                                                                                            
Nx = 100                                                                                                             
x = np.linspace(0,1,Nx)                                                                                              

f1 = lambda x, a, b, c : a*np.exp( -(x-b)**2/c**2) # An example function                                             
f2 = lambda x, a, b, c : a*np.sin( x*b + c)        # Another example function                                        
prange1 = np.array([[0,1],[0,1],[0,.5]])                                                                             
prange2 = np.array([[0,1],[0,Nx/2.0],[0,np.pi*2]])                                                                   
#f, prange = f1, prange1                                                                                             
f, prange = f2, prange2                                                                                              

data = np.zeros((Nr,Nx))                                                                                             
parms = np.zeros((Nr,3))                                                                                             
for i in range(Nr) :                                                                                                 
    a,b,c = np.random.rand(3)*(prange[:,1]-prange[:,0])+prange[:,0]                                                  
    parms[i] = a,b,c                                                                                                 
    data[i] = f(x,a,b,c) + (np.random.rand(Nx)-.5)*.2*a                                                              

plt.figure(1)                                                                                                        
plt.clf()                                                                                                            
for i in range(3) :                                                                                                  
    plt.title('First few rows in dataset')                                                                           
    plt.plot(x,data[i],'.')                                                                                          
    plt.plot(x,f(x,*parms[i]))                                                                                       

在此处输入图像描述

给定data,你能否在一半数据集上训练模型,然后从另一半确定 a、b、c 值?

我一直在阅读一些 sklearn 教程,但我不确定我见过的任何模型都适用于这类问题。对于高斯示例,我可以通过提取与参数相关的特征(例如,第一和第二时刻、%5 和 .%95 百分位数等)来实现,并将它们输入到 ML 模型中,这样可以得到很好的结果,但我想要可以更普遍地工作而无需假设任何事情的东西F或其参数。

2个回答

是的,ML 可以根据包含超参数但不包含模型规范的示例拟合曲线。为此,您需要指定一个足够大的模型族以包含真实模型。然后,您可以将此视为学习从 4 个输入到单个输出的关系。

例如,假设您只愿意对以下相对温和的假设F

  • F是将 4 个输入(3 个参数和一个真正的输入)映射到 1 个输出的函数,所有输入都是实数值。
  • F是以下基本数学运算符的有限数量(例如,不超过 60 个)的组合:+、-、*、/、exp、ln、sin、min、max。

您现在可以框出搜索F作为通过可能函数空间的图搜索或局部搜索问题,这是有限的。如果空间很小或很平滑,您可能会找到良好或准确的表示F迅速地。

专门为此目的设计的 ML 技术的一个示例是 Koza 的遗传编程它在所有可能的 LISP 程序的空间中搜索由一组预先指定的函数构建的从指定输入映射到指定输出的程序。它已广泛用于您在此处描述的那种曲线拟合。

虽然我认为约翰的回答让我更好地了解了我可能想要认真解决这个问题的方向,但事实证明,将数据直接投入一些sklearn算法确实比我想象的要好。例如,以下生成模型参数的大致结果(对于我测试的两个模型案例),而不假设(明确)关于模型本身的任何内容:

from sklearn.ensemble import RandomForestRegressor                                                                   
from sklearn.model_selection import train_test_split                                                                 
from sklearn import metrics 

Xtrain, Xtest, ytrain, ytest = train_test_split(data, parms, random_state=1, )  

model = RandomForestRegressor(random_state=1, n_estimators=15, n_jobs=7)                                             
model.fit(X=Xtrain,y=ytrain)                                                                                       
ypred = model.predict(Xtest)

print(f'i={i} ' + str([metrics.explained_variance_score(ytest[:,i], ypred[:,i]) for i in [0,1,2]]))                  

plt.figure(2)                                                                                                        
plt.title('Guessed parameter fits')                                                                                  
plt.clf()                                                                                                            
for i in range(3) :                                                                                                  
    for j in range(3) :                                                                                              
        plt.subplot(3,3,i*3+j+1)                                                                                     
        plt.plot(x,Xtest[i*3+j],'.')                                                                                 
        plt.plot(x,f(x,*ypred[i*3+j,:]))                                                                             
plt.show()

结果

高斯曲线,a、b、c 参数猜测的解释方差(1.0=每次完美):
[0.8784556933371098, 0.9172501716286985, 0.8874106964444304]

Sin 曲线,a、b、c 参数猜测的解释方差
[0.8190156553698631, 0.9757765139100565, 0.7551784827108721]

这是来自测试集的一些图,以及使用猜测参数评估的原始模型。

示例图 示例图