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 发布!

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

    关注

    66

    文章

    8377

    浏览量

    132407
  • 深度学习
    +关注

    关注

    73

    文章

    5492

    浏览量

    120975
收藏 人收藏

    评论

    相关推荐

    Java 枚举与策略模式、函数式接口的结合:实现高内低耦合的设计

    作者:京东物流 杨唯一 一、Java 枚举 Java 枚举是一个特殊的,一般表示一组常量,比如一年的 4 个季节,一年的 12 个月份,一个星期的 7 ,方向有东南西北等。 我们在业务需求开发
    的头像 发表于 11-21 14:06 97次阅读

    使用CUDA-Q实现量子算法

    量子计算机能够利用叠加、纠缠和干涉等量子特性,从数据中归纳出知识点并获得洞察。这些量子机器学习(QML)技术最终将在量子加速的超级计算机上运行,这种超级计算机结合了 CPU、GPU 和 QPU 的处理能力,能够解决一些世界上最复杂的难题。
    的头像 发表于 11-20 10:14 140次阅读
    使用CUDA-Q实现量子<b class='flag-5'>聚</b><b class='flag-5'>类</b>算法

    【《时间序列与机器学习》阅读体验】+ 了解时间序列

    收到《时间序列与机器学习》一书,彩色印刷,公式代码清晰,非常精美。感谢作者,感谢电子发烧友提供了一个让我学习时间序列及应用的机会! 前言第一段描述了编写背景: 由此可知,这是一本关于时间序列进行大数
    发表于 08-11 17:55

    6网线和5网线的区别

    网线(Cat6)和五网线(Cat5)是两种不同类型的网络线缆,它们在多个方面存在显著差异。以下是它们之间的主要区别: 1. 传输速率与带宽 五网线:传输速率为100Mbps,带
    的头像 发表于 08-05 09:50 3717次阅读

    名单公布!【书籍评测活动NO.35】如何用「时间序列与机器学习」解锁未来?

    的从业经验。 针对工业界的相关从业者,本书将为你提供实用的工具和技术,以帮助你更好地处理时间序列数据。你将学习到如何使用不同的模型和算法来预测未来、检测异常、进行等。本书中包含大量的示例和案例研究
    发表于 06-25 15:00

    机器人与江苏亨通携手研发人形机器人专用线束

    近日,乐(深圳)机器人技术有限公司与江苏亨通集团达成重要战略合作,共同致力于人形机器人专用线束及相关线缆产品的研发工作。这一举措旨在推动人形机器人线材和线缆连接器的标准化与产业化,为
    的头像 发表于 06-19 09:33 664次阅读

    清华脑视觉芯片取得重大突破,“眸芯”登上Nature封面

    电子发烧友网报道(文/李宁远)5月30日,来自清华大学脑计算研究中心团队的脑互补视觉芯片“眸芯”登上了《Nature》封面。 文章名为“A vision chip
    的头像 发表于 06-01 00:54 4629次阅读
    清华<b class='flag-5'>类</b>脑视觉芯片取得重大突破,“<b class='flag-5'>天</b>眸芯”登上Nature封面

    沃科技SDK使用指南

    本文主要针对SDK如何重定义硬件接口和外设参数进行说明,方便让大家快速灵活使用沃科技SDK。
    的头像 发表于 05-06 10:23 473次阅读
    <b class='flag-5'>聚</b>沃科技SDK使用指南

    全球首创!能技术使信号增强50倍,能型外测液位计解决氯乙烯自(立罐)测量难题!

    本期案例中,用户长期被氯乙烯立罐自的问题所困扰,后期在测量中选用了定华电子创新研发的能型外测液位计,使声呐信号增大50倍,克服立罐内介质自的影响,实现更稳定、更精准的液位测量。 氯乙烯立罐自
    的头像 发表于 04-26 14:22 306次阅读
    全球首创!<b class='flag-5'>聚</b>能技术使信号增强50倍,<b class='flag-5'>聚</b>能型外测液位计解决氯乙烯自<b class='flag-5'>聚</b>(立罐)测量难题!

    水晶头怎么分五和六

    水晶头分为五和六,主要存在以下区别: 标识与带宽:五线的标识是“CAT5”,带宽为100M,适用于百兆以下的网络。而六线的标识是“C
    的头像 发表于 04-17 10:54 4869次阅读

    鸿蒙语言TypeScript学习第16:【

    TypeScript 支持面向对象的所有特性,比如 、接口等。
    的头像 发表于 04-15 09:29 965次阅读
    鸿蒙语言TypeScript<b class='flag-5'>学习</b>第16<b class='flag-5'>天</b>:【<b class='flag-5'>类</b>】

    华为云与乐机器人签署战略合作协议

    华为云与领先的人形机器人创业企业乐机器人近日正式签署战略合作协议,共同致力于探索“华为盘古大模型+夸父人形机器人”的前沿应用场景。此次合作标志着华为云在智能
    的头像 发表于 03-25 10:50 544次阅读

    华为云携手乐机器人,探索人形机器人大模型开发

    根据双方约定,他们还将共同设计并打造一款通用的具身智能解决方案,以构建互通互联的“人形机器人+”开放生态系统。据悉,华为云的先行者——盘古大模型,拥有卓越的语义理解、动态规划以及多模态信号理解等多项能力,为乐机器人大模型的研发
    的头像 发表于 03-22 11:53 698次阅读

    海尔与乐联手推出人形机器人“夸父”

    在近日举行的AWE 2024展会上,海尔机器人与乐机器人共同展出了一款备受瞩目的人形机器人——Kuavo(夸父)。这款机器人不仅是国内首款
    的头像 发表于 03-19 11:33 994次阅读

    元微电子无线温度传感SOC PL51NTXX系列芯片为冷链追溯量身定制

    冷链追溯因要求不同,实现方式有所不同。从现状来看,可实现高精度温度监控、低系统成本的全电子追溯是行业难点。苏州元微电子股份有限公司(下文简称“元微电子”)的无线温度传感SoC PL51NTXX系列,提供了较为理想的解决方案。
    的头像 发表于 12-13 10:18 471次阅读
    <b class='flag-5'>聚</b>元微电子无线温度传感SOC PL51NTXX<b class='flag-5'>系列</b>芯片为冷链追溯量身定制