人工蜂群算法python_教程 | 用人工蜂群算法求解k-分区聚类问题
原標(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ù),并測(cè)試 ABC 算法處理聚類問題的能力。此處我們使用著名的 Iris 數(shù)據(jù)集進(jìn)行測(cè)試。
初始的四維數(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)行測(cè)試,因此其最佳劃分已知,它是由這三種花的原始分布給出的。我們可以用下面的 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)將測(cè)試 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ù)測(cè)等等。還有一些其他強(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python读取视频流做人脸识别_基于
- 下一篇: php递归实现冒泡排序,PHP冒泡排序、