遗传编程GP-拟合方程

一般都是用机器学习、梯度下降或sklearn、pytorch来做函数拟合运算,今天介绍遗传编程,或称基因编程/GP,来做这个计算

最终就是构造一棵树AST,来表示运算的先后、权重:

具体原理可以参考这篇文章:https://blog.csdn.net/ocd_with_naming/article/details/98901749

我们的目标是拟合这个函数:

np.sin(x) + np.log(x)

图像为:

先来一段java代码,是加载训练数据的,x、y的一个list;

private static List<Sample<Double>> load训练数据()
    {
        List<Sample<Double>> samples=new ArrayList<>();
        samples.add(new DoubleDataSample(new Double[]{ 1.0 , 0.8414709848078965 }));                  //第一个为x,第二个为y
        samples.add(new DoubleDataSample(new Double[]{ 1.1 , 0.9865175398657604 }));
        samples.add(new DoubleDataSample(new Double[]{ 1.2000000000000002 , 1.1143606427611812 }));
        samples.add(new DoubleDataSample(new Double[]{ 1.3000000000000003 , 1.2259224498846844 }));
        samples.add(new DoubleDataSample(new Double[]{ 1.4000000000000004 , 1.3219219666096733 }));
        samples.add(new DoubleDataSample(new Double[]{ 1.5000000000000004 , 1.4029600947122192 }));
        samples.add(new DoubleDataSample(new Double[]{ 1.6000000000000005 , 1.4695772322872411 }));
        samples.add(new DoubleDataSample(new Double[]{ 1.7000000000000006 , 1.5222930615146393 }));
        samples.add(new DoubleDataSample(new Double[]{ 1.8000000000000007 , 1.5616342957803144 }));
        samples.add(new DoubleDataSample(new Double[]{ 1.9000000000000008 , 1.5881539738598094 }));        //省略很多x/y对
        return samples;
    }  

下面就是整个算法的架子了:

public static void main(String[] args) {
        List<Op<Double>> terminals=new ArrayList<>();
        terminals.add(Var.of("x", 0));                  //由于只有1个自变量,所以这里只有x                                         //0代表第一个自变量                                         //如果是向量,则此处可以为x1/0, x2/1, x3/2  以此类推

        List<Sample<Double>> samples=load训练数据();

        final ISeq<Op<Double>> OPS = ISeq.of(MathOp.ADD, MathOp.SUB, MathOp.MUL, MathOp.SIN,MathOp.COS, MathOp.LOG);      //这些是算法允许使用的操作算子
        final ISeq<Op<Double>> TMS = ISeq.of(terminals);          //上面的自变量在此处挂接上
        final Regression<Double> REGRESSION =
                Regression.of(
                        Regression.codecOf(
                                OPS, TMS, 5,
                                t -> t.getGene().size() < 30
                        ),
                        Error.of(LossFunction::mse),             //MSE计算误差
                        samples
                );

        final Engine<ProgramGene<Double>, Double> engine = Engine
                .builder(REGRESSION)
                .minimizing()
                .alterers(
                        new SingleNodeCrossover<>(0.1),
                        new Mutator<>())
                .build();

        final EvolutionResult<ProgramGene<Double>, Double> er =
                engine.stream()
                        .limit(Limits.byExecutionTime(Duration.ofSeconds(5)))
                        .collect(EvolutionResult.toBestEvolutionResult());

        final ProgramGene<Double> program = er.getBestPhenotype()
                .getGenotype()
                .getGene();

        final TreeNode<Op<Double>> tree = program.toTreeNode();
		MathExpr.rewrite(tree);
        System.out.println("G: " + er.getTotalGenerations());
        System.out.println("F: " + new MathExpr(tree));
        System.out.println("E: " + REGRESSION.error(tree));
    }

  

原文地址:https://www.cnblogs.com/aarond/p/GP.html

时间: 2024-11-10 08:38:19

遗传编程GP-拟合方程的相关文章

遗传编程GP-地图路径寻路

本文介绍的是基于GP,并非A*算法,算是另类实现吧. 先看看地图定义,在文本文件中定义如下字符串,代表30列11行大小的地图 初始位置在左上角(0,0) ,值为1的是允许走的通的路,目标位置为右下角(29,10) 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0

最小二乘法拟合多项式原理以及c++实现

转载请注明出处:http://blog.csdn.net/lsh_2013/article/details/46697625 最小二乘法(又称最小平方法)是一种数学优化技术.它通过最小化误差的平方和寻找数据的最佳函数匹配. c++实现代码如下: #include <iostream> #include <vector> #include <cmath> using namespace std; //最小二乘拟合相关函数定义 double sum(vector<do

人工智能之梦

作者:张江 制造出能够像人类一样思考的机器是科学家们最伟大的梦想之中的一个.用智慧的大脑解读智慧必将成为科学发展的终极. 而验证这样的解读的最有效手段,莫过于再造一个智慧大脑--人工智能(Artificial Intelligence,AI). 人们对人工智能的了解恐怕主要来自于好莱坞的科幻片. 这些荧幕上的机器(见图1-1)要么杀人如麻.如<终结者><黑客帝国>.要么小巧可爱,如<机器人瓦利>.要么多愁善感,如<人工智能>:还有一些则大音希声.大象无形.如

史上最全的机器学习资料(上) 转

转自:http://www.afenxi.com/post/18593 摘要: 机器学习牵涉的编程语言十分之广,包括了MATLAB.Python.Clojure.Ruby等等.为了让开发者更加广泛.深入地了解机器学习,云栖社区组织翻译了GitHub Awesome Machine Learning 资源,涵盖24种编程语言的机器学习的框架.库以及其他相关资料. 机器学习(Machine Learning, ML)是一门多领域交叉学科,涉及概率论.统计学.逼近论.凸分析.算法复杂度理论等多门学科.

【转】人工智能基本术语(中英文对照)

转自:http://blog.163.com/chenqingshuang_2/blog/static/54409195200710247110161/ 自适应交叉adaptive crossover 自适应变异adaptive mutation 等位基因allele 算术交叉arithmetic crossover 人工生命artificial life 装箱问题Bin Packing 二进制编码基因binary genes 边界变异boundary mutation 基因块假设,积木块假设b

Deep Learning(深度学习)学习笔记整理

申明:本文非笔者原创,原文转载自:http://www.sigvc.org/bbs/thread-2187-1-3.html 4.2.初级(浅层)特征表示 既然像素级的特征表示方法没有作用,那怎样的表示才有用呢? 1995 年前后,Bruno Olshausen和 David Field 两位学者任职 Cornell University,他们试图同时用生理学和计算机的手段,双管齐下,研究视觉问题. 他们收集了很多黑白风景照片,从这些照片中,提取出400个小碎片,每个照片碎片的尺寸均为 16x1

几种常见 容器 比较和分析 hashmap, map, vector, list .

list支持快速的插入和删除,但是查找费时; vector支持快速的查找,但是插入费时. map查找的时间复杂度是对数的,这几乎是最快的,hash也是对数的. 如果我自己写,我也会用二叉检索树,它在大部分情况下可以保证对数复杂度,最坏情况是常数复杂度,而std::map在任何情况下都可以保证对数复杂度,原因是它保证存诸结构是完全二叉检索树,但这会在存诸上牺牲一些时间. STL   中的   map   内部是平衡二叉树,所以平衡二叉树的性质都具备.查找数据的时间也是对数时间.vector,在分配

[转载]Deep Learning(深度学习)学习笔记整理

转载自:http://blog.csdn.net/zouxy09/article/details/8775360 感谢原作者:[email protected] 八.Deep learning训练过程 8.1.传统神经网络的训练方法为什么不能用在深度神经网络 BP算法作为传统训练多层网络的典型算法,实际上对仅含几层网络,该训练方法就已经很不理想.深度结构(涉及多个非线性处理单元层)非凸目标代价函数中普遍存在的局部最小是训练困难的主要来源. BP算法存在的问题: (1)梯度越来越稀疏:从顶层越往下

Deep Learning(深度学习)学习笔记整理系列 | @Get社区

body { font-family: Microsoft YaHei UI,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5; } html, body { } h1 { font-size:1.5em; font-weight:bold; } h2 { font-size:1.4em; font-weight:bo