前言

采用麻雀算法SSA优化SVR,寻找最佳参数

程序

麻雀算法SSA

class SSA():def __init__(self, func, n_dim=None, pop_size=20, max_iter=50, lb=-512, ub=512, verbose=False):self.func = funcself.n_dim = n_dim  # dimension of particles, which is the number of variables of funcself.pop = pop_size  # number of particlesP_percent = 0.2  # # 生产者的人口规模占总人口规模的20%D_percent = 0.1  # 预警者的人口规模占总人口规模的10%self.pNum = round(self.pop * P_percent)  # 生产者的人口规模占总人口规模的20%self.warn = round(self.pop * D_percent)  # 预警者的人口规模占总人口规模的10%self.max_iter = max_iter  # max iterself.verbose = verbose  # print the result of each iter or notself.lb, self.ub = np.array(lb) * np.ones(self.n_dim), np.array(ub) * np.ones(self.n_dim)assert self.n_dim == len(self.lb) == len(self.ub), 'dim == len(lb) == len(ub) is not True'assert np.all(self.ub > self.lb), 'upper-bound must be greater than lower-bound'self.X = np.random.uniform(low=self.lb, high=self.ub, size=(self.pop, self.n_dim))self.Y = [self.func(self.X[i]) for i in range(len(self.X))]  # y = f(x) for all particlesself.pbest_x = self.X.copy()  # personal best location of every particle in historyself.pbest_y = [np.inf for i in range(self.pop)]  # best image of every particle in historyself.gbest_x = self.pbest_x.mean(axis=0).reshape(1, -1)  # global best location for all particlesself.gbest_y = np.inf  # global best y for all particlesself.gbest_y_hist = []  # gbest_y of every iterationself.update_pbest()self.update_gbest()## record verbose valuesself.record_mode = Falseself.record_value = {'X': [], 'V': [], 'Y': []}self.best_x, self.best_y = self.gbest_x, self.gbest_y  # history reasons, will be deprecatedself.idx_max = 0self.x_max = self.X[self.idx_max, :]self.y_max = self.Y[self.idx_max]def cal_y(self, start, end):# calculate y for every x in Xfor i in range(start, end):self.Y[i] = self.func(self.X[i])# return self.Ydef update_pbest(self):'''personal best'''for i in range(len(self.Y)):if self.pbest_y[i] > self.Y[i]:self.pbest_x[i] = self.X[i]self.pbest_y[i] = self.Y[i]def update_gbest(self):idx_min = self.pbest_y.index(min(self.pbest_y))if self.gbest_y > self.pbest_y[idx_min]:self.gbest_x = self.X[idx_min, :].copy()self.gbest_y = self.pbest_y[idx_min]def find_worst(self):self.idx_max = self.Y.index(max(self.Y))self.x_max = self.X[self.idx_max, :]self.y_max = self.Y[self.idx_max]def update_finder(self):r2 = np.random.rand(1)  # 预警值self.idx = sorted(enumerate(self.Y), key=lambda x: x[1])self.idx = [self.idx[i][0] for i in range(len(self.idx))]# 这一部位为发现者(探索者)的位置更新if r2 < 0.8:  # 预警值较小,说明没有捕食者出现for i in range(self.pNum):r1 = np.random.rand(1)self.X[self.idx[i], :] = self.X[self.idx[i], :] * np.exp(-(i) / (r1 * self.max_iter))  # 对自变量做一个随机变换self.X = np.clip(self.X, self.lb, self.ub)  # 对超过边界的变量进行去除# X[idx[i], :] = Bounds(X[idx[i], :], lb, ub)  # 对超过边界的变量进行去除# fit[sortIndex[0, i], 0] = func(X[sortIndex[0, i], :])  # 算新的适应度值elif r2 >= 0.8:  # 预警值较大,说明有捕食者出现威胁到了种群的安全,需要去其它地方觅食for i in range(self.pNum):Q = np.random.rand(1)  # 也可以替换成  np.random.normal(loc=0, scale=1.0, size=1)self.X[self.idx[i], :] = self.X[self.idx[i], :] + Q * np.ones((1, self.n_dim))  # Q是服从正态分布的随机数。L表示一个1×d的矩阵self.X = np.clip(self.X, self.lb, self.ub)  # 对超过边界的变量进行去除# X[idx[i], :] = Bounds(X[sortIndex[0, i], :], lb, ub)# fit[sortIndex[0, i], 0] = func(X[sortIndex[0, i], :])self.cal_y(0, self.pNum)def update_follower(self):#  这一部位为加入者(追随者)的位置更新for ii in range(self.pop - self.pNum):i = ii + self.pNumA = np.floor(np.random.rand(1, self.n_dim) * 2) * 2 - 1best_idx = self.Y[0:self.pNum].index(min(self.Y[0:self.pNum]))bestXX = self.X[best_idx, :]if i > self.pop / 2:Q = np.random.rand(1)self.X[self.idx[i], :] = Q * np.exp((self.x_max - self.X[self.idx[i], :]) / np.square(i))else:self.X[self.idx[i], :] = bestXX + np.dot(np.abs(self.X[self.idx[i], :] - bestXX),1 / (A.T * np.dot(A, A.T))) * np.ones((1, self.n_dim))self.X = np.clip(self.X, self.lb, self.ub)  # 对超过边界的变量进行去除# X[self.idx[i],:] = Bounds(X[self.idx[i],lb,ub)# fit[self.idx[i],0] = func(X[self.idx[i], :])self.cal_y(self.pNum, self.pop)def detect(self):arrc = np.arange(self.pop)c = np.random.permutation(arrc)  # 随机排列序列b = [self.idx[i] for i in c[0: self.warn]]e = 10e-10for j in range(len(b)):if self.Y[b[j]] > self.gbest_y:self.X[b[j], :] = self.gbest_y + np.random.rand(1, self.n_dim) * np.abs(self.X[b[j], :] - self.gbest_y)else:self.X[b[j], :] = self.X[b[j], :] + (2 * np.random.rand(1) - 1) * np.abs(self.X[b[j], :] - self.x_max) / (self.func(self.X[b[j]]) - self.y_max + e)# X[sortIndex[0, b[j]], :] = Bounds(X[sortIndex[0, b[j]], :], lb, ub)# fit[sortIndex[0, b[j]], 0] = func(X[sortIndex[0, b[j]]])self.X = np.clip(self.X, self.lb, self.ub)  # 对超过边界的变量进行去除self.Y[b[j]] = self.func(self.X[b[j]])def run(self, max_iter=None):self.max_iter = max_iter or self.max_iterfor iter_num in range(self.max_iter):self.update_finder()  # 更新发现者位置self.find_worst()  # 取出最大的适应度值和最差适应度的Xself.update_follower()  # 更新跟随着位置self.update_pbest()self.update_gbest()self.detect()self.update_pbest()self.update_gbest()self.gbest_y_hist.append(self.gbest_y)return self.best_x, self.best_y

SVR

def build_model(C, gamma):model1 = SVR(kernel='rbf',C=C,gamma=gamma)  return model1

优化

if __name__ == '__main__':'''SVR:rbfC,gamma'''UP = [1e2, 0.02]DOWN = [1e1,0.01]UP = [1e2, 0.02]DOWN = [1e1,0.01]# 开始优化print("=============开始优化==============\n")ssa = SSA(training, n_dim=2, pop_size=20, max_iter=128, lb=DOWN, ub = UP)ssa.run()print("=============最优参数==============\n")print('best_params is ', ssa.gbest_x)print('best_precision is', 1 - ssa.gbest_y)# 训练模型  使用ssa找到的最好的神经元个数C = int(ssa.gbest_x[0])gamma = round(ssa.gbest_x[1],3)X_train, y_train, X_test, y_test = process_data()model = build_model(C, gamma)history1 = model.fit(X_train, y_train)# 测试集预测y_score = model.predict(X_test)# 反标准化数据 --- 目的是保证MAE的准确性# print(f"y_score:{y_score}\n")# print("y_score:\n",y_score.reshape(-1, 2))# print(f"y_test:{y_test}\n")# print("y_test:\n",y_test.reshape(-1, 2))y_score = scaler.inverse_transform(y_score.reshape(-1, 1))y_test = scaler.inverse_transform(y_test.reshape(-1, 1))import mathprint("==========evaluation==============\n")MAE = mean_absolute_error(y_test, y_score)print('MAE: %.4f ' % MAE)RMSE = math.sqrt(mean_squared_error(y_test, y_score))print('RMSE: %.4f ' % (RMSE))

备注

需要源代码和数据集,或者想要沟通交流,请私聊,谢谢.

麻雀算法SSA优化SVR相关推荐

  1. matlab麻雀搜索算法(SSA)优化BP神经网络,权值和阈

    matlab麻雀搜索算法(SSA)优化BP神经网络,权值和阈值,一个压缩包共三个文件,包括有数据和代码,放入自己的数据即可得出仿真图形 ID:296679013048817MATLAB

  2. 麻雀算法SSA,优化VMD,适应度函数为最小包络熵,包含MATLAB源代码,直接复制粘贴!

    首先声明,本篇文章直接包含所有matlab源代码,直接复制粘贴即可运行,全部都是源代码,可以自己更改的源代码!(不是.p文件!!!,浅浅痛斥一下很多文章为了盈利,还给程序加密!谴责!!)都是学生时代走 ...

  3. 混合正弦余弦算法和Lévy飞行的麻雀算法

    文章目录 一.理论基础 1.基本麻雀搜索算法 2.混合正弦余弦算法和Lévy飞行的麻雀算法(ISSA) (1)融合正弦余弦算法(SCA)思想 (2)Lévy飞行策略 二.ISSA算法流程图 三.算法性 ...

  4. 基于麻雀算法的无人机航迹规划 - 附代码

    基于麻雀算法的无人机航迹规划 文章目录 基于麻雀算法的无人机航迹规划 1.麻雀搜索算法 2.无人机飞行环境建模 3.无人机航迹规划建模 4.实验结果 4.1地图创建 4.2 航迹规划 5.参考文献 6 ...

  5. 基于MATLAB樽海鞘算法SSA(麻雀算法(十一)也简称SSA)的Eggholeer函数优化,测试函数的100种优化方法之十二

    樽海鞘算法优化 Eggholder测试函数 樽海鞘算法SSA(麻雀算法也简称SSA,如果想了解麻雀算法,看方法十一)模拟了樽海鞘的聚集成链的生活习性而提出的优化算法,是近几年刚推出的新算法之一.算法将 ...

  6. SSA麻雀算法优化BP神经网络(SSA-BPNN)回归预测MATLAB代码(有优化前后的对比

    SSA麻雀算法优化BP神经网络(SSA-BPNN)回归预测MATLAB代码(有优化前后的对比) 代码注释清楚. main为运行主程序,可以读取本地EXCEL数据. 很方便,容易上手. (以电厂运行数据 ...

  7. 回归预测 | MATLAB实现SSA-BiLSTM麻雀算法优化双向长短期记忆神经网络多输入单输出

    回归预测 | MATLAB实现SSA-BiLSTM麻雀算法优化双向长短期记忆神经网络多输入单输出 目录 回归预测 | MATLAB实现SSA-BiLSTM麻雀算法优化双向长短期记忆神经网络多输入单输出 ...

  8. 【图像分割】基于麻雀算法优化Kmeans实现图像分割附Matlab代码

    1 内容介绍 提出一种基于K-Means聚类的麻雀算法,该算法利用麻雀算法鲁棒性较强且不易陷入局部最优值的特点,动态的确定了聚类的数目和中心,解决了K-Means聚类初始点选择不稳定的缺陷,在此两种算 ...

  9. 【SSA三维路径规划】基于matlab麻雀算法无人机三维航迹规划【含Matlab源码 301期】

    ⛄一.麻雀算法求解无人机三维路径规划简介 1 引言 随着无人机(Unmanned Aerial Vehicle,UAV)技术的不断发展,国内外学者对于无人机作战应用的研究日益增多.无人机航迹规划是任务 ...

最新文章

  1. 编码,深浅拷贝和文件操作
  2. 所请求vi未加载至服务器内存_linux下tomcat端口请求数太大,导致服务器资源加载过慢的配置优化...
  3. 联发科看上AMD“女友”GF:全新22nm处理器来了
  4. linux的文件 I/O操作
  5. 埃里克贝里奇_9大热门技术的安全隐患
  6. Qt中QString、int、char、QByteArray、std::string【八大转换】
  7. 《斯坦福算法博弈论二十讲》学习笔记(持续更新)
  8. org.apache.commons.fileupload.DiskFileUpload/FileItem
  9. UG NX 12 使用快捷键调整视图方位
  10. 阿里面试算法题(一)
  11. 51nod 1964 陵陵曾玩的数论题
  12. Linux下的C语言编程教程-Chinaitlab制作
  13. 计算机清理垃圾代码,你也可以写代码系列,一键清除系统垃圾文件的代码(超简单)-清除垃圾文件...
  14. 面试 http://mp.weixin.qq.com/s/p5mXVzixSDZZ6o9DpU5Xaw
  15. 手写ButterKnife
  16. 平板系统win10 Android,Pad变PC:将Win10装入Android平板
  17. 【考研经验】2018南开计算机技术(专硕)经验 助你一臂之力
  18. 【备份】git命令行
  19. 【干货】数据产品经理如何快速了解业务
  20. BeanFactory 和 ApplicationContext 两个容器的区别与联系

热门文章

  1. Classical Algorithm--Mobius反演
  2. win10蓝屏代码_?联想电脑蓝屏的解决方法教程
  3. 神经网络控制与matlab仿真,matlab神经网络预测模型
  4. 全息投影技术未来的发展趋势
  5. python爬虫模拟有道翻译
  6. ENVI 5.1设置影像背景值透明显示
  7. Flutter | 和小老弟一起玩转Widget
  8. 【JAVA】学习java 基础知识
  9. Selenium的文件上传和操作Cookie等方法_Sinno_Song_新浪博客
  10. 最通俗的理解什么是冒泡