人工蜂群算法python_改进的人工蜂群算法解决聚类问题(在Python中的分步实现)...
在
之前的文章
中,我介紹了如何通過實施名為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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL摘要_mysql摘要
- 下一篇: 货车帮是哪个公司开发的 具体怎么回事