python聚类分析如何可视化?

news2024/11/17 9:31:01

前言

聚类分析是一类将数据所对应的研究进行分类的统计方法。这一类方法的共同特点是,事先不知道类别的个数与结构;进行分析的数据是表明对象之间的相似性或相异性的数据,将这些数据看成对对象“距离”远近的一种度量,将距离近的对象归入一类,不同类对象之间的距离较远。

聚类分析根据对象的不同分为Q型聚类分析和R型聚类分析,其中,Q型聚类是指对样本的聚类,R型聚类是指对变量的聚类。本节主要介绍Q型聚类。

(文末送读者福利)

一、距离和相似系数

1.1、距离

在聚类过程中,相距较近的样本点倾向于归为一类,相距较远的样本点应归属于不同的类。最常用的是Minkowski距离。

当各变量的单位不同或变异性相差很大时,不应直接采用Minkowski距离,而应先对各变量的数据做标准化处理,然后用标准化后的数据计算距离。

使用SciPy库spatial模块下的distance子模块可以计算距离,使用该子模块下的pdist函数可以计算n维空间中观测值之间的距离,其语法格式如下:

scipy.spatial.distance.pdist(X,metric='euclidean',p=None,w=None,V=None,VI=None)
# X:接受ndarray,表示需要计算距离的数据。无默认值
# metric:接受特定str或function,表示进行计算距离的方法。
取值为euclidean时,表示欧式距离;
取值为minkowski时,表示Minkowski距离;
取值为cityblock时,表示绝对值距离;
取值为cosine时,表示夹角余弦。默认为euclidean

例子:设有5个样本(x1,x2,…,x5),每个样本只测量了一个指标,分别是1、2、5、9、13,请采用绝对值距离求这5个样本的距离矩阵。

import numpy as np
from scipy import spatial
data = np.array([[1,2,5,9,13]])
dist1 = spatial.distance.pdist(data.T,'cityblock')
print('距离矩阵为:\n', dist1)

输出结果:

距离矩阵为:
 [ 1.  4.  8. 12.  3.  7. 11.  4.  8.  4.]

1.2、相似系数 (文末送读者福利)

在对变量进行聚类时,常常采用相似系数进行变量之间相似性的度量,相似系数(或其绝对值)越大,认为变量之间的相似性程度就越高,反之越低。聚类时,相似系数高的变量聚类倾向于归为一类,相似系数低的变量归属不同的类。

在Python中采用夹角余弦度量变量之间的相似度。

例子:某篮球联赛共计257名篮球运动员,下表展示了他们的赛季场均得分(PPG)、场均篮板(RPG)和场均助攻(ARG)的前10条记录,试采用夹角余弦度量每个球员之间的相似度

在这里插入图片描述

import scipy.cluster.hierarchy as sch
ball = np.loadtxt(r'D:/data/basketball.csv ', delimiter= ',') 
dist2 = sch.distance.pdist(ball,'cosine') 
print('每个变量之间的相似度为:\n', dist2)

结果输出:

每个变量之间的相似度为:
 [0.08784095 0.20554827 0.15998659 ... 0.0228912  0.27088262 0.22936317]

二、系统聚类法

系统聚类法也称为层次聚类法,其基本思想为:开始时将n个样本各自为一类,并规定样本之间的距离和类与类之间的距离,然后将距离最近的两类合并成一个新类,再计算新类与其他类的距离;重复进行两个最近类的合并,每次减少一类,直至所有样本合并成一类。

2.1、最短距离法

定义类与类之间的距离为两类最近样本间的距离,这种系统聚类法称为最短距离法或单连接法(Single Linkage Method)。

使用SciPy库cluster模块的hierarchy子模块可以实现系统聚类,使用该子模块下的linkage函数可以实现最短距离法、最长距离法、类平均法和重心法等,其语法格式如下。

scipy.cluster.hierarchy.linkage(y,method='single',metric='euclidean')
# y:接受ndarray,表示需要聚类的数据。无默认值
# method:接受str,表示计算聚类的方法。
取值为single时,表示最短距离法;
取值为complete时,表示最长距离法;
取值为average时,表示类平均法;
取值为ward时,表示离差平方和法(ward法)等。默认为single
# metric:接受特定str或function,表示在y是观测向量集合的情况下使用的计算距离的方法。
取值为euclidean时,表示欧式距离;
取值为minkowski时,表示Minkowski距离;
取值为cityblock时,表示绝对值距离;
取值为cosine时,表示夹角余弦。默认为euclidean

例子:对1.1的例子的5个样本(x1,x2,…,x5)采用最短距离法进行聚类。

import matplotlib.pylab as plt
import numpy as np
import scipy.cluster.hierarchy as sch
plt.rcParams['font.sans-serif']=['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False    # 用来正常显示负号
data = np.array([[1,2,5,9,13]])
#Min = sch.linkage(dist1, method='single')                       # 方法一
Min = sch.linkage(data.T, method='single', metric='cityblock')  # 方法二
P = sch.dendrogram(Min)
plt.xlabel('类别标签')
plt.ylabel('距离')
plt.savefig('D:/data/最短距离法聚类结果.png')
plt.show()

在这里插入图片描述

2.2、最长距离法

定义类与类之间的距离为两类最远样本间的距离,这种系统聚类法称为最长距离法或完全连接法(Complete Linkage Method),最短距离法和最长距离法的并类步骤的区别在于类间距离的递推公式不同。

例子:对1.1的例子的5个样本(x1,x2,…,x5)采用最长距离法进行聚类。

import matplotlib.pylab as plt
import numpy as np
import scipy.cluster.hierarchy as sch
plt.rcParams['font.sans-serif']=['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False    # 用来正常显示负号
data = np.array([[1,2,5,9,13]])
#Max1 = sch.linkage(dist1, method='complete')                       # 方法一
Max1 = sch.linkage(data.T, method='complete', metric='cityblock')  # 方法二
P = sch.dendrogram(Max1)
plt.xlabel('类别标签')
plt.ylabel('距离')
plt.savefig('D:/data/最长距离法聚类结果1.png')
plt.show()

在这里插入图片描述
2.3、类平均法

平均法或平均连接法(Average Linkage Method)有两种定义,一种定义方法是把类与类之间的距离定义为所有样本对之间的平均距离。

另一种定义方法是定义类与类之间的平方距离为样本对之间的平方距离的平均值。

例子:在Python中,对1.1的例子的5个样本(x1,x2,…,x5)的数据采用类平均法对球员进行聚类。

import matplotlib.pylab as plt
import numpy as np
import scipy.cluster.hierarchy as sch
plt.rcParams['font.sans-serif']=['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False    # 用来正常显示负号
data = np.array([[1,2,5,9,13]])
#Ave1 = sch.linkage(dist1, method='average')  # 方法一
Ave1 = sch.linkage(data.T, method='average', metric='cityblock')  # 方法二
P = sch.dendrogram(Ave1)
plt.xlabel('类别标签')
plt.ylabel('距离')
plt.savefig('D:/data/类平均法聚类结果1.png')
plt.show()

三、 K-Means聚类法

基本步骤:

第一步:从n个样本数据中随机选取k个对象作为初始的聚类中心。
第二步:分别计算每个样本到各个聚类质心的距离,将样本分配到距离最近的那个聚类中心类别中。
第三步:所有样本分配完成后,重新计算k个聚类的中心。
第四步:与前一次计算得到的k个聚类中心比较,如果聚类中心发生变化,转第二步,否则转第五步。
第五步:当中心不再发生变化时,停止并输出聚类结果。

使用SciPy库cluster模块的vq子模块可以实现K-Means聚类。使用该子模块下的kmeans函数或kmeans2函数可以返回最终的聚类中心,语法格式如下

scipy.cluster.vq.kmeans(obs,k_or_guess,iter=20,thresh=1e-05,check_finite=Ture)
# obs:接收ndarray,表示需要进行的聚类的数据。无默认值
# k_or_guess:接收 int或ndarray,表示聚类的个数。无默认值
# iter:接收int,表示迭代的次数。默认为20
scipy.cluster.vq.kmeans2(data,k,iter=10,thresh=1e-05,minit='random',missing='warn',check_finite=Ture)
# data:接收ndarray,表示需要进行的聚类的数据。无默认值
# k:接收 int或ndarray,表示聚类的个数。无默认值
# iter:接收int,表示迭代的次数。默认为10

在使用kmeans函数或kmeans2函数聚类前,都需用whiten函数对数据的每个变量的观测值进行单位化,语法格式如下。

scipy.cluster.vq.whiten(obs,check_finite=Ture)
# obs:接收ndarray,表示需要进行单位化的数据。无默认值

例子:在Python中,对例1.2中的球员场均得分、篮板助攻的数据采用K-Means聚类法对球员进行聚类,指定聚类的个数k=2

import numpy as np
import scipy.cluster.vq as vq
import matplotlib.pylab as plt
ball = np.loadtxt(r'D:/data/basketball.csv ', delimiter= ',')
data1 = vq.whiten(ball)  # 对数据进行单位化

# 方法一
kmeans_cent1 = vq.kmeans2(data1, 2)
print('聚类中心为:\n', kmeans_cent1[0])

# 方法二
kmeans_cent2 = vq.kmeans(data1, 2)
print('聚类中心为:\n', kmeans_cent2[0])

# 画出单位化后和聚类中心的散点图
p = plt.figure(figsize=(9,9))
for i in range(3):
    for j in range(3):
        ax = p.add_subplot(3,3,i*3+1+j)
        plt.scatter(data1[:, j], data1[:, i])
        plt.scatter(kmeans_cent2[0][:, j], kmeans_cent2[0][:, i], c='r')
plt.savefig('D:/data/K-Means聚类法聚类结果.png')
plt.show()

输出结果:

聚类中心为:
 [[0.23038297 0.55161329 0.5646255 ]
 [2.14466124 1.49294345 1.29623859]]

待续……python数据分析-主成分分析。

读者福利:知道你对Python感兴趣,还准备了这套python学习资料

对于0基础小白入门:

如果你是零基础小白,想快速入门Python是可以考虑的。

一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以找到适合自己的学习方案

包括:Python web开发,Python爬虫,Python数据分析,人工智能、机器学习等学习教程。带你从零基础系统性的学好Python!

零基础Python学习资源介绍

👉Python学习路线汇总👈

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取哈)

👉Python必备开发工具👈

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末

👉Python学习视频600合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

👉实战案例👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

👉100道Python练习题👈

检查学习结果。

👉面试刷题👈



在这里插入图片描述

资料领取

上述这份完整版的Python全套学习资料已经上传CSDN官方,朋友们如果需要可以微信扫描下方CSDN官方认证二维码输入“领取资料” 即可领取

在这里插入图片描述

好文推荐

了解python的前景:https://blog.csdn.net/xiqng17111342931/article/details/127705925

了解python的副业:https://blog.csdn.net/xiqng17111342931/article/details/127872402

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/31305.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

制作一个简单HTML传统端午节日网页(HTML+CSS)7页 带报告

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 传统春节网页设计 | 圣诞节节日发展 | 中秋 | 端午传统节日习俗庆祝 | 地区特色 | 网站模板 | 等网站的设计与制 | HTML期末大学生网页设计作业 HTML&…

#边学边考 必修5 高项:对人管理 第2章 项目沟通管理和干系人管理

答题报告 自我分析 有可能是间隔时间太长,本章节从开始学习到今天(11.24)学完,中间至少停止了1周以上,造成对基本知识记忆不牢固。对重点知识没有重点记忆,走马观花,以至于混淆。 答题解析 关…

Android Jetpack之LiveData源码分析

LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 activity、fragment 或 service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的…

DeFi:解决 EIP-4626 中的滑点问题

DeFi:解决 EIP-4626 中的滑点问题 简介 EIP-4626提供了一种将代币投资到投资池(通常称为金库)的标准方法。当我们存入自己的资产(ERC-20 代币)时,我们会收到一个份额代币,代表我们在金库里的资产。金库将把汇集的资产…

力扣 234. 回文链表

力扣 234. 回文链表 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 示例 1: 输入:head [1,2,2,1] 输出:true示例 2: 输入&…

快速排序算法 QuickSort algorithm

该算法是托尼霍尔在1960年提出。 算法思想:从集合中随机取一个数作为支点,然后将比它大的数放在一个集合里,比它小的数放在另一个集合中,然后再递归下去,最后便可求得有序的数组。 QuickSort(A) 1: S− {}; S {}; …

LeetCode栈和队列练习

文章目录前言1.力扣20. 有效的括号1.题目分析2.代码示现2.力扣225. 用队列实现栈1.题目分析2.代码实现3.力扣232. 用栈实现队列1.题目分析2.代码实现4.力扣622. 设计循环队列1.题目分析2.代码实现5.总结前言 之前的博客介绍的栈和队列的实现,本文将会对栈和队列的使…

Unity - Shader - Projector 高空云层底下透明阴影

Semitransparent Shadow - Alpha Test SoftShadow 这种方式我最早是在 cat like coding 博主的文章看到的,这种方式我自己亲自测试过 缺点:会有阴影抖动严重的现象 (其中的 dithering tex 可以参考我之前写的:Unity - 手动创建…

【图神经网络论文整理】(六)—— Universal Graph Transformer Self-Attention Networks

Dai Quoc Nguyen, Tu Dinh Nguyen, Dinh PhungThe ACM Web Conference 2022 (WWW 22)Computer Vision and Pattern Recognition论文地址 本文介绍的论文是《Universal Graph Transformer Self-Attention Networks》。 该篇文章的主要贡献是将Transformer应用在GNN中用于学习图…

Java Spring Bean的实例化

Java Spring Bean的实例化 Spring框架支持两种方式去进行Bean的管理:BeanFactory、ApplicationContext BeanFactory:pom文件引入spring-context坐标,创建对应的待IOC类,然后在bean.xml注入,最后在调用处初始化BeanFa…

【数据结构】树与二叉树

目录 树的定义 二叉树的定义 二叉树的性质 满二叉树 完全二叉树 二叉树的存储结构 顺序存储结构 链式存储结构 遍历二叉树(递归) 二叉树的层次遍历 先序创建二叉树 复制二叉树 销毁二叉树 写在最后 树的定义 树是n个结点的有限集&#xf…

微信小程序中生成普通二维码,并根据二维码里的参数跳转对应的页面

微信小程序中生成普通二维码,并根据二维码里的参数跳转对应的页面1.打开[微信公众平台](https://mp.weixin.qq.com/)使用encodeURIComponent()对参数进行转码第一步:对要传递的参数进行编码第二步:生成二维码第三步:小程序中转页面…

电子元器件B2B电商平台建设方案:优化企业商流,拓宽B2B交易渠道

随着5G、汽车电子、物联网等新兴产业的发展,促进了相关电子元器件的市场需求快速增长。根据工信部预计,2023年我国电子元器件销售总额将达到2.1万亿元。而在互联网高速发展的今天,电子元器件交易在线化是必然趋势,B2B电子元器件线…

maven学习:引入

你是否早已厌倦了日复一日的手工构建工作?你是否对各个项目风格迥异的构建系统感到恐惧?Maven——Maven 的正确发音是[ˈmevən],而不是“马瘟”以及其他什么瘟。Maven 在美国是一个口语化的词语,代表专家、内行的意思。这一Java社…

自回归滞后模型进行多变量时间序列预测

下图显示了关于不同类型葡萄酒销量的月度多元时间序列。每种葡萄酒类型都是时间序列中的一个变量。 假设要预测其中一个变量。比如,sparkling wine。如何建立一个模型来进行预测呢? 一种常见的方法是将该变量其视为单变量时间序列。这样就有很多方法可以…

【从零开始学微服务】04.微服务架构的特点

大家好,欢迎来到万猫学社,跟我一起学,你也能成为微服务专家。 微服务架构被技术大牛们总结出了以下九个特点: 服务组件化围绕业务功能产品而不是项目强终端弱管道去中心化管理去中心化数据管理基础设施自动化容错性设计演进式设计…

Python 快速入门

文章目录Python 快速入门1 环境配置1.1 简介1.2 Python 安装1.3 其余软件1.4 编辑器的使用2 基础语法2.1 特点2.2 代码块2.3 注释3 数据类型3.1 变量类型3.2 数据结构3.3 运算符3.3.1 逻辑运算符3.3.2 比较运算符3.3.3 算术运算符3.3.4 布尔运算符4 流程语句4.1 循环语句4.1.1 …

Android App网络通信中通过okhttp调用HTTP接口讲解及实战(包括GET、表单格式POST、JSON格式POST 附源码)

需要全部源码或运行有问题请点赞关注收藏后评论区留言~~~ 一、通过okhttp调用HTTP接口 尽管使用HttpURLConnection能够实现大多数的网络访问操作,但是操作过于繁琐,于是Andorid从9.0是使用okhttp这个框架 由于okhttp属于第三方框架 所以使用前要修改模…

我们的程序是如何跑起来的?

1.我们写的代码写完并测试以后是如何部署给用户使用的? 1. 准备所需要的服务器 2. 在服务器上安装JDK、mysql、redis、Tomcat、Nginx等环境 3. 进行mysql、redis、nginx的连接配置 4. 项目打包。前端构建打包成功后在根目录dist文件夹中;后端打成jar包&#xff0c…

基于改进海洋捕食者算法求解单目标优化问题附matlab代码(NMPA)

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …