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

歡迎訪問 生活随笔!

生活随笔

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

python

人工蜂群算法python_教程 | 用人工蜂群算法求解k-分区聚类问题

發(fā)布時(shí)間:2025/3/15 python 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 人工蜂群算法python_教程 | 用人工蜂群算法求解k-分区聚类问题 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原標(biāo)題:教程 | 用人工蜂群算法求解k-分區(qū)聚類問題

選自towarddatascience

作者:Pedro Buarque

參與:Pedro、劉曉坤

群體智能算法是一類受生物群體智能行為的啟發(fā)而發(fā)展出來的算法,社會(huì)性動(dòng)物例如螞蟻、蜜蜂、魚等,個(gè)體的簡單、非直接目標(biāo)指向的行為常常能在群體層面上涌現(xiàn)出驚人的高效實(shí)現(xiàn)目標(biāo)的模式。本文介紹了如何使用人工蜂群算法(ABC)算法實(shí)現(xiàn)真實(shí)數(shù)據(jù)的聚類。

我之前的文章介紹了如何利用名為人工蜂群算法(ABC)的集群智能(SI)算法來解決現(xiàn)實(shí)世界的優(yōu)化問題:https://medium.com/cesar-update/a-swarm-intelligence-approach-to-optimization-problems-using-the-artificial-bee-colony-abc-5d4c0302aaa4

這篇文章將會(huì)介紹如何處理真實(shí)數(shù)據(jù)、如何使用 ABC 算法實(shí)現(xiàn)聚類。在此之前,我們先了解一下聚類問題。

聚類問題

聚類問題是一類 NP-hard 問題,其基本思想是發(fā)現(xiàn)數(shù)據(jù)中的隱藏模式。聚類沒有正式的定義,但它與元素分組的思想有關(guān):通過分組我們可以區(qū)分元素為不同的組。

不同的算法族以不同的方式定義聚類問題。一種常見的經(jīng)典聚類方法如下:它將問題簡化為一個(gè)數(shù)學(xué)問題,即找到原始數(shù)據(jù)的一個(gè) k 分區(qū)。

找到集合 S 的 k 分區(qū)等價(jià)于找到 S 的 k 個(gè)子集,其遵循以下兩個(gè)規(guī)則:

1. 不同子集的交集等于空集。

2.k 個(gè)子集的并集為 S。

在分區(qū)聚類過程結(jié)束時(shí),我們希望找到原始數(shù)據(jù)集的一組子集,使得一個(gè)實(shí)例只屬于一個(gè)子集。具體如下圖所示:

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

如何劃分?jǐn)?shù)據(jù)以達(dá)到上圖所示的分區(qū)效果?聚類過程的輸出是一組質(zhì)心。質(zhì)心是每個(gè)分組的代表實(shí)體,所以如果數(shù)據(jù)有 k 個(gè)分區(qū),那么它有 k 個(gè)質(zhì)心。

k=2 數(shù)據(jù)分區(qū)的質(zhì)心演示示例。

質(zhì)心也可理解為由數(shù)據(jù)定義的搜索空間上的點(diǎn),由于每個(gè)質(zhì)心定義了一個(gè)分組,每個(gè)數(shù)據(jù)點(diǎn)將被分配到距離它最近的質(zhì)心。

人工蜂群算法的聚類應(yīng)用

如何修改原始的 ABC 算法使其得以執(zhí)行聚類任務(wù)?實(shí)際上,此處 ABC 算法沒作任何改動(dòng)。唯一要做的就是將聚類問題轉(zhuǎn)化為優(yōu)化問題。如何做到這一點(diǎn)?

一個(gè)明確定義的優(yōu)化問題需要一個(gè)搜索空間:一組 d 維決策變量輸入和一個(gè)目標(biāo)函數(shù)。如果將人工集群中的每一個(gè)點(diǎn)(蜂)視為聚類問題的一個(gè)劃分,那么每一個(gè)點(diǎn)可以代表一整組候選質(zhì)心。如果對(duì) d 維空間上的數(shù)據(jù)集執(zhí)行 k 分區(qū),那么每個(gè)點(diǎn)都將是一個(gè) k·d 維向量。

上文定義了如何表示輸入決策變量,接下來只需要弄清楚如何定義搜索空間的邊界以及選用什么目標(biāo)函數(shù)。

搜索空間邊界的定義很容易,用 [0,1] 區(qū)間對(duì)整個(gè)數(shù)據(jù)集進(jìn)行歸一化,并將目標(biāo)函數(shù)的值域定義為 0 到 1。麻煩的是如何定義目標(biāo)函數(shù)。

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

平方誤差和的公式。

這個(gè)公式是什么意思?平方誤差和(SSE)是一種聚類度量指標(biāo),其思想非常簡單。它是一個(gè)計(jì)算數(shù)據(jù)中每個(gè)實(shí)例到其最接近質(zhì)心的平方距離的值。算法優(yōu)化的目標(biāo)是盡量減小這個(gè)值的大小。

可以使用之前的目標(biāo)函數(shù)框架來實(shí)現(xiàn)平方誤差和,具體如下:

@add_metaclass(ABCMeta)

classPartitionalClusteringObjectiveFunction(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

defdecode(self, x):

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

self.centroids = dict(enumerate(centroids))

@abstractmethod

defevaluate(self, x):

pass

classSumOfSquaredErrors(PartitionalClusteringObjectiveFunction):

def__init__(self, dim, n_clusters, data):

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

self.name = 'SumOfSquaredErrors'

defevaluate(self, x):

self.decode(x)

clusters = {key: [] forkey inself.centroids.keys()}

forinstance inself.data:

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

foridx inself.centroids]

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

sum_of_squared_errors = 0.0

foridx inself.centroids:

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

forinstance inclusters[idx]]

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

returnsum_of_squared_errors

處理真實(shí)數(shù)據(jù)

現(xiàn)在開始嘗試處理一些真實(shí)的數(shù)據(jù),并測試 ABC 算法處理聚類問題的能力。此處我們使用著名的 Iris 數(shù)據(jù)集進(jìn)行測試。

初始的四維數(shù)據(jù)集包含了從三種植物身上提取得到的特征。為了便于可視化,此處只使用該數(shù)據(jù)集的兩個(gè)維度。觀察該數(shù)據(jù)集第二維和第四維之間的關(guān)系:

importmatplotlib.pyplot asplt

fromabc importABC

fromobjection_function importSumOfSquaredErrors

fromsklearn.datasets importload_iris

fromsklearn.preprocessing importMinMaxScaler

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

上述代碼的輸出結(jié)果如下:

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

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

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

target = load_iris()[ 'target']

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

forinstance, tgt inzip(data, target):

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

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

plt.title( 'Original Groups')

它顯示了如下分布:

數(shù)據(jù)集的初始劃分。

由于已經(jīng)知道這個(gè)樣本數(shù)據(jù)的原始最優(yōu)分區(qū)是什么,接下來的實(shí)驗(yàn)將測試 ABC 算法能否找到一個(gè)接近最優(yōu)解的解決方案。使用平方誤差和作為目標(biāo)函數(shù),并將分區(qū)數(shù)設(shè)置為 3。

由于隨機(jī)初始化,生成的質(zhì)心的順序可能與類的順序不匹配。因此在 ABC 算法的輸出圖像中,組的顏色可能會(huì)不匹配。不過這并不重要,因?yàn)槿藗兏P(guān)心的是對(duì)應(yīng)分組的外觀。

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

defdecode_centroids(centroids, n_clusters, data):

returncentroids.reshape(n_clusters, data.shape[ 1])

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

n_clusters= 3, data=data)))

defassign_centroid(centroids, point):

distances = [np.linalg.norm(point - centroids[idx]) foridx incentroids]

returnnp.argmin(distances)

custom_tgt = []

forinstance indata:

custom_tgt.append(assign_centroid(centroids, instance))

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

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

forinstance, tgt inzip(data, custom_tgt):

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

alpha= 0.5, color=colors[tgt])

forcentroid incentroids:

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

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

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

代碼的輸出如下:

ABC 算法生成的分區(qū)

仔細(xì)觀察原始分區(qū)和 ABC 算法生成的分區(qū),可以看到 ABC 算法能夠找到一個(gè)十分接近最優(yōu)解的分區(qū)方法。這證明了用于聚類的 ABC 算法到底有多強(qiáng)大。還可以查看 ABC 算法的優(yōu)化曲線來看看優(yōu)化過程是如何進(jìn)行的:

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ù)。可以看到,集群智能擁有一些強(qiáng)大的機(jī)制來處理優(yōu)化問題。只要能將現(xiàn)實(shí)世界的問題簡化為優(yōu)化問題,就能很好地利用這些算法。

參考文獻(xiàn):

A novel clustering approach: Artificial Bee Colony (ABC) algorithm—Dervis Karaboga, Celal Ozturk

A Clustering Approach Using Cooperative Artificial Bee Colony Algorithm—Wenping Zou, Yunlong Zhu, Hanning Chen, and Xin Sui

A Review on Artificial Bee Colony Algorithms and Their Applications to Data Clustering—Ajit Kumar , Dharmender Kumar , S. K. Jarial

A two-step artificial bee colony algorithm for clustering—Yugal Kumar, G. Sahoo

未來展望

本文通過實(shí)現(xiàn)人工蜂群算法簡要介紹了集群智能,以及如何利用它來解決一些有趣的問題:例如優(yōu)化實(shí)際函數(shù)、修改 ABC 算法解決聚類問題。

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

原文鏈接:https://towardsdatascience.com/a-modified-artificial-bee-colony-algorithm-to-solve-clustering-problems-fc0b69bd0788

本文為機(jī)器之心編譯,轉(zhuǎn)載請(qǐng)聯(lián)系本公眾號(hào)獲得授權(quán)。返回搜狐,查看更多

責(zé)任編輯:

總結(jié)

以上是生活随笔為你收集整理的人工蜂群算法python_教程 | 用人工蜂群算法求解k-分区聚类问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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