日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

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

發(fā)布時間:2025/3/8 python 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 人工蜂群算法python_改进的人工蜂群算法解决聚类问题(在Python中的分步实现)... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

之前的文章

中,我介紹了如何通過實施名為Artificial Bee Colony(ABC)的群集智能(SI)算法來解決現(xiàn)實世界中的優(yōu)化問題。

現(xiàn)在是時候讓我們掌握一些真實的數(shù)據(jù)并解釋我們?nèi)绾问褂梦覀兊腁BC算法的Python實現(xiàn)來執(zhí)行群集任務(wù)。但在此之前,讓我們深入了解一下聚類問題。

聚類問題

聚類問題是一個未明確定義的NP難題,其基本思想是在數(shù)據(jù)中發(fā)現(xiàn)隱藏的模式。關(guān)于什么是集群沒有一個正式的定義,但它與分組元素的想法相關(guān)聯(lián),以便我們可以區(qū)分不同組中的元素。

有不同的算法族以不同的方式定義聚類問題。定義聚類問題的經(jīng)典方法,在文獻(xiàn)中經(jīng)常見到,是將其減少為一個數(shù)學(xué)問題,即找到原始數(shù)據(jù)的k分區(qū)。

找到一個集合S的k分區(qū),被定義為找到S的k個子集,它服從兩個規(guī)則:

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

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

基本上,在這個分區(qū)聚類過程結(jié)束時,我們希望找到原始數(shù)據(jù)集的不同子集,以這種方式,沒有實例將屬于多個組。這可以在下面的圖像中說明:

左邊是原始數(shù)據(jù),右邊是k = 2的分區(qū)數(shù)據(jù)

k = 2時可以使用質(zhì)心如何執(zhí)行數(shù)據(jù)分區(qū)的示例

我們?nèi)绾尾鸱謹(jǐn)?shù)據(jù)以執(zhí)行上圖中所示的分區(qū)?那么,聚類過程的輸出是一組質(zhì)心。質(zhì)心基本上是每個組的代表性實體,所以如果我們想要對數(shù)據(jù)進(jìn)行k分割,那么我們將有k個 質(zhì)心。

質(zhì)心也是由我們的數(shù)據(jù)定義的搜索空間上的點,并且由于每個質(zhì)心定義了一個組,每個數(shù)據(jù)點將被分配到距離它最近的質(zhì)心。

修改聚類的人工蜂群

那么,現(xiàn)在我們知道什么是聚類問題,我們?nèi)绾涡薷脑瓉淼腁BC算法來執(zhí)行這樣的任務(wù)?猜猜看,我們沒有!是的,這就是你剛剛閱讀的內(nèi)容,我們根本不需要修改我們的ABC實施。我們唯一要做的就是查看聚類問題并將其轉(zhuǎn)化為優(yōu)化任務(wù)!但我們怎么做到這一點?

正如我們在前面的文章中看到的那樣,一個明確定義的優(yōu)化問題需要一個搜索空間,一個集合的維度輸入決策變量和一個目標(biāo)函數(shù)。如果我們將人工菌落中的每只蜜蜂看作是我們聚類問題的整體解決方案,那么每只蜜蜂都可以代表一組完整的候選質(zhì)心!如果我們工作的一個d維空間,我們要執(zhí)行的k分區(qū)上我們的數(shù)據(jù),那么每個蜂將是一個? · d維向量!

現(xiàn)在我們已經(jīng)定義了如何表示我們的輸入決策變量,我們只需要弄清楚如何定義我們的搜索空間的邊界以及我們的目標(biāo)函數(shù)是什么。

我們的搜索空間的邊界很容易,我們可以用[0,1]區(qū)間對我們整個數(shù)據(jù)集進(jìn)行規(guī)范化,并將我們的目標(biāo)函數(shù)定義為邊界從0到1.完成,就是這樣。現(xiàn)在我們來看一個更復(fù)雜的部分:如何定義我們的目標(biāo)函數(shù)?

在分區(qū)聚類方法中,我們希望最大化兩個不同組之間的距離,并最小化組內(nèi)的距離。文獻(xiàn)中使用了幾個目標(biāo)函數(shù),但是最為人熟知的方法是所謂的平方和(Sum of Squared Errors,SSE)。

這個公式意味著什么?那么,誤差平方總和(SSE)是一個聚類度量,其背后的想法非常簡單。它基本上是一個數(shù)值,它計算我們數(shù)據(jù)中每個實例到其最接近質(zhì)心的平方距離。我們的優(yōu)化任務(wù)的目標(biāo)是盡量減少這個功能。

我們可以使用我們以前的目標(biāo)函數(shù)框架來實現(xiàn)誤差平方和,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

實踐一些真實的數(shù)據(jù)

現(xiàn)在是時候把我們的手放在一些真實的數(shù)據(jù)上,并測試我們的ABC算法可以執(zhí)行的聚類算法。對于這個研究案例,我們將使用著名的Iris數(shù)據(jù)集。

這是一個最初的四維數(shù)據(jù)集,其中包含三種植物的特征。為了可視化目的,我們將僅使用該數(shù)據(jù)集的兩個維度。我們來檢查一下這個數(shù)據(jù)集的第二維和第四維之間的關(guān)系:

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代碼的輸出可以在下面看到:

原始數(shù)據(jù)分布

由于我們將使用這些數(shù)據(jù)作為基準(zhǔn)測試,因此我們已經(jīng)知道它的最佳劃分是什么,它是由三種花的原始分布給出的。我們可以用下面的Python代碼可視化Iris數(shù)據(jù)集的原始最優(yōu)分區(qū)

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')

以下分布圖

我們數(shù)據(jù)集中的原始組

現(xiàn)在我們知道這個樣本數(shù)據(jù)的原始最優(yōu)分區(qū)是什么,現(xiàn)在該知道我們的ABC算法是否能夠為這個問題找到一個非常接近的解決方案。我們將使用我們的平方和目誤差標(biāo)函數(shù),并將分區(qū)數(shù)設(shè)置為3。

由于初始化是隨機(jī)的,因此很可能生成的質(zhì)心的順序與類的順序不匹配。因此,當(dāng)繪制ABC算法的輸出時,組的顏色可能不匹配。這并不重要,我們實際將會看到的是對應(yīng)分區(qū)組的外觀。

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

如果我們看看原始分區(qū)和我們ABC算法生成的分區(qū),我們可以看到它能夠找到一個真正關(guān)閉最優(yōu)分區(qū)的分區(qū)。這證明了用于聚類的“修改”ABC算法有多強(qiáng)大。我們還可以通過查看我們的ABC算法的optimality_tracking屬性來了解優(yōu)化過程的流程:

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目標(biāo)函數(shù)方面非常有效。我們可以看到,群智能擁有解決優(yōu)化問題的一些強(qiáng)大機(jī)制,適應(yīng)這些算法解決現(xiàn)實問題只是我們?nèi)绾螌⑦@些問題減少到優(yōu)化任務(wù)的問題。

下一步是什么 ?

我們已經(jīng)通過實施人工蜂群算法簡單介紹了群智能,以及如何使用它來解決一些有趣的問題,如優(yōu)化實際功能以及如何“修改”ABC算法以解決群集問題。

這些算法有大量的應(yīng)用,如圖像分割、人工神經(jīng)網(wǎng)絡(luò)訓(xùn)練、數(shù)字圖像處理和模式識別、蛋白質(zhì)結(jié)構(gòu)預(yù)測等。還有一些其他強(qiáng)大的群體智能(SI)算法,如粒子群優(yōu)化(PSO)和魚群搜索(FSS),這也是非常有名的技術(shù),并且有一些有趣的應(yīng)用。

總結(jié)

以上是生活随笔為你收集整理的人工蜂群算法python_改进的人工蜂群算法解决聚类问题(在Python中的分步实现)...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲综合涩 | av在线短片| 王者后宫yin肉h文催眠 | 182在线视频 | 开心色99| 五月导航 | 黄色av三级 | 潘金莲一级淫片aaaaaa播放 | 久久香视频 | 精品久久久久久无码人妻 | 91亚洲综合| a天堂资源| 日本中文一区 | 国产资源在线播放 | 娇妻被肉到高潮流白浆 | 痴女扩张宫交脱垂重口小说 | 五月天激情丁香 | 成人黄色电影网址 | 成人免费无码大片a毛片抽搐色欲 | 亚洲喷潮 | 亚洲av综合色区无码一区 | 人妻熟女一区二区三区 | 牛牛视频在线观看 | jvid乐乐 | 最近免费中文字幕大全免费版视频 | 国产精品国产三级国产专区53 | 五月激情婷婷网 | 日日噜噜噜噜人人爽亚洲精品 | 亚洲美女一区二区三区 | 99久久综合国产精品二区 | 成人www视频 | 丰满人妻一区二区三区53号 | 天堂亚洲 | 一级黄色裸体片 | 夜夜艹天天干 | 亚洲爱视频 | 色哟哟日韩精品 | 制服丝袜影音先锋 | 苍井空浴缸大战猛男120分钟 | 草莓视频在线观看入口w | 在线亚洲观看 | 精品福利三区3d卡通动漫 | 一区av在线 | 亚洲精品久久久久久 | 国产手机在线播放 | 人人妻人人澡人人爽 | 20日本xxxxxxxxx46 欧美激情一级 | 亚洲黄色录像片 | 欧美人与性囗牲恔配 | 精品在线免费视频 | a级片日本 | 亚洲香蕉久久 | 99亚洲欲妇 | 一区二区欧美在线观看 | 日本亚洲一区 | 天天摸天天碰天天爽天天弄 | 国产精品36p | 免费色网址 | 阿v天堂2014 这里有精品 | 亚洲精品1 | 99r在线视频 | 污视频免费看 | 色av资源| 波多野结衣国产在线 | 亚洲黄色小说图片 | 亚洲自拍网站 | 日韩在线一区二区三区四区 | 蝌蚪网在线视频 | 久操青青 | 蜜臀一区二区三区精品免费视频 | 亚洲福利在线视频 | 欧美在线激情视频 | 久久入口 | japanese在线观看 | 女十八毛片 | 成人性生交大免费看 | 成为性瘾网黄的yy对象后 | 久久狠狠高潮亚洲精品 | 久久草视频在线 | 黑人100部av解禁片 | 制服丝袜影音先锋 | 伊人网在线免费观看 | 精品一区二区毛片 | www.天堂av | 成人av网站在线观看 | 91麻豆视频在线观看 | 国产精品偷伦视频免费看 | 娇妻第一次尝试交换的后果 | 男人操女人的网站 | 国产热99| 毛片一区二区 | 久久视 | 免费在线中文字幕 | 天堂а√在线中文在线鲁大师 | 一直草| 久久丝袜视频 | 精品人妻一区二区三区久久 | 国产视频h | 免费中文字幕视频 |