人工蜂群算法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.pswp.cn/news/534793.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534793.shtml
英文地址,請注明出處:http://en.pswp.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…