热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python用凝聚层次聚类进行数据分组

本文主要参考《Python机器学习经典实例》  在介绍凝聚层次聚类之前,我们需要先理解层次聚类(hierarchicalclustering)。层次聚类是一组聚类算法,通过不断地分

本文主要参考《Python机器学习经典实例》

    在介绍凝聚层次聚类之前,我们需要先理解层次聚类(hierarchical clustering)。层次聚类是一组聚类算法,通过不断地分解或合并集群来构建树状集群(tree-like clusters)。层次聚类的结构可以用一颗树表示。层次聚类算法可以是自下而上的,也可以是自上而下的。具体是什么含义呢?在自下而上的算法中,每个数据点都被看作是一个单独的集群。这些集群不断地合并,直到所有的集群都合并成一个巨型集群。这被称为凝聚层次聚类。与之相反的是,自上而下层次的算法是从一个巨大的集群开始,不断地分解,直到所有的集群变成一个单独的数据点。

你可以在http://nlp.stanford.edu/IR-book/html/htmledition/hierarchical-agglomerative-clustering-1.html学习更多的内容。

详细步骤

(1) 首先建立agglomerative.py文件,然后导入一些需要用到的程序包:

import numpy as np
import matplotlib.pyplot as plt #用于画图工具
from sklearn.cluster import AgglomerativeClustering #层次聚类
from sklearn.neighbors import kneighbors_graph #最邻近搜索

  临近搜索简单属性介绍 

(2) 定义一个实现凝聚层次聚类的函数:

def perform_clustering(X, connectivity, title, num_clusters=3, linkage='ward'):
    plt.figure()
# 定义凝聚层次聚类模型
    model = AgglomerativeClustering(linkage=linkage,cOnnectivity=connectivity, n_clusters=num_clusters)
    model.fit(X) # 训练模型

(3) 提取标记,然后指定不同聚类在图形中的标记:

labels = model.labels_ # 提取标记
markers = '.vx' # 为每种集群设置不同的标记

(4) 迭代数据,用不同的标记把聚类的点画在图形中:

for i, marker in zip(range(num_clusters), markers):
    # 画出属于某个集群中心的数据点
    plt.scatter(X[labels==i, 0], X[labels==i, 1], s=50,marker=marker, color='k', facecolors='none')
plt.title(title)

注意:看到这里可能会有些有些疑问函数zip()是什么?如果有疑问可点击此链接有详细介绍pythonzip()函数。

如果对plt.scatter()有迟疑的话此处有详细介绍点击打开链,由于篇幅问题这里就不详细解释。

(5) 为了演示凝聚层次聚类的优势,我们用它对一些在空间中是连接在一起、但彼此却非常
接近的数据进行聚类。我们希望连接在一起的数据可以聚成一类,而不是在空间上非常接近的点
聚成一类。下面定义一个函数来获取一组呈螺旋状的数据点:

# 定义函数获取螺旋状的数据点
def get_spiral(t, noise_amplitude=0.5):
    r = t
    x = r * np.cos(t)
    y = r * np.sin(t)
    return add_noise(x, y, noise_amplitude)

(6) 在上面的函数中,我们增加了一些噪声,因为这样做可以增加一些不确定性。下面定义
噪声函数:

def add_noise(x, y, amplitude):
    X = np.concatenate((x, y))
    X += amplitude * np.random.randn(2, X.shape[1])
    return X.T

(7) 我们再定义一个函数来获取位于玫瑰曲线上的数据点(rose curve,又称为rhodonea curve,
极坐标中的正弦曲线):

def get_rose(t, noise_amplitude=0.02):
    # 设置玫瑰曲线方程;如果变量k是奇数,那么曲线有k朵花瓣;如果k是偶数,那么有2k朵花瓣
    k = 5
    r = np.cos(k*t) + 0.25
    x = r * np.cos(t)
    y = r * np.sin(t)
    return add_noise(x, y, noise_amplitude)

(8) 为了增加多样性,我们再定义一个hypotrochoid函数:

def get_hypotrochoid(t, noise_amplitude=0):
    a, b, h = 10.0, 2.0, 4.0
    x = (a - b) * np.cos(t) + h * np.cos((a - b) / b * t)
    y = (a - b) * np.sin(t) - h * np.sin((a - b) / b * t)
    return add_noise(x, y, 0)

(9) 现在可以定义主函数main了:

if __name__=='__main__':
    # 生成样本数据
    n_samples = 500
    np.random.seed(2)
    t = 2.5 * np.pi * (1 + 2 * np.random.rand(1, n_samples))
    X = get_spiral(t)
    # 不考虑螺旋形的数据连接性
    cOnnectivity= None
    perform_clustering(X, connectivity, 'No connectivity')
    # 根据数据连接线创建K个临近点的图形
    cOnnectivity= kneighbors_graph(X, 10, include_self=False)
    perform_clustering(X, connectivity, 'K-Neighbors connectivity')
    plt.show()

注意:如果你看到 __name__==’__main__’不懂得话可以点开此处点击打开链接

(10) 运行代码,可以看到如图1所示的图形(没有用任何连接特征)。

                                                                                 图1

《Python 用凝聚层次聚类进行数据分组》

                                                                                           

(11) 还可以看到如图2所示的图形(使用连接特征)。

                                                                                图2
《Python 用凝聚层次聚类进行数据分组》



推荐阅读
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 本文介绍如何使用 Python 提取和替换 .docx 文件中的图片。.docx 文件本质上是压缩文件,通过解压可以访问其中的图片资源。此外,我们还将探讨使用第三方库 docx 的方法来简化这一过程。 ... [详细]
  • 本文详细介绍了如何在 Windows 环境下使用 node-gyp 工具进行 Node.js 本地扩展的编译和配置,涵盖从环境搭建到代码实现的全过程。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 在创建新的Android项目时,您可能会遇到aapt错误,提示无法打开libstdc++.so.6共享对象文件。本文将探讨该问题的原因及解决方案。 ... [详细]
  • 深入了解 Windows 窗体中的 SplitContainer 控件
    SplitContainer 控件是 Windows 窗体中的一种复合控件,由两个可调整大小的面板和一个可移动的拆分条组成。本文将详细介绍其功能、属性以及如何通过编程方式创建复杂的用户界面。 ... [详细]
  • 在 Flutter 开发过程中,开发者经常会遇到 Widget 构造函数中的可选参数 Key。对于初学者来说,理解 Key 的作用和使用场景可能是一个挑战。本文将详细探讨 Key 的概念及其应用场景,并通过实例帮助你更好地掌握这一重要工具。 ... [详细]
  • 尽管深度学习带来了广泛的应用前景,其训练通常需要强大的计算资源。然而,并非所有开发者都能负担得起高性能服务器或专用硬件。本文探讨了如何在有限的硬件条件下(如ARM CPU)高效运行深度神经网络,特别是通过选择合适的工具和框架来加速模型推理。 ... [详细]
  • 本文将详细探讨Linux pinctrl子系统的各个关键数据结构,帮助读者深入了解其内部机制。通过分析这些数据结构及其相互关系,我们将进一步理解pinctrl子系统的工作原理和设计思路。 ... [详细]
  • Kubernetes 持久化存储与数据卷详解
    本文深入探讨 Kubernetes 中持久化存储的使用场景、PV/PVC/StorageClass 的基本操作及其实现原理,旨在帮助读者理解如何高效管理容器化应用的数据持久化需求。 ... [详细]
author-avatar
闹闹依旧不闹
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有