麻雀算法SSA优化SVR
前言
采用麻雀算法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相关推荐
- matlab麻雀搜索算法(SSA)优化BP神经网络,权值和阈
matlab麻雀搜索算法(SSA)优化BP神经网络,权值和阈值,一个压缩包共三个文件,包括有数据和代码,放入自己的数据即可得出仿真图形 ID:296679013048817MATLAB
- 麻雀算法SSA,优化VMD,适应度函数为最小包络熵,包含MATLAB源代码,直接复制粘贴!
首先声明,本篇文章直接包含所有matlab源代码,直接复制粘贴即可运行,全部都是源代码,可以自己更改的源代码!(不是.p文件!!!,浅浅痛斥一下很多文章为了盈利,还给程序加密!谴责!!)都是学生时代走 ...
- 混合正弦余弦算法和Lévy飞行的麻雀算法
文章目录 一.理论基础 1.基本麻雀搜索算法 2.混合正弦余弦算法和Lévy飞行的麻雀算法(ISSA) (1)融合正弦余弦算法(SCA)思想 (2)Lévy飞行策略 二.ISSA算法流程图 三.算法性 ...
- 基于麻雀算法的无人机航迹规划 - 附代码
基于麻雀算法的无人机航迹规划 文章目录 基于麻雀算法的无人机航迹规划 1.麻雀搜索算法 2.无人机飞行环境建模 3.无人机航迹规划建模 4.实验结果 4.1地图创建 4.2 航迹规划 5.参考文献 6 ...
- 基于MATLAB樽海鞘算法SSA(麻雀算法(十一)也简称SSA)的Eggholeer函数优化,测试函数的100种优化方法之十二
樽海鞘算法优化 Eggholder测试函数 樽海鞘算法SSA(麻雀算法也简称SSA,如果想了解麻雀算法,看方法十一)模拟了樽海鞘的聚集成链的生活习性而提出的优化算法,是近几年刚推出的新算法之一.算法将 ...
- SSA麻雀算法优化BP神经网络(SSA-BPNN)回归预测MATLAB代码(有优化前后的对比
SSA麻雀算法优化BP神经网络(SSA-BPNN)回归预测MATLAB代码(有优化前后的对比) 代码注释清楚. main为运行主程序,可以读取本地EXCEL数据. 很方便,容易上手. (以电厂运行数据 ...
- 回归预测 | MATLAB实现SSA-BiLSTM麻雀算法优化双向长短期记忆神经网络多输入单输出
回归预测 | MATLAB实现SSA-BiLSTM麻雀算法优化双向长短期记忆神经网络多输入单输出 目录 回归预测 | MATLAB实现SSA-BiLSTM麻雀算法优化双向长短期记忆神经网络多输入单输出 ...
- 【图像分割】基于麻雀算法优化Kmeans实现图像分割附Matlab代码
1 内容介绍 提出一种基于K-Means聚类的麻雀算法,该算法利用麻雀算法鲁棒性较强且不易陷入局部最优值的特点,动态的确定了聚类的数目和中心,解决了K-Means聚类初始点选择不稳定的缺陷,在此两种算 ...
- 【SSA三维路径规划】基于matlab麻雀算法无人机三维航迹规划【含Matlab源码 301期】
⛄一.麻雀算法求解无人机三维路径规划简介 1 引言 随着无人机(Unmanned Aerial Vehicle,UAV)技术的不断发展,国内外学者对于无人机作战应用的研究日益增多.无人机航迹规划是任务 ...
最新文章
- 编码,深浅拷贝和文件操作
- 所请求vi未加载至服务器内存_linux下tomcat端口请求数太大,导致服务器资源加载过慢的配置优化...
- 联发科看上AMD“女友”GF:全新22nm处理器来了
- linux的文件 I/O操作
- 埃里克贝里奇_9大热门技术的安全隐患
- Qt中QString、int、char、QByteArray、std::string【八大转换】
- 《斯坦福算法博弈论二十讲》学习笔记(持续更新)
- org.apache.commons.fileupload.DiskFileUpload/FileItem
- UG NX 12 使用快捷键调整视图方位
- 阿里面试算法题(一)
- 51nod 1964 陵陵曾玩的数论题
- Linux下的C语言编程教程-Chinaitlab制作
- 计算机清理垃圾代码,你也可以写代码系列,一键清除系统垃圾文件的代码(超简单)-清除垃圾文件...
- 面试 http://mp.weixin.qq.com/s/p5mXVzixSDZZ6o9DpU5Xaw
- 手写ButterKnife
- 平板系统win10 Android,Pad变PC:将Win10装入Android平板
- 【考研经验】2018南开计算机技术(专硕)经验 助你一臂之力
- 【备份】git命令行
- 【干货】数据产品经理如何快速了解业务
- BeanFactory 和 ApplicationContext 两个容器的区别与联系