聚類算法——層次聚類算法


每篇一句:

You must strive to find your own voice. Because the longer you wait to begin, the less likely you are to find it at all.
--你必須努力去尋找自己的聲音妹蔽,因?yàn)槟阍竭t開(kāi)始尋找怎顾,找到的可能性越小齿税。


層次聚類算法:

層次聚類算法 (Hierarchical Clustering Method)又稱為系統(tǒng)聚類法、分級(jí)聚類法铲咨。

層次聚類算法又分為兩種形式:

  • 凝聚層次聚類:

    首先將每個(gè)對(duì)象作為一個(gè)簇嘲更,然后合并這些原子簇為越來(lái)越大的簇闸溃,直到某個(gè)終結(jié)條件被滿足勋陪。

  • 分裂層次聚類:

    首先將所有對(duì)象置于一個(gè)簇中贪磺,然后逐漸細(xì)分為越來(lái)越小的簇,直到達(dá)到了某個(gè)終結(jié)條件诅愚。


凝聚層次聚類:

本文介紹的為第一種形式寒锚,即凝聚層次聚類:

思路:每個(gè)樣本先自成一類,然后按距離準(zhǔn)則逐步合并违孝,減少類數(shù)刹前。

  • 算法描述:

    1)N個(gè)初始模式樣本自成一類,即建立N類:

    G1(0)雌桑,G2(0)喇喉,...,Gn(0) (G_Group)

    計(jì)算 各類之間(即各樣本間)的距離(相似性校坑、相關(guān)性)拣技,得一NN維距離矩陣∪鲎伲“0*”表示初始狀態(tài)过咬。

    2)假設(shè)已求得距離矩陣D(n)(n為逐次聚類合并的次數(shù)),找出D(n)中的最小元素制妄,將其對(duì)應(yīng)的兩類合并為一類掸绞。由此建立新的分類:

    G1(n+1),G2(n+1)耕捞,...

    3)計(jì)算合并后新類別之間的距離衔掸,得D(n+1)

    4)跳至第二步俺抽,重復(fù)計(jì)算及合并敞映。


    • 結(jié)束條件:
      • 取距離閾值T,當(dāng)D(n)的最小分量超過(guò)給定值T時(shí)磷斧,算法停止振愿。所得即為聚類結(jié)果。

      • 或不設(shè)閾值T弛饭,一直將全部樣本聚成一類為止冕末,輸出聚類的分級(jí)樹(shù)。

    分類結(jié)果

問(wèn)題討論:——類間距離計(jì)算準(zhǔn)則

在算法描述第一步中提到要計(jì)算每個(gè)聚類之間的距離侣颂,在層次聚類算法中档桃,計(jì)算聚類距離間距的計(jì)算方法主要有以下五種:

  • 1)最短距離法: (常用)

    如H、K是兩個(gè)聚類憔晒,則兩類間的最短距離定義為:

    Dhk = min{D(Xh藻肄,Xk)} Xh∈H蔑舞,Xk∈K

    Dhk: H類中所有樣本與K類中所有樣本之間的最小距離。

    D(Xh嘹屯,Xk): H類中的某個(gè)樣本Xh和K類中的某個(gè)樣本Xk之間的歐式距離攻询。

    類間距離

    如果K類由I和J兩類合并而成,則:

    Dhi = min{D(Xh, Xi)} Xh∈H,Xi∈I
    Dhj = min{D(Xh, Xj)} Xh∈H,Xj∈J

    得到遞推公式:

    Dhk = min{Dhi, Dhj}

    類間距離遞推

  • 2) 最長(zhǎng)距離法:

    最長(zhǎng)距離法


  • 3)中間距離法:

    介于最長(zhǎng)與最短的距離之間抚垄。如果 K 類由 I 類和 J 類合并而成蜕窿,則 H 和 K 類之間的距離為:


    中間距離法

  • 4)重心法:

    將每類中包含的樣本數(shù)考慮進(jìn)去。若 I 類中有 n I 個(gè)樣本呆馁, J 類中有 n J 個(gè)樣本桐经,則類與類之間的距離遞推式為:

    重心法

  • 5)類平均距離法:

    類平均距離法

    定義類間距離的方法不同,分類結(jié)果會(huì)不太一致浙滤。實(shí)際問(wèn)題中常用幾種不同的方法阴挣,比較分類結(jié)果,從而選擇一個(gè)比較切合實(shí)際的分類纺腊。


Python 實(shí)現(xiàn):

  • 解釋說(shuō)明見(jiàn)代碼中注釋
# coding=utf-8

from max_min_cluster import get_distance


def hierarchical_cluster(data, t):
    # N個(gè)模式樣本自成一類
    result = [[aData] for aData in data]
    step2(result, t)
    return result


def step2(result, t):

    # 記錄類間最小距離
    min_dis = min_distance(result[0], result[1])  # 初始為1,2類之間的距離

    # 即將合并的類
    index1 = 0
    index2 = 1
    
    # 遍歷畔咧,尋找最小類間距離
    for i in range(len(result)):
        for j in range(i+1, len(result)):
            dis_temp = min_distance(result[i], result[j])
            if dis_temp < min_dis:
                min_dis = dis_temp
                # 記錄即將合并的聚類位置下標(biāo)
                index1 = i
                index2 = j
                
    # 閾值判斷
    if min_dis <= t:
        # 合并聚類index1, index2
        result[index1].extend(result[index2])
        result.pop(index2)
        # 迭代計(jì)算,直至min_dis>t為止
        step2(result, t)


def min_distance(list1, list2):

    # 計(jì)算兩個(gè)聚類之間的最小距離:
    # 遍歷兩個(gè)聚類的所有元素揖膜,計(jì)算距離(方法較為笨拙誓沸,有待改進(jìn))

    min_dis = get_distance(list1[0], list2[0])
    for i in range(len(list1)):
        for j in range(len(list2)):
            dis_temp = get_distance(list1[i], list2[j]) # get_distance()函數(shù)見(jiàn)另一篇博文《聚類算法——最大最小距離算法》
            if dis_temp < min_dis:
                min_dis = dis_temp
    return min_dis
    
# 測(cè)試hierarchical_cluster
# data = [[0, 3, 1, 2, 0], [1, 3, 0, 1, 0], [3, 3, 0, 0, 1], [1, 1, 0, 2, 0],[3, 2, 1, 2, 1], [4, 1, 1, 1, 0]]
# t = math.sqrt(5.5)
# result = hierarchical_cluster(data, t)

# for i in range(len(result)):
#     print "----------第" + str(i+1) + "個(gè)聚類----------"
#     print result[i]

# 結(jié)果為:
# ----------第1個(gè)聚類----------
# [[0, 3, 1, 2, 0], [1, 3, 0, 1, 0], [1, 1, 0, 2, 0]]
# ----------第2個(gè)聚類----------
# [[3, 3, 0, 0, 1]]
# ----------第3個(gè)聚類----------
# [[3, 2, 1, 2, 1], [4, 1, 1, 1, 0]]

**注: **

  • 本次代碼實(shí)現(xiàn)中采取的類間距離計(jì)算準(zhǔn)則為最短距離法,但并未采取文中介紹的遞推公式壹粟,而是采取的較為簡(jiǎn)單的遍歷方式拜隧,數(shù)據(jù)量較大時(shí),算法效率較低趁仙,讀者有時(shí)間的話可以思考嘗試所介紹的遞推方式洪添。

最后:

本文簡(jiǎn)單的介紹了 聚類算法——層次聚類算法凝聚層次聚類 的相關(guān)內(nèi)容,以及相應(yīng)的代碼實(shí)現(xiàn)雀费,如果有錯(cuò)誤的或者可以改進(jìn)的地方干奢,歡迎大家指出。

代碼地址:聚類算法——層次聚類算法(碼云)

原文地址:聚類算法——層次聚類算法盏袄,也是本人的CSDN賬號(hào)忿峻,歡迎關(guān)注,博客會(huì)第一時(shí)間在CSDN更新辕羽。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末逛尚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子逛漫,更是在濱河造成了極大的恐慌,老刑警劉巖赘艳,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酌毡,死亡現(xiàn)場(chǎng)離奇詭異克握,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)枷踏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)菩暗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人旭蠕,你說(shuō)我怎么就攤上這事停团。” “怎么了掏熬?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵佑稠,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我旗芬,道長(zhǎng)舌胶,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任疮丛,我火速辦了婚禮幔嫂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘誊薄。我一直安慰自己履恩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布呢蔫。 她就那樣靜靜地躺著切心,像睡著了一般。 火紅的嫁衣襯著肌膚如雪咐刨。 梳的紋絲不亂的頭發(fā)上昙衅,一...
    開(kāi)封第一講書(shū)人閱讀 51,190評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音定鸟,去河邊找鬼而涉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛联予,可吹牛的內(nèi)容都是我干的啼县。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼沸久,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼季眷!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起卷胯,我...
    開(kāi)封第一講書(shū)人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤子刮,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體挺峡,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡葵孤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了橱赠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尤仍。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖狭姨,靈堂內(nèi)的尸體忽然破棺而出宰啦,到底是詐尸還是另有隱情,我是刑警寧澤饼拍,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布赡模,位于F島的核電站,受9級(jí)特大地震影響惕耕,放射性物質(zhì)發(fā)生泄漏纺裁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一司澎、第九天 我趴在偏房一處隱蔽的房頂上張望欺缘。 院中可真熱鬧,春花似錦挤安、人聲如沸谚殊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)嫩絮。三九已至,卻和暖如春围肥,著一層夾襖步出監(jiān)牢的瞬間剿干,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工穆刻, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留置尔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓氢伟,卻偏偏與公主長(zhǎng)得像榜轿,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子朵锣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容