层次聚类算法是机器学习中常用的一种无监督学习算法,它用于将数据分为多个类别或层次。
该方法在计算机科学、生物学、社会学等多个领域都有广泛应用。

层次聚类算法的历史可以追溯到上世纪60年代,当时它主要被用于社会科学中。
随着计算机技术的发展,这种方法在90年代得到了更为广泛的应用。

1. 算法概述

层次聚类的基本原理是创建一个层次的聚类,通过不断地合并或分裂已存在的聚类来实现。
它分为两种策略:

  1. 凝聚策略:初始时将每个点视为一个簇,然后逐渐合并相近的簇
  2. 分裂策略:开始时将所有点视为一个簇,然后逐渐分裂

scikit-learn中,层次聚类的策略有4种

  1. ward:默认策略,也就是最小方差法。它倾向于合并那些使得合并后的簇内部方差最小的两个簇
  2. complete:计算两个簇之间的距离时,考虑两个簇中距离最远的两个样本之间的距离
  3. average:计算两个簇之间的距离时,考虑两个簇中所有样本之间距离的平均值
  4. single:计算两个簇之间的距离时,考虑两个簇中距离最近的两个样本之间的距离

2. 创建样本数据

下面创建月牙形状数据来看看层次聚类的各个策略之间的比较。

from sklearn.datasets import make_moons
import matplotlib.pyplot as plt ax = plt.subplot() X, y = make_moons(noise=0.05, n_samples=1000)
ax.scatter(X[:, 0], X[:, 1], marker="o", c=y, s=25, cmap=plt.cm.prism) plt.show()


关于各种样本数据的生成,可以参考:TODO

3. 模型训练

用四种不同的策略来训练上面月牙形状的样本数据。

from sklearn.cluster import AgglomerativeClustering

# 定义
regs = [
AgglomerativeClustering(linkage="ward"),
AgglomerativeClustering(linkage="complete"),
AgglomerativeClustering(linkage="single"),
AgglomerativeClustering(linkage="average"),
] # 训练模型
for reg in regs:
reg.fit(X, y) fig, axes = plt.subplots(nrows=2, ncols=2)
fig.set_size_inches((10, 8)) # 绘制聚类之后的结果
axes[0][0].scatter(
X[:, 0], X[:, 1], marker="o", c=regs[0].labels_, s=25, cmap=plt.cm.prism
)
axes[0][0].set_title("ward 策略") axes[0][1].scatter(
X[:, 0], X[:, 1], marker="o", c=regs[1].labels_, s=25, cmap=plt.cm.prism
)
axes[0][1].set_title("complete 策略") axes[1][0].scatter(
X[:, 0], X[:, 1], marker="o", c=regs[2].labels_, s=25, cmap=plt.cm.prism
)
axes[1][0].set_title("single 策略") axes[1][1].scatter(
X[:, 0], X[:, 1], marker="o", c=regs[3].labels_, s=25, cmap=plt.cm.prism
)
axes[1][1].set_title("average 策略") plt.show()

从结果可以看出,single策略效果最好,它聚类的结果与原始数据的分类情况最为接近。
不过,这并不能说明single策略由于其它策略,只能说明single策略最适合上面的样本数据。

4. 总结

层次聚类在许多场景中都得到了应用,例如图像分割、文档聚类、生物信息学中的基因聚类等。
它特别适合那些需要多层次结构的应用。

层次聚类的最大优势在于它提供了一种层次结构的聚类,这对于许多应用来说是非常自然的,它能够展示数据在不同粒度下的聚类结果。

但它也存在一些缺点
首先,它的计算复杂度相对较高,特别是当数据量很大时;
其次,一旦做出合并或分裂的决策,就不能撤销,这可能导致错误的累积
此外,确定何时停止合并或分裂也是一个挑战。

【scikit-learn基础】--『监督学习』之 层次聚类的更多相关文章

  1. Python基础『一』

    内置数据类型 数据名称 例子 数字: Bool,Complex,Float,Integer True/False; z=a+bj; 1.23; 123 字符串: String '123456' 元组: ...

  2. Python基础『二』

    目录 语句,表达式 赋值语句 打印语句 分支语句 循环语句 函数 函数的作用 函数的三要素 函数定义 DEF语句 RETURN语句 函数调用 作用域 闭包 递归函数 匿名函数 迭代 语句,表达式 赋值 ...

  3. 『cs231n』计算机视觉基础

    线性分类器损失函数明细: 『cs231n』线性分类器损失函数 最优化Optimiz部分代码: 1.随机搜索 bestloss = float('inf') # 无穷大 for num in range ...

  4. 『计算机视觉』FPN:feature pyramid networks for object detection

    对用卷积神经网络进行目标检测方法的一种改进,通过提取多尺度的特征信息进行融合,进而提高目标检测的精度,特别是在小物体检测上的精度.FPN是ResNet或DenseNet等通用特征提取网络的附加组件,可 ...

  5. Scikit Learn: 在python中机器学习

    转自:http://my.oschina.net/u/175377/blog/84420#OSC_h2_23 Scikit Learn: 在python中机器学习 Warning 警告:有些没能理解的 ...

  6. [原创] 【2014.12.02更新网盘链接】基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装

    [原创] [2014.12.02更新网盘链接]基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装 joinlidong 发表于 2014-11-29 14:25:50 ...

  7. 『TensorFlow』专题汇总

    TensorFlow:官方文档 TensorFlow:项目地址 本篇列出文章对于全零新手不太合适,可以尝试TensorFlow入门系列博客,搭配其他资料进行学习. Keras使用tf.Session训 ...

  8. 『TensorFlow』批处理类

    『教程』Batch Normalization 层介绍 基础知识 下面有莫凡的对于批处理的解释: fc_mean,fc_var = tf.nn.moments( Wx_plus_b, axes=[0] ...

  9. 『TensorFlow』梯度优化相关

    tf.trainable_variables可以得到整个模型中所有trainable=True的Variable,也是自由处理梯度的基础 基础梯度操作方法: tf.gradients 用来计算导数.该 ...

  10. 『TensorFlow』模型保存和载入方法汇总

    『TensorFlow』第七弹_保存&载入会话_霸王回马 一.TensorFlow常规模型加载方法 保存模型 tf.train.Saver()类,.save(sess, ckpt文件目录)方法 ...

随机推荐

  1. Python标准库中隐藏的利器

    Python安装之后,其标准库中有的模块,不一定要通过代码来引用,还可以直接在命令行中使用的. 在命令行中直接使用Python标准库的模块,最大的好处就是就是不用写代码,就能使用其中的功能,当临时需要 ...

  2. Vue项目引用百度地图并实现搜索定位等功能

    Tip:本篇文章为案例分析,技术点较多,所以篇幅较长,认真阅览的你一定会学到很多知识. 前言:百度地图开放平台 给开发者们提供了丰富的地图功能与服务,使我们的项目中可以轻松地实现地图定位.地址搜索.路 ...

  3. 《最新出炉》系列初窥篇-Python+Playwright自动化测试-29-处理日历时间控件-中篇

    1.简介 上一篇的日历时间控件宏哥介绍的比较传统也是很常见的.宏哥不能说它很low,但是相比较一些高端.大气.上档次的日历时间控件,结果就一目了然了:确实很low. 2.被测网站 2.1高大上日历时间 ...

  4. 总结(3)--- 知识总结(内存管理、线程阻塞、GIL锁)

    一.Python中是如何进行内存管理的? 垃圾回收:Python不像C++,Java等语言一样,他们可以不用事先声明变量类型而直接对变量进行赋值.对Python而言,对象的类型和内存都是在运行时确定的 ...

  5. 【Javaweb】五(Service类)

    一般Spring项目中处理业务的层为Service层,称为业务层.目前常见的风格有: 写法:Service层=Service接口+ServiceImpl实现类 AdminServiceImpl.jav ...

  6. RTMP协议学习——Message与Chunk解读

    前言 之前通过对抓包数据的学习和分析,对RTMP协议有了一个整体的认知,大致了解了RTMP从建立连接到播放视频的流程,文章请看<RTMP协议学习--从握手到播放>.但是对于RTMP消息传输 ...

  7. Excel表格函数公式出现溢出怎么办?

    Excel是一款广泛使用的电子表格软件,它可以帮助我们进行各种计算.数据分析与处理等操作.在使用Excel时,我们通常需要使用到各种函数公式来完成不同的任务.然而,在使用函数公式时有时会出现" ...

  8. 构建一个语音转文字的WebApi服务

    构建一个语音转文字的WebApi服务 简介 由于业务需要,我们需要提供一个语音输入功能,以便更方便用户的使用,所以我们需要提供语音转文本的功能,下面我们将讲解使用Whisper将语音转换文本,并且封装 ...

  9. 重写Nacos服务发现逻辑动态修改远程服务IP地址

    背景 还是先说下做这个的背景,开发环境上了K8S,所有的微服务都注册在K8S内的Nacos,注册地址为K8S内部虚拟IP,K8S内的服务之间相互调用没有问题,但是本机开发联调调用其他微服务就访问不到. ...

  10. 【软件安装】Web Tours的安装与启动

    1.下载,地址:https://marketplace.microfocus.com/appdelivery/content/web-tours-sample-application#app_rele ...