其實一直以來也沒有准備在園子里發這樣的文章,相對來說,算法改進放在園子里還是會稍稍顯得格格不入。但是最近郵箱收到的幾封郵件讓我覺得有必要通過我的博客把過去做過的東西分享出去更給更多需要的人。從論文刊登后,陸陸續續收到本科生、研究生還有博士生的來信和短信微信等,表示了對論文的興趣以及尋求算法的效果和實現細節,所以,我也就通過郵件或者短信微信來回信,但是有時候也會忘記回復。
另外一個原因也是時間久了,我對於論文以及改進的算法的記憶也越來越模糊,或者那天無意間把代碼遺失在哪個角落,真的很難想象我還會全力以赴的還原當年代碼的真相。
所以還是決定通過這篇文章,讓需要的人主動獲取吧,當然如果有更細節的問題也歡迎交流。
首先,簡單介紹下相關的概念和背景知識
聚類
聚類,一種無監督學習,是數據挖掘領域的一個重要研究方向。聚類就是將數據對象分組成多個簇(類),同一簇內的對象相似度盡可能大,不同簇間的對象相似度盡可能小。
K-means算法
K-means即K均值是一種基於划分思想的聚類算法,它是聚類算法中最經典的算法之一,它具有思路簡單、聚類快速、局部搜索能力強的優點。但也存在對初始聚類中心選擇敏感、全局搜索能力較差、聚類效率和精度低的局限性問題。類似這種K-means算法在各行各業都會有自己的應用場景,比如我在畢業論文中有提到的基於改進算法的社區划分。
群體智能與仿生算法
群體智能與仿生算法,以其進化過程與初始值無關、搜索速度快、對函數要求低的優點,成為進化算法的一個重要分支,並吸引了各個領域學者對其研究。目前,比較常見的群體智能與仿生算法有粒子群算法(PSO)、細菌覓食算法(BF)、人工魚群算法(AFSA)、遺傳算法(GA)、蟻群算法(ACA)等
人工蜂群算法
Seeley於1995年最先提出了蜂群的自組織模擬模型,在該模型中,雖然各社會階層的蜜蜂只完成了一種任務,但是蜜蜂以“擺尾舞”、氣味等多種方式在群中進行信息的交流,使得整個群體可以完成諸如喂養、采蜜、築巢等多種工作。Karaboga於2005年將蜂群算法成功應用於函數的極值優化問題,系統地提出了人工蜂群算法(Arificial Bee Colony, ABC),該算法簡單、全局搜索能力好、魯棒性強。但是,人工蜂群算法也存在着后期收斂速度較慢、容易陷入局部最優的問題。
算法的改進思路
鑒於K-means算法和人工蜂群算法各自特性,提出一種基於改進人工蜂群的K-means聚類算法IABC-Kmeans。該算法首先對人工蜂群算法進行改進:利用提出的最大最小距離積法初始化蜂群,保證初始點的選擇能夠盡可能代表數據集的分布特征;在迭代過程中使用新的適應度函數和位置更新公式完成尋優進化。然后將改進后的人工蜂群算法應用到K-means算法中完成聚類。
改進算法IABC的流程圖如下
改進算法IABC的驗證和效果展示
使用改進算法在Sphere、Rastrigin、Rosenbrock和Griewank四個測試函數上測試
迭代收斂的效果如下
從圖(a)-圖(d)可以看出,原始ABC算法在四個標准測試函數上迭代尋優過程中都遇到了不同程度的迭代收斂速度緩慢和陷入了局部極值的情況,從(b)和(d)可以看出在達到相同局部最優解的過程中,原始ABC算法需要的經歷更多次的迭代和較長的迭代時間花銷;從(a)和(c)的適應度變化趨勢可以發現,原始ABC算法在搜索最優解的精度和准確度上表現能力不足,改進前后的最優解相差好幾個數量級。相比於原始ABC算法,改進后的ABC算法由於加入有目的性的初始化過程,並引入了全局引導因子,所以在迭代尋優搜索過程中,不論是單峰函數還是多峰函數,在搜索精度和收斂速度上明顯高於原始ABC算法,體現了改進的有效性。
為了更好的體現改進算法的優越性,除了與原始ABC算法進行縱向比較,下面還將本文算法與文獻[32](一種結合人工蜂群和K-均值的混合聚類算法)中的同類改進算法進行橫向對比。原始ABC算法、文獻[32]算法以及IABC算法在四個標准函數上的適應度變化趨勢如圖所示
改進算法IABC-KMC的驗證和效果展示
算法的參數設置如下
參數名稱 |
數值 |
最大迭代次數 |
100 |
蜂群規模 |
20 |
Iris數據集聚類個數k |
3 |
Balance-scale數據集聚類個數k |
3 |
Glass數據集聚類個數k |
6 |
最大開采次數Limit |
10 |
K均值算法、ABC+KMC算法、文獻[32]算法以及IABC-KMC算法在數據集上的分別測試驗證並作對比分析,實驗中相關指標如下表所示。
Iris數據聚類對比結果
算法名稱 |
最差值 |
最優值 |
平均值 |
標准差 |
K均值 |
2.9545 |
4.4347 |
4.3096 |
1.4410 |
ABC+K均值 |
3.9517 |
4.5563 |
4.4554 |
0.0973 |
文獻[32]算法 |
4.0694 |
4.6925 |
4.6432 |
0.0105 |
本文算法 |
4.7355 |
4.8095 |
4.8058 |
0.0011 |
Balance-scale數據聚類對比結果
算法名稱 |
最差值 |
最優值 |
平均值 |
標准差 |
K均值 |
0.4262 |
1.1874 |
0.9761 |
1.7460 |
ABC+K均值 |
0.9075 |
1.2835 |
1.2442 |
0.0608 |
文獻[32]算法 |
0.9488 |
1.3254 |
1.3059 |
0.0183 |
本文算法 |
1.1203 |
1.3337 |
1.3271 |
0.0034 |
Glass數據聚類對比結果
算法名稱 |
最差值 |
最優值 |
平均值 |
標准差 |
K均值 |
5.6381 |
10.1543 |
8..6487 |
2.0293 |
ABC+K均值 |
7.8429 |
10.6544 |
9.9501 |
0.3741 |
文獻[32]算法 |
7.7624 |
10.7215 |
10.6855 |
0.1626 |
本文算法 |
10.8526 |
11.8919 |
11.8897 |
0.0582 |
在上面三個表數據中,可以發現K均值算法聚類的標准差相對較大,容易陷入局部極值,全局尋優能力較弱,而且趨於穩定值所需的迭代次數多、耗時長,主要是因為K均值算法對於初始點選擇比較敏感並容易陷入局部極值。ABC+KMC算法相較於K均值算法,標准誤差有所減小,但由於原始ABC存在易早熟的不足,所以算法出現了后期收斂速度緩慢,耗費時間較長,常停滯於局部最優的情況。文獻[32]算法通過引入了線性調整策略從而能夠快速定位到最優解,但是全局搜索能力仍不突出,早熟問題很難避免。IABC-KMC算法具有較強的全局搜索能力特性,從而能夠跳出局部極值,得到質量更高的解,所需迭代次數更少,收斂速度和聚類精確度都有顯著提升,且整個迭代過程中標准差最小。
綜上看來,IABC算法通過在四個測試函數上實現,發現不論是在效率還是准確率上都比原始ABC算法和文獻[32]算法要高,解決了算法存在的易陷入局部極值和迭代后期收斂速度緩慢問題,提高了算法的健壯性和整體性能。IABC-KMC算法通過融入IABC算法與K均值算法,優勢互補,增強了整個聚類過程的穩定性。
Github:https://github.com/DMinerJackie/IABC-KMC
1.代碼中幾乎每一行都有自己的注釋,參看算法的思想和步驟再來看應該不難
2.相應的測試函數以及測試數據集也一並上傳(Iris,Balance-scale,Glass),程序中寫的是絕對路徑,需要自己改下
3. 如果大家對此感興趣,還將出一篇基於該改進算法的社區檢測的介紹
懷戀當初寫這篇論文的時候,從確定思路,到下載相關論文,再到代碼編寫以及實驗數據整理以及后來的論文錄用,整整花了一個月的時間,記得當時只是從網上down了一個人工蜂群算法原型,期間代碼改寫,加入改進的點以及調優,直到得到了理想的數據和圖表,那是一段充實的時光,難忘的歲月,寫在2017年第一天也是激勵自己,不忘初心,砥礪前行!
如果您覺得閱讀本文對您有幫助,請點一下“推薦”按鈕,您的“推薦”將是我最大的寫作動力!如果您想持續關注我的文章,請掃描二維碼,關注JackieZheng的微信公眾號,我會將我的文章推送給您,並和您一起分享我日常閱讀過的優質文章。
友情贊助
如果你覺得博主的文章對你那么一點小幫助,恰巧你又有想打賞博主的小沖動,那么事不宜遲,趕緊掃一掃,小額地贊助下,攢個奶粉錢,也是讓博主有動力繼續努力,寫出更好的文章^^。
1. 支付寶 2. 微信