利用机器学习拟合复杂函数,并利用遗传算法求最优解

编程语言:Python
利用工具:sklearn、keras、geatpy
步骤原理简述:
1、利用机器学习到数据集的多维特征和输出的拟合函数关系(模型去学,并保存模型)。
2、加载模型函数,利用遗传算法找到该函数的最优解(实际是在不同约束条件下的变量值中,求取拟合函数的最大值或最小值)
工具介绍:
   1、sklearn: https://scikit-learn.org/stable/ 官网教程网页,我利用了其中的Regression(回归模型),利用pipeline(将数据预处理和模型训练集成在一起)
基于sklearn的回归模型去拟合,模型如下(采用了LinearRegression和TheilSenRegressor/XGBRegressor(因为数据集较简单采用了线性拟合模型)),sklear提供的回归模型其余多种类型。拟合效果如下:

#LinearRegression
Pipeline([('scale', MinMaxScaler()),('reg', linear_model.LinearRegression())
])
data_size: 6715
mse: 36.539681516210784 rmse: 6.044806160350452 mae:4.63826039731241
mape: 3.3011660989748934    r2: 0.808433725049098#TheilSenRegressor
Pipeline([('scale', StandardScaler()),('reg', TheilSenRegressor(random_state=5))
])
data_size: 6715
mse: 35.90317863408285  rmse: 5.9919261205461 mae:4.5948612203764805    mape: 3.281180987786468 r2: 0.8117707132511071```#XGBRegressor
Pipeline([('scale', StandardScaler()),('reg', XGBRegressor(max_depth=5, n_estimators=100, n_jobs=8))
])
data_size: 6715
mse: 44.95695040186879  rmse: 6.704994437124373 mae: 5.23324546786106
mape: 3.69434252416818  r2: 0.7643045816418063

   2、keras,官网教程https://keras.io/zh/ 因为数据集较简单,试验过程,具体结构与结果记录如下:

基于keras神经网络的回归拟合
Keras1: (别人原始输出)y: _Power_chiller    data_size: 6715
mse: 109.89059902559949 rmse: 10.482871697469138    mae: 8.92583014113255
mape: 6.267563752145885 r2: 0.4238774988195254keras2:
model.add(Dense(output_dim=1, input_dim=9))
model.compile(loss='mean_squared_error', optimizer='sgd')
data_size: 6715
mse: 34.67461192389513  rmse: 5.888515256318449 mae: 4.535644083885483
mape: 3.2163304659323524    r2: 0.8182117094074346keras3:
model.add(Dense(4,input_dim=9,activation='sigmoid'))
model.add(Dense(1,activation='linear')data_size: 6715mse:
mse: 105.27507699250788 rmse: 10.26036436938318 mae: 8.179505252179268
mape: 5.890991045203168 r2: 0.4480752566035091keras4:
model.add(Dense(4,input_dim=9,activation='sigmoid'))
model.add(Dense(4, activation='sigmoid'))
model.add(Dense(1, activation='linear'))
data_size: 6715
mse: 116.41971469072959 rmse: 10.789796786350037    mae: 8.7450677473619
mape: 6.026414498738246 r2: 0.38964736011025247keras5:
model.add(Dense(18,input_dim=9,activation='sigmoid'))
model.add(Dense(18, activation='sigmoid'))
model.add(Dense(1, activation='linear'))
data_size: 6715 mse: 126.90706426348436 rmse: 11.26530355842595
mae: 8.772541177423156  mape: 6.09706260143816  r2: 0.33466542243602104keras6:
model.add(Dense(18,input_dim=9,activation='sigmoid'))
model.add(Dense(18, activation='sigmoid'))
model.add(Dense(1, activation='linear'))
data_size: 6715 mse: 92.46484791330296  rmse: 9.61586438721465  mae: 6.507704671795376
mape: 4.631009747366009 r2: 0.5152353347471101

3、拟合函数求到后,利用geatpy求取使输出值最小的变量
工具介绍:
geatpy:http://www.geatpy.com/start
Geatpy提供了许多已实现的遗传和进化算法相关算子的库函数,如初始化种群、选择、交叉、变异、重插入、多种群迁移、多目标优化非支配排序等,并且提供开放式的进化算法框架来实现多样化的进化算法。其执行效率高于Matlab遗传算法工具箱和Matlab第三方遗传算法工具箱Gaot、gatbx、GEATbx,学习成本低。
Geatpy支持二进制/格雷码编码种群、实数值种群、整数值种群、排列编码种群。支持轮盘赌选择、随机抽样选择、锦标赛选择。提供单点交叉、两点交叉、洗牌交叉、部分匹配交叉(PMX)、线性重组、离散重组、中间重组等重组算子。提供简单离散变异、实数值变异、整数值变异、互换变异等变异算子。支持随机重插入、精英重插入。支持awGA、rwGA、nsga2、快速非支配排序等多目标优化的库函数、提供进化算法框架下的常用进化算法模板等。

""" main.py """import numpy as np
from keras.engine.saving import load_model
from sklearn import preprocessing
import geatpy as ga# 定义目标函数
def aimfuc(variables,LegV):#模型路径path = "/home/lyw/桌面/workworkworkworkworkworkwork/GDS_SZ2/saved_models/B_chiller_power"#加载模型model = load_model(path + '-keras')#模型预处理scaler = preprocessing.MinMaxScaler()train_data = scaler.fit_transform(variables)#模型预测pred = model.predict(train_data)# 约束条件x1 = variables[:, [0]] # get x1x2 = variables[:, [1]] # get x2idx1 = np.where(x1 + x2 > 40)[0]exIdx = np.unique(np.hstack([idx1])) # 得到非可行解个体的下标LegV[exIdx] = 0 # 标记非可行解在种群可行性列向量中对应的值为0(0表示非可行解,1表示可行解)return [pred,LegV]def punishing(LegV, FitnV):FitnV[np.where(LegV == 0)[0]] = 0 # 惩罚非可行解个体的适应度return FitnVif __name__ == "__main__":AIM_M = __import__('main') # 获取目标函数地址PUN_M = __import__('main') # 获取罚函数地址# 变量设置x1 = [20, 25]                        # 自变量t的范围x2 = [16, 20]                        # 自变量wet_temp的范围x3 = [-5,5]                         # 自变量_T_CHW_diff的范围x4 = [50,55]                         # 自变量_CHW的范围x5 = [5,10]                          # 自变量_COW的范围x6 = [435,440]                        # 自变量_WTF1的范围x7 = [5,10]                           # 自变量_WTF3的范围x8 = [35,40]                           # 自变量_F_fan的范围x9 = [40,43]                           # 自变量__F_pump的范围b1 = [1, 1]                          # 自变量1-9是否包含下界b2 = [1, 1]b3 = [1, 1]b4 = [1, 1]b5 = [1, 1]b6 = [1, 1]b7 = [1, 1]b8 = [1, 1]b9 = [1, 1]ranges = np.vstack([x1, x2,x3,x4,x5,x6,x7,x8,x9]).T       # 生成自变量的范围矩阵borders = np.vstack([b1, b2,b3,b4,b5,b6,b7,b8,b9]).T      # 生成自变量的边界矩阵FieldDR = ga.crtfld(ranges, borders) # 生成区域描述器# 调用Geatpy内置进化算法模板[pop_trace, var_trace, times] = ga.sga_new_real_templet(AIM_M, 'aimfuc', PUN_M, 'punishing', FieldDR, problem = 'I', maxormin = 1, MAXGEN = 10, NIND = 1000, SUBPOP = 1, GGAP = 0.9, selectStyle = 'tour', recombinStyle = 'xovdp', recopt = 0.9, pm = 0.3, distribute = True, drawing = 1)

利用geatpy 改写比较困难,但利用geatpy提供的算法框架改写就很便利,只需要对目标函数进行更好,例如本文直接利用 ga.sga_new_real_templet模板。
同时geatpy提供的模板多达十几种,使用说明网址:https://github.com/geatpy-dev/geatpy/tree/master/geatpy/source-code/templets

最后优化结果如下:

1、最优的目标函数值为:107.97457885742188
最优的控制变量值为:
21.0
16.0
5.0
50.0
10.0
435.0
10.0
39.0
41.0
有效进化代数:100
最优的一代是第 30 代
时间已过 1657.3300688266754 秒

2、最优的目标函数值为:107.97457885742188
最优的控制变量值为:
21.0
16.0
5.0
50.0
10.0
435.0
10.0
39.0
41.0
有效进化代数:50
最优的一代是第 44 代
时间已过 365.3190333843231 秒

3、最优的目标函数值为:107.97457885742188
最优的控制变量值为:
21.0
16.0
5.0
50.0
10.0
435.0
10.0
39.0
41.0
有效进化代数:50
最优的一代是第 22 代
时间已过 375.3887228965759 秒
4、最优的目标函数值为:108.38638305664062
最优的控制变量值为:
21.0
16.0
5.0
50.0

谢谢大家的观看~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~进来了就点个赞呗~~~~~~~~`

利用机器学习拟合复杂函数,并利用遗传算法求最优解相关推荐

  1. python求函数极值_python 遗传算法求函数极值的实现代码

    废话不多说,大家直接看代码吧! """遗传算法实现求函数极大值-Zjh""" import numpy as np import rando ...

  2. python画抛物线_在python中利用最小二乘拟合二次抛物线函数的方法

    1.最小二乘也可以拟合二次函数 我们都知道用最小二乘拟合线性函数没有问题,那么能不能拟合二次函数甚至更高次的函数呢?答案当然是可以的.下面我们就来试试用最小二乘来拟合抛物线形状的的图像. 对于二次函数 ...

  3. 利用keras搭建神经网络拟合非线性函数

    神经网络有着一个非常奇妙的结构,它的数学原理虽然相对简单,但是能做的事情却不少,数学家已经证明,具有2层(输入层除外)和非线性激活函数的神经网络,只要在这些层中有足够多的神经元,就可以近似任何函数(严 ...

  4. Python 3 利用机器学习模型 进行手写体数字检测

    0.引言 介绍了如何生成手写体数字的数据,提取特征,借助 sklearn 机器学习模型建模,进行识别手写体数字 1-9 模型的建立和测试. 用到的几种模型: 1. LR,Logistic Regres ...

  5. 搜索引擎利用机器学习排序

    搜索引擎利用机器学习排序 标签: 搜索引擎机器学习排序 2013-07-29 20:52 1414人阅读 评论(0) 收藏 举报 本文章已收录于: 分类: 机器学习与数据挖掘(24) 作者同类文章X ...

  6. 利用机器学习分析脑电数据(原理分析+示例代码+快速上手)

    由于本人对于脑机接口以及脑电技术的极度爱好(其实目的是:是把U盘插到大脑里,然后就不用学习了哈哈哈哈),近几月看了较多这方面的内容,变打算写下博客总结分析一下. 目录 一.  机器学习分析简介 二.机 ...

  7. 利用机器学习进行情感分析

    利用机器学习进行情感分析 1.导入电影评论数据集 此电影评论数据集包含有50000条评论信息,其中已经标记评论信息在6颗星以上的为positive, 评论信息在5颗星以下的为negative. 原始数 ...

  8. python机器学习手写字体识别_Python 3 利用机器学习模型 进行手写体数字检测

    0.引言 介绍了如何生成手写体数字的数据,提取特征,借助 sklearn 机器学习模型建模,进行识别手写体数字 1-9 模型的建立和测试. 用到的几种模型: 1. LR,Logistic Regres ...

  9. 干货:如何利用机器学习实现有噪声标签样本分类模型?

    在工业生产活动中,有一类常见机器学习问题,就是如何基于有噪声样本标签训练模型,以进行故障检测和分类. 先解释下什么是有噪声样本标签,它指的是训练模型用的样本标签并非完全准确,部分样本的标签有标错的情况 ...

最新文章

  1. Win7双击文件夹总是新窗口打开的解决方法
  2. Day 05 名人能树立好榜样吗
  3. swift. 扩展类添加属性_swift中的声明关键字详解
  4. [论文阅读] (03) 清华张超老师 - GreyOne: Discover Vulnerabilities with Data Flow Sensitive Fuzzing
  5. 计算机基础知识判断题答案,计算机基础知识试题及答案判断题模板.docx
  6. 实战:Windows Server 2008 活动目录 传送和争夺操作主控角色
  7. leetcode 761. Special Binary String
  8. 2.RabbitMQ实战 --- 理解消息通信
  9. nexus和maven
  10. WebSocket(1)---WebSocket介绍
  11. 浏览器地址栏和标题栏显示的小图标
  12. Centos7安装nxlog-2.9
  13. 这几种方法帮你快速实现回到页面顶部
  14. 数学史思维导图_高中数学课堂教学中思维导图的制作运用
  15. 魅族计算机软件不见了,任务栏不见了
  16. java qq协议 php_Java基于JavaMail实现向QQ邮箱发送邮件
  17. 沃趣发布QData T5 性能价格均碾压Exadata
  18. 有了这些网站,让你有看不完的好电影!
  19. 局域网使用teamviewer
  20. Python编程快速上手让繁琐工作自动化中文高清完整版PDF带书签

热门文章

  1. Cloudera CCA131培训考试要点
  2. ubuntu18.04安装linux版的有道词典
  3. python用turtle画樱花代码_python3实现用turtle模块画一棵随机樱花树
  4. AD16_PCB电路板各个分层的用途
  5. 公众号转化率太低怎么办?教你几招
  6. 智能车载终端解决方案,聪明的车驶入智慧公交时代
  7. 我的世界教育版edu教育邮箱minecraft education免费申请下载教程
  8. 地理信息系统有哪些SCI期刊推荐? - 易智编译EaseEditing
  9. Robust image stitching with multiple registrations之浅见
  10. 软件License认证设计思路