天天看點

随機分布式延遲PSO(RODDPSO)+K-Means算法(Python代碼實作)

💥1 概述

随機分布式延遲PSO(RODDPSO)+K-Means算法(Python代碼實作)

   本文複現論文算法RODDPSO+K-Means,用優化的粒子群算法對K-Means算法求初始的簇心,以達到優化聚類算法的目的。

   分布式時滞表現出獨特的空間性質,可模拟在特定時間段内通過一定數量的并行通道/路徑分布的信号傳播延遲。到目前為止,具有分布式時間延遲的複雜系統(例如神經網絡[33],[44])的動力學行為已經得到了很好的研究。直覺地說,一個自然的想法是在PSO算法中引入一定的分布式時滞,希望增強從局部最優逃逸的能力,擺脫過早收斂的問題。與[34],[36]和[48]中的離散時間延遲相比,分布式時間延遲具有以下兩個優點:1)更好地利用更長(更多累積)的種群進化曆史,導緻更好的準确性和2)更複雜的動力學行為導緻捕獲局部最優的可能性更小。此外,為了在收斂性和多樣性之間做出适當的權衡,引入的分布式時滞可以以合理的小機率随機發生。是以,本文的主要目的是啟動一項關于新型随機發生的分布式延遲PSO(RODDPSO)算法及其在醫療保健資訊學中的應用的重大研究。

受上述讨論的啟發,本文的目的是提出一種基于RODDPSO的聚類算法,并應用于分析A&E資料。本文的主要貢獻可歸納為以下三個方面。

  1. 引入了一種新的RODDPSO算法,其中随機出現的分布式時滞項不僅有助于:a)對整個搜尋空間的徹底探索;b)捕獲局部最優的可能性顯着降低;c)在本地和全球搜尋能力之間取得适當的平衡。
  2. 該文提出一種将RODDPSO算法與傳統算法相結合的新型聚類算法K -表示聚類算法。所提出的基于RODDPSO的聚類算法不依賴于聚類質心的初始狀态,進而有助于實作更好的聚類分區。

📚2 運作結果

随機分布式延遲PSO(RODDPSO)+K-Means算法(Python代碼實作)
随機分布式延遲PSO(RODDPSO)+K-Means算法(Python代碼實作)

部分代碼:

# 疊代尋優
t = 0
record_RODDPSO = np.zeros(maxgen)
while t < maxgen:
    
    #慣性權重更新
    w=W_MAX-((W_MAX-W_MIN)*t/maxgen)
    
    #加速度系數更新
    c1=((c1f-c1i)*(maxgen-t)/maxgen)+c1i
    c2=((c2f-c2i)*(maxgen-t)/maxgen)+c2i
    c3=c1
    c4=c2
    
    #計算每個粒子的平均距離
    d=dist(pop)
    
    #更新Ef
    Ef=(d[i]-np.min(d))/(np.max(d)-np.min(d))
    
    #根據Ef尋找進化狀态
    if 0<=Ef<0.25:
        epsilonk=1
    if 0.25<=Ef<0.5:
        epsilonk=2
    if 0.5<=Ef<0.75:
        epsilonk=3
    if 0.75<=Ef<=1:
        epsilonk=4
    
    ml,mg=evo_state[epsilonk]
    
    # 速度更新
    
    mcr3=0
    mcr4=0
    for tao in range(N):
        if t>=tao:
            mcr3+=alpha[tao]*(gbest_history[t-tao]-pop)
            mcr4+=alpha[tao]*(zbest_history[t-tao]-pop)
        else:
            mcr3+=alpha[tao]*(gbest_history[t]-pop)
            mcr4+=alpha[tao]*(zbest_history[t]-pop)
        
    v = w * v + c1 * np.random.random() * (gbest - pop) + c2 * np.random.random() * (zbest - pop)\
        +ml*c3* np.random.random()*mcr3+mg*c4*np.random.random()*mcr4
    v[v > Vmax] = Vmax     # 限制速度
    v[v < Vmin] = Vmin
    
    # 位置更新
    pop = pop + v;
    pop[pop > popmax] = popmax/2  # 限制位置
    pop[pop < popmin] = popmin/2
    
    '''
    # 自适應變異
    p = np.random.random()             # 随機生成一個0~1内的數
    if p > 0.8:                          # 如果這個數落在變異機率區間内,則進行變異處理
        k = np.random.randint(0,2)     # 在[0,2)之間随機選一個整數
        pop[:,k] = np.random.random()  # 在標明的位置進行變異 
    '''

    # 計算适應度值
    fitness = k_means(dataset,sizepop,pop)      

🎉3 參考文獻

​​🌈​​4 Python代碼實作

繼續閱讀