用于发现公式的机器学习

机器算法验证 回归 机器学习 优化 软件
2022-03-15 13:19:37

我有一个希望值的向量,我想根据一些生成的预测变量来拟合。棘手的部分是我希望有明确的公式。例如,给下面的输入我想得到下面的公式

输入:

Y=[1,2,3,6,7]
X=[1,2,3,4,5;0,0,0,1,1]

输出:

Transf={'multiply',1,'transform',linear;...
'multiply',2,'transform',linear}

Y=Transf(X) %which would be equal to: Y=1*X(1,:)+2*X(2,:)

这是一个不那么复杂的线性回归。但概括它可以给出对数变换、sin、cosin、根、指数。

我可以从什么软件开始?或者我该如何实现呢?

3个回答

除了@DankMasterDan (+1) 的好回答之外,我还想分享有关该主题的更多信息。您正在寻找的一种方法似乎是symbolic regression它似乎与进化算法密切相关并且通常通过进化算法实现,例如最流行的遗传编程(GP)。然而,也提出了其他方法,特别是与物理系统的分析模型有关的方法。例如,请参阅 Shmidt 和 Lipson (2009) 发表在《科学》杂志上的一篇论文。顺便说一句,这个基于 Java 的小型开源项目提供了上述方法的实现。

软件方面,可用于符号回归,在我专注于我最喜欢的开源解决方案之前,我想提一下,Eureqa绝对是一个有趣的产品,它是从一个开源项目发展而来的然而,与当今市场上可用的许多商业统计或机器学习解决方案一样,它非常昂贵。

我将使用混合解决方案GPTIPS开始简要回顾开源解决方案,它是用于商业 MATLAB 的开源插件软件。它被作者称为“MATLAB 的符号数据挖掘平台”。

现在,转向一个完整的开源软件,恕我直言,我们可以找到几个非常有趣的解决方案。一个著名的与语言无关(但仍然基于 Python)的系统SageMath通过SymPy Python 库提供符号回归功能,它也可以独立使用。另一个非常有趣的综合开源软件系统是基于 .NET 的HeuristicLab虽然 HeuristicLab 被标记为“启发式和进化算法的框架”,但它提供了比符号计算和进化/GP 解决方案更广泛的功能。

除了已经提到的 SymPy 库之外,Python 生态系统还提供DEAP开源项目,其中 DEAP 缩写是指 Python 中的分布式进化算法。

如果不提及我最喜欢的R 生态系统在这方面提供了什么,我对符号回归和相关解决方案的开源软件的简要分析是不完整的。用于 GP 和符号回归的一个有趣的 R 包是rgp可在 CRAN 上获得),它被称为“R 遗传编程框架”(RGP)。RGP 包是 R 符号计算的一组更大的开源工具的一部分,该工具是在更大的Rsymbolic 项目的保护伞下开发的。还有几个以优化为重点的 GP 包(http://cran.r-project.org/web/views/Optimization.html),但是它们不太可能提供开箱即用的符号回归功能,就像 RGP 包一样。

参考

Schmidt, M. 和 Lipson, H. (2009)。从实验数据中提取自由形式的自然法则。科学,324(5923),81-85。doi:10.1126/science.11​​65893 检索自http://creativemachines.cornell.edu/sites/default/files/Science09_Schmidt.pdf

听起来你的目标是找到一个任意函数 g(:),使得 y=g(x)。

你的问题的答案取决于你所说的明确的意思。具体来说,您应该注意有无数种方法可以指定任何函数 g(:),例如 g(x)=x on -1

如果“显式”是指找到在功能上等同于 g(x) 的 aag*(:) - 即对于 x 的所有值给出相同的 g(x) 输出,那么是的,有许多 ML 算法可以做到这一点对于任意函数 g(:)。这些算法可以为您提供从 x 到 y 的完美预测能力,尽管可能会以过度拟合数据为代价。它们包括带有 RBF 内核和决策树的 SVM(即任何具有无限 VK 维度的算法)。

但是,如果明确表示您指的是描述 y=g(x) 的最简单 g(:),那么事情会变得更加复杂,因为简单/稀疏/复杂是人类的概念,只能非常笨拙地量化。例如,理论上,带 rbf 内核的 SVM 回归可以完美拟合 y=sin(x),但它不会输出 g=sin(:),而是输出一系列无法​​解释的系数,您必须完成这项工作将它们拼凑成'sin(x)'。

现在已经完成了那个理论上的庞然大物,我认为一个好的开始方法是用泰勒展开来拟合数据,因为这至少在某种程度上是可以解释的。

祝你好运,希望这会有帮助!

我非常喜欢Mathematica来完成这样的任务。给定表格数据mydata={{x1,y1},{x2,y2},...}, 搜索未知参数,例如a,b,c, 和d以这种方式在您选择的非线性函数中:

NonlinearModelFit[mydata, {a + b x + c x^2 + d Sin[x]}, {a, b, c, d}, x]

符号输出是

FittedModel[2.8 + 1.075 x + .292 x^2 + 4.9 Sin[x]]

该非线性模型和数据的图如下所示:

在此处输入图像描述

您可以根据需要放入任意数量的基函数,有些可能“适合”0系数等。当然,您也需要比自由参数更多的数据点才能使您的拟合有意义。