0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

100天搞定机器学习:day54 聚类系列:层次聚类原理及案例

电子设计 来源:电子设计 作者:电子设计 2020-12-10 21:56 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

几张GIF理解K-均值聚类原理
k均值聚类数学推导与python实现
前文说了k均值聚类,他是基于中心的聚类方法,通过迭代将样本分到k个类中,使每个样本与其所属类的中心或均值最近。

今天我们看一下无监督学习之聚类方法的另一种算法,层次聚类:

层次聚类前提假设类别直接存在层次关系,通过计算不同类别数据点间的相似度来创建一棵有层次的嵌套聚类树。在聚类树中,不同类别的原始数据点是树的最低层,树的顶层是一个聚类的根节点。创建聚类树有聚合聚类(自下而上合并)和分裂聚类(自上而下分裂)两种方法,分裂聚类一般很少使用,不做介绍。

聚合聚类

聚合聚类具体过程

对于给定的样本集合,开始将每个样本分到一个类,然后再按照一定的规则(比如类间距最小),将满足规则的类进行合并,反复进行,直到满足停止条件。聚合聚类三要素有:

①距离或相似度(闵可夫斯基距离,相关系数、夹角余弦)

②合并规则(最长/短距离,中心距离,平均距离)

③停止条件(类个数或类直径达到或超过阈值)

聚合聚类算法

输入:n个样本组成的样本集合及样本间距离

输出:样本集合的层次化聚类

(1)计算n个样本两两之间欧氏距离{dij}

(2)构造n个类,每个类只包含一个样本

(3)合并类间距最小的两个类,构造一个新类

(4)计算新类与其他各类的距离,若类的个数为1,终止计算,否则回到(3)

动画表示:

python实现及案例

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: 该节点的数值,合并节点时等于原来节点值的平均值
    id:节点的id,包含该节点下的所有单个元素
    left和right:合并得到该节点的两个子节点
    distance:两个子节点的距离
    count:该节点所包含的单个元素个数
    check:标识符,用于遍历时记录该节点是否被遍历过
    '''
    self.value = value
    self.id = id
    self.left = left
    self.right = right
    self.distance = distance
    self.count = count
    self.check = check

def show(self):
    #显示节点相关属性
    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):
    #计算两个节点的距离,可以换成别的距离
    return math.sqrt(pow((x.value-y.value),2))

def minDist(self,dataset):
    #计算所有节点中距离最小的节点对
    mindist = 1000
    for i in range(len(dataset)-1):
        if dataset[i].check == 1:
            #略过合并过的节点
            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
    #返回最小距离、距离最小的两个节点的索引

def fit(self,data):
    dataset = [clusterNode(value=item,id=[(chr(ord('a')+i))],count=1) for i,item in enumerate(data)]
    #将输入的数据元素转化成节点,并存入节点的列表
    length = len(dataset)
    Backup = copy.deepcopy(dataset)
    #备份数据
    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))
        #生成新节点
        if len(tmpid) == length:
            #当新生成的节点已经包含所有元素时,退出循环,完成聚类
            break
    for item in dataset:
        item.show()
    return dataset

def show(self,dataset,num):
    plt.figure(1)
    showqueue = queue.Queue()
    #存放节点信息的队列
    showqueue.put(dataset[len(dataset) - 1])
    #存入根节点
    showqueue.put(num)
    #存入根节点的中心横坐标
    while not showqueue.empty():
        index = showqueue.get()
        #当前绘制的节点
        i = showqueue.get()
        #当前绘制节点中心的横坐标
        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个随机数据
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)

本文由博客一文多发平台 OpenWrite 发布!

审核编辑 黄昊宇
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 机器学习
    +关注

    关注

    67

    文章

    8565

    浏览量

    137228
  • 深度学习
    +关注

    关注

    73

    文章

    5608

    浏览量

    124637
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    速腾创发布“创世”架构,激光雷达开启图像化感知新纪元

    近日,深圳这座科技创新之城迎来了一场行业盛会——速腾创(RoboSense)举办2026 Tech Day技术开放日,正式发布全新“创世”数字化架构,并同步推出两款基于该架构的旗舰SPAD-SoC芯片,标志着激光雷达正式迈入图像化感知新时代,为智能汽车与
    的头像 发表于 04-23 09:55 1229次阅读

    速腾创:一季度激光雷达产品销量飙升204.1% 机器人业务占比首超车载

    4月8日晚间,激光雷达头部企业速腾创披露2026年第一季度销量数据。报告期内,速腾机器人业务延续爆发态势,销量达18.55万台,同比大增1458.8%;同期,公司激光雷达产品总销量为33.03
    的头像 发表于 04-10 10:48 986次阅读
    速腾<b class='flag-5'>聚</b>创:一季度激光雷达产品销量飙升204.1% <b class='flag-5'>机器</b>人业务占比首超车载

    机器人一行到访开放原子开源基金会座谈交流

    3月27日,乐智能(深圳)股份有限公司(简称“乐”)董事长冷晓琨一行到访开放原子开源基金会座谈交流。双方围绕人形机器人产业发展、开源生态建设及数据集共建共享等议题深入探讨、凝聚共识。开放原子开源基金会理事长谢少锋、秘书长助理
    的头像 发表于 03-30 11:30 488次阅读

    如何分辨五网线

    分辨五与六网线的方法如下: 外皮标识 五网线外皮标注“CAT5”,六网线标注“CAT6”。这是最直观的区分方式,标识直接表明网线的类别。 传输性能 五
    的头像 发表于 01-28 10:21 2056次阅读

    飞光电荣获日本NIMS β-Sialon装置专利许可

    近日,深圳市飞光电股份有限公司(以下简称“飞光电”)正式获得日本国立材料科学研究所(National Institute for Materials Science, NIMS)颁发
    的头像 发表于 01-15 17:06 1601次阅读

    看懂C语言程序中的内和耦合

    功能而存在,共同完成一个单一的功能,模块已不可再分。这样的函数功能非常清晰、明确,一般出现在程序结构图的较低被调用的层次上。 次之的是顺序内,一个函数中各个处理元素和同一个功能密切相关,通常前一个
    发表于 12-08 06:37

    中微公司亮相第五届海英才全球创新创业峰会

    近日,以“上海、创未来”为主题的第五届“海英才”全球创新创业峰会于上海举行。“海英才”作为上海人才工作的主品牌、城市吸引力的主名片,不断汇集全球英才逐梦上海、施展才华。
    的头像 发表于 12-04 15:00 604次阅读

    飞光电入选2025深圳企业500强榜单

    近日,深圳市企业联合会、深圳市企业家协会正式发布“2025深圳企业500强榜单”及《2025深圳500强企业发展报告》。飞光电连续八年登榜,位列第275位,同时入选创新能力TOP100分榜单。
    的头像 发表于 11-02 11:49 1270次阅读

    RoboSense速腾创与导远科技达成战略合作

    RoboSense速腾创与导远科技(ASENSING)宣布正式达成战略合作。此次合作,双方将深度融合RoboSense速腾创在激光雷达感知领域的优势与导远科技在精密惯性导航方面的专长,共同开发
    的头像 发表于 10-24 17:56 1406次阅读

    辰EEPROM,工业、汽车、智能眼镜全面开花

      电子发烧友网综合报道,日前,辰半导体对外谈到,公司在工业、AI眼镜、汽车以及DDR5 SPD芯片方面的产品和市场拓展进展。   在工业应用市场,辰具有较深厚的积累,工业级存储芯片现已广泛应用
    的头像 发表于 10-09 03:29 8632次阅读
    <b class='flag-5'>聚</b>辰EEPROM,工业、汽车、智能眼镜全面开花

    网线接口能插六网线吗

    网线接口(RJ45)可以插六网线,但实际使用效果需结合具体场景和设备综合判断。以下是详细分析: 一、物理兼容性:接口通用,但需注意细节 RJ45接口标准统一 五(Cat5)、超五
    的头像 发表于 09-08 10:32 1.8w次阅读

    网线面板分五

    网线面板确实分五和六,这种分类主要基于其适配的网线类型及传输性能,以下是具体说明: 一、分类依据 适配网线类型 五面板:专为五网线(CAT5)设计,适用于百兆以太网(
    的头像 发表于 08-08 09:46 5115次阅读

    华大九“芯系列活动助力集成电路产业蓬勃发展

    华大九希望通过“芯系列活动,打造一个行业精英与企业应用通畅交流的专业平台,营造以“开放、合作、创新”为主体的产业生态圈,促进技术交流、行业合作及成长共享,让每一位参与者都能在
    的头像 发表于 07-22 09:57 1269次阅读

    徽厂家嵌入式工业平板:低功耗技术与卓越性能的完美融合

    在工业智能化发展的浪潮中,嵌入式工业平板作为工业设备与数字化系统连接的重要枢纽,其性能与功耗表现直接影响着工业生产的效率与成本。徽厂家凭借多年的技术积累与创新实践,打造出的嵌入式工业平板,实现了
    的头像 发表于 07-01 17:14 793次阅读

    飞光电总部大厦正式启用

    飞光电大厦位于平湖金融与现代服务业基地核心商圈,占地面积4,186平方米,总建筑面积40,519平方米,楼高99米,是面向未来的企业总部,集综合办公、总部运营、技术研发、商业配套等功能于一身
    的头像 发表于 06-06 15:26 1214次阅读