人工蜂群算法python_改进的人工蜂群算法解决聚类问题(在Python中的分步实现)...

之前的文章

中,我介绍了如何通过实施名为Artificial Bee Colony(ABC)的群集智能(SI)算法来解决现实世界中的优化问题。

现在是时候让我们掌握一些真实的数据并解释我们如何使用我们的ABC算法的Python实现来执行群集任务。但在此之前,让我们深入了解一下聚类问题。

聚类问题

聚类问题是一个未明确定义的NP难题,其基本思想是在数据中发现隐藏的模式。关于什么是集群没有一个正式的定义,但它与分组元素的想法相关联,以便我们可以区分不同组中的元素。

有不同的算法族以不同的方式定义聚类问题。定义聚类问题的经典方法,在文献中经常见到,是将其减少为一个数学问题,即找到原始数据的k分区。

找到一个集合S的k分区,被定义为找到S的k个子集,它服从两个规则:

这些子集中的任何不同的交集都等于空集合。

所有k 个子集的并集等于S.

基本上,在这个分区聚类过程结束时,我们希望找到原始数据集的不同子集,以这种方式,没有实例将属于多个组。这可以在下面的图像中说明:

左边是原始数据,右边是k = 2的分区数据

k = 2时可以使用质心如何执行数据分区的示例

我们如何拆分数据以执行上图中所示的分区?那么,聚类过程的输出是一组质心。质心基本上是每个组的代表性实体,所以如果我们想要对数据进行k分割,那么我们将有k个 质心。

质心也是由我们的数据定义的搜索空间上的点,并且由于每个质心定义了一个组,每个数据点将被分配到距离它最近的质心。

修改聚类的人工蜂群

那么,现在我们知道什么是聚类问题,我们如何修改原来的ABC算法来执行这样的任务?猜猜看,我们没有!是的,这就是你刚刚阅读的内容,我们根本不需要修改我们的ABC实施。我们唯一要做的就是查看聚类问题并将其转化为优化任务!但我们怎么做到这一点?

正如我们在前面的文章中看到的那样,一个明确定义的优化问题需要一个搜索空间,一个集合的维度输入决策变量和一个目标函数。如果我们将人工菌落中的每只蜜蜂看作是我们聚类问题的整体解决方案,那么每只蜜蜂都可以代表一组完整的候选质心!如果我们工作的一个d维空间,我们要执行的k分区上我们的数据,那么每个蜂将是一个ķ · d维向量!

现在我们已经定义了如何表示我们的输入决策变量,我们只需要弄清楚如何定义我们的搜索空间的边界以及我们的目标函数是什么。

我们的搜索空间的边界很容易,我们可以用[0,1]区间对我们整个数据集进行规范化,并将我们的目标函数定义为边界从0到1.完成,就是这样。现在我们来看一个更复杂的部分:如何定义我们的目标函数?

在分区聚类方法中,我们希望最大化两个不同组之间的距离,并最小化组内的距离。文献中使用了几个目标函数,但是最为人熟知的方法是所谓的平方和(Sum of Squared Errors,SSE)。

这个公式意味着什么?那么,误差平方总和(SSE)是一个聚类度量,其背后的想法非常简单。它基本上是一个数值,它计算我们数据中每个实例到其最接近质心的平方距离。我们的优化任务的目标是尽量减少这个功能。

我们可以使用我们以前的目标函数框架来实现误差平方和,Python代码如下所示:

@add_metaclass(ABCMeta)

class PartitionalClusteringObjectiveFunction(ObjectiveFunction):

def __init__(self, dim, n_clusters, data):

super(PartitionalClusteringObjectiveFunction, self)\

.__init__('PartitionalClusteringObjectiveFunction', dim, 0.0, 1.0)

self.n_clusters = n_clusters

self.centroids = {}

self.data = data

def decode(self, x):

centroids = x.reshape(self.n_clusters, self.dim)

self.centroids = dict(enumerate(centroids))

@abstractmethod

def evaluate(self, x):

pass

class SumOfSquaredErrors(PartitionalClusteringObjectiveFunction):

def __init__(self, dim, n_clusters, data):

super(SumOfSquaredErrors, self).__init__(dim, n_clusters, data)

self.name = 'SumOfSquaredErrors'

def evaluate(self, x):

self.decode(x)

clusters = {key: [] for key in self.centroids.keys()}

for instance in self.data:

distances = [np.linalg.norm(self.centroids[idx] - instance)

for idx in self.centroids]

clusters[np.argmin(distances)].append(instance)

sum_of_squared_errors = 0.0

for idx in self.centroids:

distances = [np.linalg.norm(self.centroids[idx] - instance)

for instance in clusters[idx]]

sum_of_squared_errors += sum(np.power(distances, 2))

return sum_of_squared_errors

实践一些真实的数据

现在是时候把我们的手放在一些真实的数据上,并测试我们的ABC算法可以执行的聚类算法。对于这个研究案例,我们将使用着名的Iris数据集。

这是一个最初的四维数据集,其中包含三种植物的特征。为了可视化目的,我们将仅使用该数据集的两个维度。我们来检查一下这个数据集的第二维和第四维之间的关系:

import matplotlib.pyplot as plt

from abc import ABC

from objection_function import SumOfSquaredErrors

from sklearn.datasets import load_iris

from sklearn.preprocessing import MinMaxScaler

data = MinMaxScaler().fit_transform(load_iris()['data'][:, [1,3]])

plt.figure(figsize=(9,8))

plt.scatter(data[:,0], data[:,1], s=50, edgecolor='w', alpha=0.5)

plt.title('Original Data')

以上Python代码的输出可以在下面看到:

原始数据分布

由于我们将使用这些数据作为基准测试,因此我们已经知道它的最佳划分是什么,它是由三种花的原始分布给出的。我们可以用下面的Python代码可视化Iris数据集的原始最优分区

colors = ['r', 'g', 'y']

target = load_iris()['target']

plt.figure(figsize=(9,8))

for instance, tgt in zip(data, target):

plt.scatter(instance[0], instance[1], s=50,

edgecolor='w', alpha=0.5, color=colors[tgt])

plt.title('Original Groups')

以下分布图

我们数据集中的原始组

现在我们知道这个样本数据的原始最优分区是什么,现在该知道我们的ABC算法是否能够为这个问题找到一个非常接近的解决方案。我们将使用我们的平方和目误差标函数,并将分区数设置为3。

由于初始化是随机的,因此很可能生成的质心的顺序与类的顺序不匹配。因此,当绘制ABC算法的输出时,组的颜色可能不匹配。这并不重要,我们实际将会看到的是对应分区组的外观。

objective_function = SumOfSquaredErrors(dim=6, n_clusters=3, data=data)

optimizer = ABC(obj_function=objective_function, colony_size=30,

n_iter=300, max_trials=100)

optimizer.optimize()

def decode_centroids(centroids, n_clusters, data):

return centroids.reshape(n_clusters, data.shape[1])

centroids = dict(enumerate(decode_centroids(optimizer.optimal_solution.pos,

n_clusters=3, data=data)))

def assign_centroid(centroids, point):

distances = [np.linalg.norm(point - centroids[idx]) for idx in centroids]

return np.argmin(distances)

custom_tgt = []

for instance in data:

custom_tgt.append(assign_centroid(centroids, instance))

colors = ['r', 'g', 'y']

plt.figure(figsize=(9,8))

for instance, tgt in zip(data, custom_tgt):

plt.scatter(instance[0], instance[1], s=50, edgecolor='w',

alpha=0.5, color=colors[tgt])

for centroid in centroids:

plt.scatter(centroids[centroid][0], centroids[centroid][1],

color='k', marker='x', lw=5, s=500)

plt.title('Partitioned Data found by ABC')

我们的Python代码的输出可以在下面看到

The partition of our dataset found by the ABC algo

如果我们看看原始分区和我们ABC算法生成的分区,我们可以看到它能够找到一个真正关闭最优分区的分区。这证明了用于聚类的“修改”ABC算法有多强大。我们还可以通过查看我们的ABC算法的optimality_tracking属性来了解优化过程的流程:

itr = range(len(optimizer.optimality_tracking))

val = optimizer.optimality_tracking

plt.figure(figsize=(10, 9))

plt.plot(itr, val)

plt.title('Sum of Squared Errors')

plt.ylabel('Fitness')

plt.xlabel('Iteration')

正如所料,ABC算法在最小化SSE目标函数方面非常有效。我们可以看到,群智能拥有解决优化问题的一些强大机制,适应这些算法解决现实问题只是我们如何将这些问题减少到优化任务的问题。

下一步是什么 ?

我们已经通过实施人工蜂群算法简单介绍了群智能,以及如何使用它来解决一些有趣的问题,如优化实际功能以及如何“修改”ABC算法以解决群集问题。

这些算法有大量的应用,如图像分割、人工神经网络训练、数字图像处理和模式识别、蛋白质结构预测等。还有一些其他强大的群体智能(SI)算法,如粒子群优化(PSO)和鱼群搜索(FSS),这也是非常有名的技术,并且有一些有趣的应用。

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

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

相关文章

python涉及到的逻辑_涉及逻辑运算的python表达式的运算顺序

以下代码并不报错,而我理解在”point 1″处如果先运算小括号里面的表达式,而y并不存在,不应该报错吗?难道发现x 10的短路运算优先于小括号里面的表达式运算?将这一行中x 10改为x 100后报错了,这个理解没…

oracle sql last_value,図でイメージするOracle DatabaseのSQL全集 第3回 分析関数

指定したソートキーでの、最初の行の値を求めるのが、First_Value関数。指定したソートキーでの、最後の行の値を求めるのが、Last_Value関数。指定したソートキーでの、(Row_Numberな順位が)n番目の行の値を求めるのが、nth_Value関数となります。Oracle11gR2でnth_Value関数が…

python读取字典元素笔记_Python 学习笔记 - 字典

Python 字典字典是一种无序的、可修改的、可索引的容器。字典使用花括号声明,具有键和值。mydic {name:孙悟空,origin:猴子}print(mydic)结果:{name: 孙悟空, origin: 猴子}访问字典mydic {name:孙悟空,origin:猴子}print(mydic[name])结果&#xff1a…

oracle =1,oracle中的 where 1=1 和where 1 !=1

11 永真&#xff0c; 1<>1 永假。1<>1 的用处&#xff1a; 用于只取结构不取数据的场合例如&#xff1a;create table table_ly_temp tablespace ly_temp asselect * from table_ly where 1<>112建成一个与table_ly 结构相同的表table_ly_temp &#xff0c;但…

企业信息化投入中咨询服务_全过程工程咨询服务核心价值是什么

建筑行业服务现状传统建设工程的目标、计划、控制都以参与单位个体为主要对象&#xff0c;项目管理的阶段性和局部性割裂了项目的内在联系&#xff0c;导致项目管理存在明显的管理弊端&#xff0c;这种模式已经与国际主流的建设管理模式脱轨。“专而不全”、“多小散”企业的参…

sp_addlinkedserver oracle,sp_addlinkedserver使用方法

Exec sp_droplinkedsrvlogin DBVIP,Null --删除映射(录与链接服务器上远程登录之间的映射)Exec sp_dropserver DBVIP --删除远程服务器链接EXEC sp_addlinkedserverserverDBVIP,--被访问的服务器别名srvproduct,providerSQLOLEDB,datasrc"…

oracle的undo表空间不足,undo表空间不足,ORA-30036 unable to extend segment by ...

一、一次更新或者删除大量数据&#xff0c;这些数据需要保存在undo表空间中(直到提交或回滚后这些undo表空间中的数据才允许被覆盖)&#xff0c;如果undo表空间不足&#xff0c;就会报ORA-30036错误。下面是两种解决办法&#xff1a;1、增加undo表空间大小&#xff0c;或将undo…

交流信号叠加直流偏置_放大器偏置电流Ib需要完整的直流回路

多数工程师对于放大器偏置电流参数并不陌生&#xff0c;它是导致放大器电路产生直流噪声的又一重要影响因素。因为偏置电流经过输入端电阻网络会形成一个失调电压源&#xff0c;再通过电路的噪声增益影响输出直流噪声。所以工程师会注重电阻网络的匹配&#xff0c;降低偏置电流…

teamviewer类似软件_TeamViewer系统后台被黑客组织APT攻破,请注意防范

TeamViewer事件10月11日&#xff0c;深圳市网络与信息安全信息通报中心发布了一份编号为“2019029”的名为《关于TeamViewer客户端被远程控制的紧急通报》文件&#xff0c;文件指出目前知名远程办公工具TeamViewer已经被境外黑客组织APT41攻破&#xff0c;提醒企业组织做好防护…

linux上dig命令,Linux dig命令(示例代码)

dig(Domain Information Groper)&#xff0c;和nslookup作用有些类似&#xff0c;都是DNS查询工具1、dig命令格式dig dnsserver name querytype如果你设置的dnsserver是一个域名&#xff0c;首先通过默认的上连DNS服务器去查询对应的IP地址&#xff0c;然后再以设置的dnsserver…

python实现表格线性回归_Python实现线性回归

一、线性回归原理二、python实现线性回归1.基本矩阵运算pratice1.py:# Author:WYCimport numpy as npfrom numpy.linalg import invfrom numpy import dotfrom numpy import matprint(-------------给定矩阵A,B----------)A np.mat([1,1])print (A:\n,A)B mat([[1,2],[2,3]])…

linux后台启动脚本nohup,linux下后台执行shell脚本nohup

【GSM】GTM900C的应用——短信虽说GSM已经很老旧,但其低廉的价格,非常适合一些需要小数据上网传输和短信等功能的应用场合. 不知道GSM能否像51单片机一样,在低端应用中长久不衰.GTM900C发送短信,支持两种模式,TXT和PD ...iOS UITabBarController的使用UITabBarController 和 UI…

华为4g模块 linux驱动程序,定制Android之4G-LTE模块驱动

定制Android之4G-LTE模块驱动一&#xff0e; 简介本文讲述在Android内核中&#xff0c;添加中国移动4G-LTE制式华为MU909模块驱动&#xff0c;实现通过4G上网业务&#xff0c;电话业务&#xff0c;短信业务。CPU&#xff1a;Samsung 6410Kernel&#xff1a;linux 2.6.36…

软件测试用例_软件测试用例设计实战场景法

不点蓝字&#xff0c;我们哪来故事&#xff1f; 目录场景法扩展例子场景法介绍影子场景法用例设计举例场景法设计用例步骤和表示场景法举例 总结 场景法的注意点场景法影子本来想直接跳过场景法的&#xff0c;今天群友提出问题&#xff1a;1、面试官问&#xff1a;场景…

linux下printf语句执行时间,linux下printf中\n刷新缓冲区的疑问(已解决)

#include #include int main(void){ printf("hello world");close(STDOUT_FILENO); return 0;}//什么都不输出12345678910111234567891011#include #include int main(void){ printf("hello world\n");close(STDOUT_FILENO); …

树莓派摄像头_Arducam 8MP重磅来袭,为树莓派4B构建完全同步的双摄像头方案~

大家好&#xff0c;我是小月月。双目立体景深一直是很热门的项目&#xff0c;最近已经有不少小伙伴学会在树莓派上插两个USB摄像头了&#xff0c;这个方案可以识别静态场景中各个物体的距离远近。但是两个USB摄像头捕获到的两组图像序列的时间并不是严格同步的&#xff0c;对运…

linux 获取设备树源文件(dts)里描述的资源,Linux 获取设备树源文件(DTS)里描述的资源...

在linux使用platform_driver_register() 注册 platform_driver 时&#xff0c; 需要在 platform_driver 的probe() 里面知道设备的中断号&#xff0c; 内存地址等资源。这些资源的描述信息存放在 resource 数据结构中&#xff0c; 相同的资源存放在一个树形树形数据结构中&…

python无法安装第三方库read time out_解决pip install的时候报错timed out的问题

安装包的时候报错&#xff0c;执行&#xff1a;pip install pyinstaller问题&#xff1a;File "c:\python\python35\lib\site-packages\pip\_vendor\requests\packages\urllib3\response.py", line 357, in streamdata self.read(amtamt, decode_contentdecode_cont…

嵌入式linux文件系统类型,嵌入式Linux 的Cramfs 根文件系统配置的解决方案

当系统启动并执行到系统初始化脚本/etc/init.d/rcS 时&#xff0c;mount 命令将/mnt/yaffs 目录挂载 为ramfs 类型的随机存储文件系统&#xff0c;并在此文件系统上建立Qtopia 和Qtopia/tmp 目录[5]&#xff0c; /Qtopia/tmp 目录即为应用程序可能对文件系统进行写操作的临时文…

python nlp data_Python nlpaug包_程序模块 - PyPI - Python中文网

NLPAUG这个python库帮助您为机器学习项目增加nlp。访问此简介了解Data Augmentation in NLP。Augmenter是增广的基本元素&#xff0c;而Flow是将多个增广器组合在一起的管道。起动指南增强器TargetAugmenterActionDescriptionCharacterRandomAuginsertInsert character randoml…