0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

100天搞定機(jī)器學(xué)習(xí):day54 聚類系列:層次聚類原理及案例

電子設(shè)計(jì) ? 來(lái)源:電子設(shè)計(jì) ? 作者:電子設(shè)計(jì) ? 2020-12-10 21:56 ? 次閱讀

幾張GIF理解K-均值聚類原理
k均值聚類數(shù)學(xué)推導(dǎo)與python實(shí)現(xiàn)
前文說(shuō)了k均值聚類,他是基于中心的聚類方法,通過(guò)迭代將樣本分到k個(gè)類中,使每個(gè)樣本與其所屬類的中心或均值最近。

今天我們看一下無(wú)監(jiān)督學(xué)習(xí)之聚類方法的另一種算法,層次聚類:

層次聚類前提假設(shè)類別直接存在層次關(guān)系,通過(guò)計(jì)算不同類別數(shù)據(jù)點(diǎn)間的相似度來(lái)創(chuàng)建一棵有層次的嵌套聚類樹。在聚類樹中,不同類別的原始數(shù)據(jù)點(diǎn)是樹的最低層,樹的頂層是一個(gè)聚類的根節(jié)點(diǎn)。創(chuàng)建聚類樹有聚合聚類(自下而上合并)和分裂聚類(自上而下分裂)兩種方法,分裂聚類一般很少使用,不做介紹。

聚合聚類

聚合聚類具體過(guò)程

對(duì)于給定的樣本集合,開始將每個(gè)樣本分到一個(gè)類,然后再按照一定的規(guī)則(比如類間距最?。?,將滿足規(guī)則的類進(jìn)行合并,反復(fù)進(jìn)行,直到滿足停止條件。聚合聚類三要素有:

①距離或相似度(閔可夫斯基距離,相關(guān)系數(shù)、夾角余弦)

②合并規(guī)則(最長(zhǎng)/短距離,中心距離,平均距離)

③停止條件(類個(gè)數(shù)或類直徑達(dá)到或超過(guò)閾值)

聚合聚類算法

輸入:n個(gè)樣本組成的樣本集合及樣本間距離

輸出:樣本集合的層次化聚類

(1)計(jì)算n個(gè)樣本兩兩之間歐氏距離{dij}

(2)構(gòu)造n個(gè)類,每個(gè)類只包含一個(gè)樣本

(3)合并類間距最小的兩個(gè)類,構(gòu)造一個(gè)新類

(4)計(jì)算新類與其他各類的距離,若類的個(gè)數(shù)為1,終止計(jì)算,否則回到(3)

動(dòng)畫表示:

python實(shí)現(xiàn)及案例

import queue
import math
import copy
import numpy as np
import matplotlib.pyplot as plt

class clusterNode:

def __init__(self, value, id=[],left=None, right=None, distance=-1,  count=-1, check = 0):
    '''
    value: 該節(jié)點(diǎn)的數(shù)值,合并節(jié)點(diǎn)時(shí)等于原來(lái)節(jié)點(diǎn)值的平均值
    id:節(jié)點(diǎn)的id,包含該節(jié)點(diǎn)下的所有單個(gè)元素
    left和right:合并得到該節(jié)點(diǎn)的兩個(gè)子節(jié)點(diǎn)
    distance:兩個(gè)子節(jié)點(diǎn)的距離
    count:該節(jié)點(diǎn)所包含的單個(gè)元素個(gè)數(shù)
    check:標(biāo)識(shí)符,用于遍歷時(shí)記錄該節(jié)點(diǎn)是否被遍歷過(guò)
    '''
    self.value = value
    self.id = id
    self.left = left
    self.right = right
    self.distance = distance
    self.count = count
    self.check = check

def show(self):
    #顯示節(jié)點(diǎn)相關(guān)屬性
    print(self.value,' ',self.left.id if self.left!=None else None,' ',/
        self.right.id if self.right!=None else None,' ',self.distance,' ',self.count)

class hcluster:

def distance(self,x,y):
    #計(jì)算兩個(gè)節(jié)點(diǎn)的距離,可以換成別的距離
    return math.sqrt(pow((x.value-y.value),2))

def minDist(self,dataset):
    #計(jì)算所有節(jié)點(diǎn)中距離最小的節(jié)點(diǎn)對(duì)
    mindist = 1000
    for i in range(len(dataset)-1):
        if dataset[i].check == 1:
            #略過(guò)合并過(guò)的節(jié)點(diǎn)
            continue
        for j in range(i+1,len(dataset)):
            if dataset[j].check == 1:
                continue
            dist = self.distance(dataset[i],dataset[j])
            if dist < mindist:
                mindist = dist
                x, y = i, j
    return mindist, x, y
    #返回最小距離、距離最小的兩個(gè)節(jié)點(diǎn)的索引

def fit(self,data):
    dataset = [clusterNode(value=item,id=[(chr(ord('a')+i))],count=1) for i,item in enumerate(data)]
    #將輸入的數(shù)據(jù)元素轉(zhuǎn)化成節(jié)點(diǎn),并存入節(jié)點(diǎn)的列表
    length = len(dataset)
    Backup = copy.deepcopy(dataset)
    #備份數(shù)據(jù)
    while(True):
        mindist, x, y = self.minDist(dataset)
        dataset[x].check = 1
        dataset[y].check = 1
        tmpid = copy.deepcopy(dataset[x].id)
        tmpid.extend(dataset[y].id)
        dataset.append(clusterNode(value=(dataset[x].value+dataset[y].value)/2,id=tmpid,/
            left=dataset[x],right=dataset[y],distance=mindist,count=dataset[x].count+dataset[y].count))
        #生成新節(jié)點(diǎn)
        if len(tmpid) == length:
            #當(dāng)新生成的節(jié)點(diǎn)已經(jīng)包含所有元素時(shí),退出循環(huán),完成聚類
            break
    for item in dataset:
        item.show()
    return dataset

def show(self,dataset,num):
    plt.figure(1)
    showqueue = queue.Queue()
    #存放節(jié)點(diǎn)信息的隊(duì)列
    showqueue.put(dataset[len(dataset) - 1])
    #存入根節(jié)點(diǎn)
    showqueue.put(num)
    #存入根節(jié)點(diǎn)的中心橫坐標(biāo)
    while not showqueue.empty():
        index = showqueue.get()
        #當(dāng)前繪制的節(jié)點(diǎn)
        i = showqueue.get()
        #當(dāng)前繪制節(jié)點(diǎn)中心的橫坐標(biāo)
        left = i - (index.count)/2
        right = i + (index.count)/2
        if index.left != None:
            x = [left,right]
            y = [index.distance,index.distance]
            plt.plot(x,y)
            x = [left,left]
            y = [index.distance,index.left.distance]
            plt.plot(x,y)
            showqueue.put(index.left)
            showqueue.put(left)
        if index.right != None:
            x = [right,right]
            y = [index.distance,index.right.distance]
            plt.plot(x,y)
            showqueue.put(index.right)
            showqueue.put(right)
    plt.show()

def setData(num):

#生成num個(gè)隨機(jī)數(shù)據(jù)
Data = list(np.random.randint(1,100,size=num))
return Data

if name == '__main__':

num = 20
dataset = setData(num)
h = hcluster()
resultset = h.fit(dataset)
h.show(resultset,num)

本文由博客一文多發(fā)平臺(tái) OpenWrite 發(fā)布!

審核編輯 黃昊宇
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    【《時(shí)間序列與機(jī)器學(xué)習(xí)》閱讀體驗(yàn)】+ 了解時(shí)間序列

    收到《時(shí)間序列與機(jī)器學(xué)習(xí)》一書,彩色印刷,公式代碼清晰,非常精美。感謝作者,感謝電子發(fā)燒友提供了一個(gè)讓我學(xué)習(xí)時(shí)間序列及應(yīng)用的機(jī)會(huì)! 前言第一段描述了編寫背景: 由此可知,這是一本關(guān)于時(shí)間序列進(jìn)行大數(shù)
    發(fā)表于 08-11 17:55

    6網(wǎng)線和5網(wǎng)線的區(qū)別

    網(wǎng)線(Cat6)和五網(wǎng)線(Cat5)是兩種不同類型的網(wǎng)絡(luò)線纜,它們?cè)诙鄠€(gè)方面存在顯著差異。以下是它們之間的主要區(qū)別: 1. 傳輸速率與帶寬 五網(wǎng)線:傳輸速率為100Mbps,帶
    的頭像 發(fā)表于 08-05 09:50 ?3226次閱讀

    名單公布!【書籍評(píng)測(cè)活動(dòng)NO.35】如何用「時(shí)間序列與機(jī)器學(xué)習(xí)」解鎖未來(lái)?

    的從業(yè)經(jīng)驗(yàn)。 針對(duì)工業(yè)界的相關(guān)從業(yè)者,本書將為你提供實(shí)用的工具和技術(shù),以幫助你更好地處理時(shí)間序列數(shù)據(jù)。你將學(xué)習(xí)到如何使用不同的模型和算法來(lái)預(yù)測(cè)未來(lái)、檢測(cè)異常、進(jìn)行等。本書中包含大量的示例和案例研究
    發(fā)表于 06-25 15:00

    樂(lè)機(jī)器人與江蘇亨通攜手研發(fā)人形機(jī)器人專用線束

    近日,樂(lè)(深圳)機(jī)器人技術(shù)有限公司與江蘇亨通集團(tuán)達(dá)成重要戰(zhàn)略合作,共同致力于人形機(jī)器人專用線束及相關(guān)線纜產(chǎn)品的研發(fā)工作。這一舉措旨在推動(dòng)人形機(jī)器人線材和線纜連接器的標(biāo)準(zhǔn)化與產(chǎn)業(yè)化,為
    的頭像 發(fā)表于 06-19 09:33 ?533次閱讀

    清華腦視覺(jué)芯片取得重大突破,“眸芯”登上Nature封面

    電子發(fā)燒友網(wǎng)報(bào)道(文/李寧遠(yuǎn))5月30日,來(lái)自清華大學(xué)腦計(jì)算研究中心團(tuán)隊(duì)的腦互補(bǔ)視覺(jué)芯片“眸芯”登上了《Nature》封面。 文章名為“A vision chip
    的頭像 發(fā)表于 06-01 00:54 ?4524次閱讀
    清華<b class='flag-5'>類</b>腦視覺(jué)芯片取得重大突破,“<b class='flag-5'>天</b>眸芯”登上Nature封面

    沃科技SDK使用指南

    本文主要針對(duì)SDK如何重定義硬件接口和外設(shè)參數(shù)進(jìn)行說(shuō)明,方便讓大家快速靈活使用沃科技SDK。
    的頭像 發(fā)表于 05-06 10:23 ?411次閱讀
    <b class='flag-5'>聚</b>沃科技SDK使用指南

    全球首創(chuàng)!能技術(shù)使信號(hào)增強(qiáng)50倍,能型外測(cè)液位計(jì)解決氯乙烯自(立罐)測(cè)量難題!

    本期案例中,用戶長(zhǎng)期被氯乙烯立罐自的問(wèn)題所困擾,后期在測(cè)量中選用了定華電子創(chuàng)新研發(fā)的能型外測(cè)液位計(jì),使聲吶信號(hào)增大50倍,克服立罐內(nèi)介質(zhì)自的影響,實(shí)現(xiàn)更穩(wěn)定、更精準(zhǔn)的液位測(cè)量。 氯乙烯立罐自
    的頭像 發(fā)表于 04-26 14:22 ?290次閱讀
    全球首創(chuàng)!<b class='flag-5'>聚</b>能技術(shù)使信號(hào)增強(qiáng)50倍,<b class='flag-5'>聚</b>能型外測(cè)液位計(jì)解決氯乙烯自<b class='flag-5'>聚</b>(立罐)測(cè)量難題!

    水晶頭怎么分五和六

    水晶頭分為五和六,主要存在以下區(qū)別: 標(biāo)識(shí)與帶寬:五線的標(biāo)識(shí)是“CAT5”,帶寬為100M,適用于百兆以下的網(wǎng)絡(luò)。而六線的標(biāo)識(shí)是“C
    的頭像 發(fā)表于 04-17 10:54 ?4610次閱讀

    鴻蒙語(yǔ)言TypeScript學(xué)習(xí)第16:【

    TypeScript 支持面向?qū)ο蟮乃刑匦?,比?、接口等。
    的頭像 發(fā)表于 04-15 09:29 ?900次閱讀
    鴻蒙語(yǔ)言TypeScript<b class='flag-5'>學(xué)習(xí)</b>第16<b class='flag-5'>天</b>:【<b class='flag-5'>類</b>】

    華為云與樂(lè)機(jī)器人簽署戰(zhàn)略合作協(xié)議

    華為云與領(lǐng)先的人形機(jī)器人創(chuàng)業(yè)企業(yè)樂(lè)機(jī)器人近日正式簽署戰(zhàn)略合作協(xié)議,共同致力于探索“華為盤古大模型+夸父人形機(jī)器人”的前沿應(yīng)用場(chǎng)景。此次合作標(biāo)志著華為云在智能
    的頭像 發(fā)表于 03-25 10:50 ?491次閱讀

    華為云攜手樂(lè)機(jī)器人,探索人形機(jī)器人大模型開發(fā)

    根據(jù)雙方約定,他們還將共同設(shè)計(jì)并打造一款通用的具身智能解決方案,以構(gòu)建互通互聯(lián)的“人形機(jī)器人+”開放生態(tài)系統(tǒng)。據(jù)悉,華為云的先行者——盤古大模型,擁有卓越的語(yǔ)義理解、動(dòng)態(tài)規(guī)劃以及多模態(tài)信號(hào)理解等多項(xiàng)能力,為樂(lè)機(jī)器人大模型的研發(fā)
    的頭像 發(fā)表于 03-22 11:53 ?617次閱讀

    海爾與樂(lè)聯(lián)手推出人形機(jī)器人“夸父”

    在近日舉行的AWE 2024展會(huì)上,海爾機(jī)器人與樂(lè)機(jī)器人共同展出了一款備受矚目的人形機(jī)器人——Kuavo(夸父)。這款機(jī)器人不僅是國(guó)內(nèi)首款
    的頭像 發(fā)表于 03-19 11:33 ?917次閱讀

    利安隆擬向宜興創(chuàng)增資2億,收購(gòu)韓國(guó)IPI100%股權(quán)

    據(jù)悉,宜興創(chuàng)已與韓國(guó)IPI除韓國(guó)產(chǎn)業(yè)銀行外所有股東達(dá)成轉(zhuǎn)讓協(xié)議,以約308.65億韓元的代價(jià)收購(gòu)了該公司總計(jì)91.74%的股權(quán)。此外,雙方還簽訂了借款合同,宜興創(chuàng)將向韓國(guó)IPI提供不超過(guò)2000萬(wàn)元人民幣的股東貸款,用于回購(gòu)注銷韓國(guó)產(chǎn)業(yè)銀行持有IPI 8.26%的優(yōu)先
    的頭像 發(fā)表于 01-08 11:29 ?679次閱讀

    元微電子無(wú)線溫度傳感SOC PL51NTXX系列芯片為冷鏈追溯量身定制

    冷鏈追溯因要求不同,實(shí)現(xiàn)方式有所不同。從現(xiàn)狀來(lái)看,可實(shí)現(xiàn)高精度溫度監(jiān)控、低系統(tǒng)成本的全電子追溯是行業(yè)難點(diǎn)。蘇州元微電子股份有限公司(下文簡(jiǎn)稱“元微電子”)的無(wú)線溫度傳感SoC PL51NTXX系列,提供了較為理想的解決方案。
    的頭像 發(fā)表于 12-13 10:18 ?416次閱讀
    <b class='flag-5'>聚</b>元微電子無(wú)線溫度傳感SOC PL51NTXX<b class='flag-5'>系列</b>芯片為冷鏈追溯量身定制

    什么是8網(wǎng)線?8線與七線、超六線的區(qū)別 8線的應(yīng)用

    什么是8網(wǎng)線?8線與七線、超六線的區(qū)別 8線的應(yīng)用? 八網(wǎng)線是一種用于傳輸高速網(wǎng)絡(luò)數(shù)
    的頭像 發(fā)表于 12-07 09:40 ?3093次閱讀