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

2024-06-02 20:20

本文主要是介绍遥感之特征选择-禁忌搜索算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

禁忌搜索算法(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.chinasem.cn/article/1024990

相关文章

【ML--05】第五课 如何做特征工程和特征选择

一、如何做特征工程? 1.排序特征:基于7W原始数据,对数值特征排序,得到1045维排序特征 2. 离散特征:将排序特征区间化(等值区间化、等量区间化),比如采用等量区间化为1-10,得到1045维离散特征 3. 计数特征:统计每一行中,离散特征1-10的个数,得到10维计数特征 4. 类别特征编码:将93维类别特征用one-hot编码 5. 交叉特征:特征之间两两融合,x+y、x-y、

结合sklearn说一下特征选择

特征选择(排序)对于数据科学家、机器学习从业者来说非常重要。好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点、底层结构,这对进一步改善模型、算法都有着重要作用。 特征选择主要有两个功能: 减少特征数量、降维,使模型泛化能力更强,减少过拟合增强对特征和特征值之间的理解 拿到数据集,一个特征选择方法,往往很难同时完成这两个目的。通常情况下,我们经常不管三七二十一,选择一种自己最熟悉或者

特征离散和特征选择

连续特征的离散化:在什么情况下将连续的特征离散化之后可以获得更好的效果? Q:CTR预估,发现CTR预估一般都是用LR,而且特征都是离散的。为什么一定要用离散特征呢?这样做的好处在哪里? A: 在工业界,很少直接将连续值作为逻辑回归模型的特征输入,而是将连续特征离散化为一系列0、1特征交给逻辑回归模型,这样做的优势有以下几点: 0、 离散特征的增加和减少都很容易,易于模型的快速迭代。(离散

特征选择错误:The classifier does not expose coef_ or feature_importances_ attributes

在利用RFE进行特征筛选的时候出现问题,源代码如下: from sklearn.svm import SVRmodel_SVR = SVR(C=1.0, cache_size=200, coef0=0.0, degree=3, epsilon=0.1, gamma='auto',kernel='rbf', max_iter=-1, shrinking=True, tol=0.001, verb

算法-搜索算法:二分查找(Binary Search)【前置条件:待查数据集必须是有序结构,可以右重复元素】【时间复杂度:O(logn)】

搜索:是在一个项目集合中找到一个特定项目的算法过程。搜索通常的答案是真的或假的,因为该项目是否存在。 搜索的几种常见方法:顺序/线性查找、二分法查找、二叉树查找、哈希查找 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;缺点是要求待查表: 必须采用顺序存储结构;必须按关键字大小有序排列;插入删除困难; 二分查找/折半查找方法适用于不经常变动而查找频繁的有序列表: 首先,假设

旋转排序:搜索算法

搜索旋转排序数组的算法设计 引言 在计算机科学的世界中,二分搜索算法被广泛认为是处理已排序数组查找任务的高效工具。 它通过不断将搜索范围缩小一半的方式,快速定位到所需元素的位置,这种方法的时间复杂度仅为O(log n),使得它在处理大型数据集时表现出色。 然而,这种传统方法面临一个显著的挑战:当数组经历旋转后,原有的排序顺序被打乱,二分搜索的效率和有效性便会大打折扣。 为了解决旋转排序数

【智能算法应用】基于融合改进A星-麻雀搜索算法求解六边形栅格地图路径规划

目录 1.算法原理2.结果展示3.参考文献4.代码获取 1.算法原理 【智能算法】麻雀搜索算法(SSA)原理及实现 六边形栅格地图 分析一下地图: 六边形栅格地图上移动可以看做6领域运动,偶数列与奇数列移动方式有所差异,将六边形栅格地图与二维栅格地图做映射可以发现: 偶数列移动方式:上、下、左、右、左下、右下奇数列移动方式:上、下、左、右、左上、右上 因此需要对基础

【递归深搜之记忆化搜索算法】

1. 斐波那契数 解法一:递归 class Solution {public:int fib(int n) {return dfs(n);}int dfs(int n){if(n == 0 || n == 1)return n;return dfs(n - 1) + dfs(n - 2);}}; 解法二:记忆化搜索 class Solution {int nums[31];

遥感多模态基础大模型汇总-实时更新

本文内容来自下面链接,考虑到很多同学登录不了,故在此平台进行分享。 遥感基础大模型 Table of Contents ModelsRemote Sensing Vision Foundation Models 遥感视觉基础模型Remote Sensing Vision-Language Foundation Models 遥感视觉语言基础模型Remote Sensing Generative

智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序(XGBoost分类器)

智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序(XGBoost分类器) 文章目录 一、基本原理鲸鱼智能优化特征选择流程 二、实验结果三、核心代码四、代码获取五、总结 智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序(XGBoost分类器) 一、基本原理 当然,这里是鲸鱼智能优化算法(WOA)与XGBoost分类器结