遥感之特征选择-禁忌搜索算法

各类智能优化算法其主要区别在于算法的运行规则不同,比如常用的遗传算法,其规则就是变异,交叉和选择等,各种不同的变体大多是在框架内的实现细节不同,而本文中的禁忌算法也是如此,其算法框架如下进行介绍。
智能优化算法和其他算法的最大不同在于,其没有太高深的数学理论和公式,主要是基于一种设定规则运行,其规则的设置背后有优美的哲学味道,所以它能有效解决一些问题,而同时不少人对比表示怀疑的态度,只有当真正的跑一遍代码,看看效果,才能对背后的思想有所领悟。
一言以蔽之,智能优化算法,是简洁,优美和有效的。

禁忌搜索算法(Tabu Search,TS)是一种基于局部搜索的启发式算法,它通过记录搜索历史和禁止重复访问已访问过的局部最优解,来跳出局部最优,从而找到全局最优解。它模仿了人类行为中的“记忆”和“遗忘”机制,是一种简单而有效的全局优化方法。

禁忌搜索算法的原理

禁忌搜索算法的核心思想是“禁止重复”和“记忆”。它通过以下方式实现:
禁忌表:记录最近访问过的局部最优解或其状态,以及相应的禁忌长度。
搜索方向:在当前解的邻域中搜索候选解,并根据评价函数选择最好的解。
禁忌更新:将当前解或其状态添加到禁忌表中,并设置禁忌长度。
禁忌解除:当候选解被禁忌时,根据特赦规则决定是否允许访问该解。
搜索终止:达到最大迭代次数或找到全局最优解时,算法终止。
禁忌搜索算法的步骤
初始化:设置初始解,并计算其目标函数值。
搜索:在当前解的邻域中搜索候选解,并根据评价函数选择最好的解。
更新禁忌表:将当前解或其状态添加到禁忌表中,并设置禁忌长度。
禁忌解除:如果候选解被禁忌,则根据特赦规则决定是否允许访问该解。
搜索终止:达到最大迭代次数或找到全局最优解时,算法终止。
其算法流程图如下所示;
在这里插入图片描述

禁忌搜索算法的优缺点

优点:

  • 跳出局部最优:通过禁忌表和特赦规则,能够有效跳出局部最优,寻找全局最优解。
  • 全局搜索能力:具有全局搜索能力,能够搜索整个解空间。
  • 易于实现:算法结构简单,易于实现。
  • 参数选择灵活:禁忌表大小、禁忌长度、特赦规则等参数可以根据问题进行调整。
    缺点:
  • 计算复杂度:禁忌表需要存储搜索历史,可能会增加计算复杂度。
  • 参数选择困难:参数选择对算法性能影响较大,需要根据问题进行调整。
  • 无法保证找到全局最优解:虽然能够有效跳出局部最优,但无法保证找到全局最优解。

代码

在遥感高光谱领域中会经常遇到波段选择的问题,基于此,利用禁忌搜索算法完成特征选择的案例,代码可以直接运行。
代码中对于上述提到的步骤的每个环节只是用简单的方式进行实现,比如初始化这步,在实际中通常对高光谱波段之间的相关性进行研究,划分不同的,在每个块中选择一些波段作为初始化的解,以及对于候选解是如何选择的,是否需要进一步根据经验设定规则等,在实际中需要在此代码基础上进一步完善即可。

import numpy as np
import random
class TabuSearchFeatureSelection:'''代码说明:1. `TabuSearchFeatureSelection` 类定义了禁忌搜索算法,包括初始化、适应度函数、获取邻居、更新禁忌表、选择最佳邻居和选择特征等方法。2. `initialize_population` 方法初始化当前特征集为所有特征。3. `get_neighbors` 方法获取当前特征的邻居,包括删除一个特征和添加一个特征两种情况。4. `update_tabu_list` 方法更新禁忌表,将特征集添加到禁忌表。5. `select_best_neighbor` 方法从邻居中选择最佳特征集,优先选择不在禁忌表中的特征集,并选择适应度值最高的特征集。6. `select_features` 方法进行特征选择,循环迭代更新当前特征集,直到没有更好的邻居或达到最大迭代次数。7. `best_features` 和 `best_score` 分别存储最佳特征集和最佳得分。'''def __init__(self, n_iterations, tabu_size, feature_set, data, labels, model):"""禁忌搜索算法初始化:param n_iterations: 迭代次数:param tabu_size: 禁忌表大小:param feature_set: 特征集:param data: 数据集:param labels: 标签:param model: 机器学习模型"""self.n_iterations = n_iterationsself.tabu_size = tabu_sizeself.feature_set = feature_setself.data = dataself.labels = labelsself.model = modelself.best_score = float('-inf')self.best_features = Noneself.tabu_list = []def fitness(self, features):"""适应度函数,计算模型在当前特征集上的性能:param features: 当前特征集:return: 适应度值"""X_train = self.data[:, features]clf = self.model.fit(X_train, self.labels)score = clf.score(X_train, self.labels)return scoredef get_neighbors(self, features):"""获取当前特征的邻居:param features: 当前特征集:return: 邻居特征集列表"""neighbors = []for i in range(len(self.feature_set)):if i in features:new_features = np.array(features)new_features = np.delete(new_features, np.where(new_features == i)[0][0])neighbors.append(new_features)else:new_features = np.array(features)new_features = np.append(new_features, i)neighbors.append(new_features)return neighborsdef update_tabu_list(self, features):"""更新禁忌表"""# 将特征集添加到禁忌表if len(self.tabu_list) >= self.tabu_size:self.tabu_list.pop(0)self.tabu_list.append(tuple(features))def select_best_neighbor(self, neighbors):"""从邻居中选择最佳特征集:param neighbors: 邻居特征集列表:return: 最佳特征集"""best_score = float('-inf')best_features = Nonefor neighbor in neighbors:if tuple(neighbor) in self.tabu_list:continuescore = self.fitness(neighbor)if score > best_score:best_score = scorebest_features = neighborreturn best_featuresdef select_features(self):"""选择特征"""# 初始化当前特征集current_features = np.arange(self.data.shape[1])for _ in range(self.n_iterations):# 获取邻居neighbors = self.get_neighbors(current_features)# 选择最佳邻居best_neighbor = self.select_best_neighbor(neighbors)# 如果没有更好的邻居,则终止搜索if best_neighbor is None:break# 更新当前特征集current_features = best_neighbor# 更新禁忌表self.update_tabu_list(current_features)# 更新最佳解if self.fitness(current_features) > self.best_score:self.best_score = self.fitness(current_features)self.best_features = current_featuresreturn self.best_features, self.best_score
# 示例用法
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
# 加载数据集
data = load_iris().data
labels = load_iris().target
# 初始化模型
model = LogisticRegression(solver='newton-cg')
# 初始化禁忌搜索算法
tabu_search = TabuSearchFeatureSelection(n_iterations=2, tabu_size=1, feature_set=np.arange(data.shape[1]), data=data, labels=labels, model=model)
# 选择特征
best_features, best_score = tabu_search.select_features()
print("最佳特征:", best_features)
print("最佳得分:", best_score)

总结

此类算法,了解其规则即可,在规则之内可以扩展展开。

欢迎关注专栏:智能优化算法专栏

欢迎点赞,收藏,关注,支持小生,打造一个好的遥感领域知识分享专栏。
同时欢迎私信咨询讨论学习,咨询讨论的方向不限于:地物分类/语义分割(如水体,云,建筑物,耕地,冬小麦等各种地物类型的提取),变化检测,夜光遥感数据处理,目标检测,图像处理(几何矫正,辐射矫正(大气校正),图像去噪等),遥感时空融合,定量遥感(土壤盐渍化/水质参数反演/气溶胶反演/森林参数(生物量,植被覆盖度,植被生产力等)/地表温度/地表反射率等反演)以及高光谱数据处理等领域以及深度学习,机器学习等技术算法讨论,以及相关实验指导/论文指导等多方面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/846882.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 语法好乱:深度解析与应对策略

Python 语法好乱:深度解析与应对策略 Python,作为一门简洁明了的编程语言,广受编程初学者的喜爱。然而,随着学习的深入,许多学习者会发现Python的语法似乎并不像初看起来那么简单,甚至有时会感到“好乱”。…

C#面:解释什么是扩展方法

C#中的扩展方法(Extension Methods)是一种特殊的静态方法,它允许我们向现有的类或接口添加新的方法,而无需修改原始类的定义或创建子类。通过扩展方法,我们可以在不改变已有代码的情况下,为现有类型添加新的…

PostgreSQL 小课持续更新中-20240603

PostgreSQL 小课持续更新中 基于 PostgreSQL 16.x 版本。目前的进度如下: (venv311) ➜ mypostgres git:(dev) ✗ sh scripts/word_statistics_pg_style.sh Filename | Chinese | English | Total ------…

Inode节点

今天给大家分享的是使用脚本快速消耗inode,用于测试inode用完以后创建文件出现的情况。本文一共提供了两个脚本供大家参考,使用的时候任选其一,也欢迎大家在评论区里面提供一些修改的建议。 #!/bin/bash# 获取指定分区的inode剩余数量 get_i…

丰盘v24.5集成OnlyOffice 7.5版本,支持子管理员高级特性

五一劳动节刚过,我们的开发小伙伴上线发布了v24.5版本,支持原生集成OnlyOffice 7.5的套件版本,无需管理员手工配置密钥证书等繁琐操作,对Word、PPT和Excel文件有了更强的兼容性和稳定性,例如当文件里包含Visio图像时&a…

C之动态内存管理(动态内存开辟与调整等)

目录 1.为什么要有动态内存分配 2.malloc、calloc、realloc和free malloc: calloc: realloc: free: 3.常见的动态内存的错误 3.1:对NULL指针的解引用操作 3.2:对动态开辟空间的越界访问 3.3&…

长城电脑如何恢复删除文件?盘点几个实用方法

咨询:急求帮助!我不慎在长城电脑上删除了文件,还有机会恢复吗?一个疏忽,就把一份至关重要的工作文件给删掉了!请大家快快伸出援手,帮我找回这份文件吧! 在使用长城电脑的过程中&…

SpringBoot基于OpenAPI3的接口文档管理快速集成和使用

你好,这里是codetrend专栏“SpringCloud2023实战”。 本文主要简单介绍SpringCloud2023中进行接口文档管理,方便前后端开发和文档维护。文档管理工具基于开源的knife4j封装的openapi3。 前言 OpenAPI 3.0(前身为Swagger)是一种…

Linux_应用篇(11) 线程

上一章,学习了进程相关的知识内容, 对进程有了一个比较全面的认识和理解; 本章开始, 将学习 Linux应用编程中非常重要的编程技巧---线程(Thread) ;与进程类似,线程是允许应用程序并发…

GaussDB数据库如何创建修改数据库和数据表

目录 一、背景 二、创建数据库和数据表 1. 创建数据库 2.创建数据表 三、修改表结构 1. 添加列 2. 修改列 3. 删除列 四、添加约束 1. 添加主键约束 2. 添加外键约束 3.添加唯一性约束 五、示例代码 -- 创建数据库 -- 使用新创建的数据库 -- 创建 department 表…

强化运维管理:多维度资源分组与全面监控

在当今高度信息化的时代,数据中心的运维管理显得尤为重要。为了确保各类资源能够高效、稳定地运行,一个强大的运维管理系统是必不可少的。本文将从资源分组管理、网络设备及链路监控、操作系统监控、数据库监控、虚拟化监控、安全监测以及业务系统监测等…

发送Http请求的两种方式

说明:在项目中,我们有时会需要调用第三方接口,获取调用结果,来实现自己的业务逻辑。调用第三方接口,通常是双方确定好,由对方开放一个接口,需要我们根据他们提供的接口文档,组装Http…

MySQL 使用方法以及教程

一、引言 MySQL是一个流行的开源关系型数据库管理系统(RDBMS),广泛应用于Web开发、数据分析等领域。它提供了高效、稳定的数据存储和查询功能。同时,Python作为一种强大的编程语言,也提供了多种与MySQL交互的库&#…

Ubuntu 24.04 LTS 安装Docker

1 更新软件包索引: sudo apt-get update 2 安装必要的软件包,以允许apt通过HTTPS使用仓库: sudo apt-get install apt-transport-https ca-certificates curl software-properties-common 3 添加Docker的官方GPG密钥: curl -fs…

算法金 | 你真的完全理解 Logistic 回归算法了吗

大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 今日 178/10000 1. 引言 吴恩达:机器学习的六个核心算法!, 通透!!十大回…

Python专为开发和部署数据驱动的应用程序库之taipy使用详解

概要 Taipy 是一个强大的 Python 库,专为开发和部署数据驱动的应用程序而设计。它通过提供一套丰富的工具和组件,使开发者能够快速构建和维护复杂的业务逻辑和数据交互界面。无论是金融分析、供应链管理还是任何需要高度数据交互的应用,taipy 都能提供高效的解决方案。 安装…

Orange AIpro开箱上手

0.介绍 首先感谢官方给到机会,有幸参加这次活动。 OrangePi AIpro(8T)采用昇腾AI技术路线,具体为4核64位处理器AI处理器,集成图形处理器,支持8TOPS AI算力,拥有8GB/16GB LPDDR4X,可以外接32GB/64GB/128GB/2…

js常用的数组方法 js常用的字符串方法

数组方法: 1. reverse :将数组中元素的位置颠倒,并返回该数组。该方法会改变原数组; 2. sort : 用(原地算法)对数组的元素进行排序,并返回数组。 1. 第一个参数是要排序的数组或范围。 2. 第二个参数是排序依据,即按照数组中的第几行或第几列进行排序。 3. 第三…

小程序抓包详细教程

小程序抓包详细教程 前言:关于小程序抓包一直想写出一个比较详细的教程 实验设备: ​ 微信: https://windows.weixin.qq.com/?langzh_CN ​ Proxifier:https://www.proxifier.com/download/ (需要挂梯子访问下载) ​ burpsuite&#xff…

[每日一题]170:分糖果 II

文章目录 题目描述题解思路 题目描述 排排坐,分糖果。 我们买了一些糖果 candies,打算把它们分给排好队的 n num_people 个小朋友。 给第一个小朋友 1 颗糖果,第二个小朋友 2 颗,依此类推,直到给最后一个小朋友 n …