KMeans+DBSCAN密度聚类+层次聚类的使用(附案例实战)

3f6a7ab0347a4af1a75e6ebadee63fc1.gif

🤵‍♂️ 个人主页:@艾派森的个人主页

✍🏻作者简介:Python学习者
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+


目录

1.KMeans聚类算法

2.DBSCAN密度聚类算法

3.层次聚类

4.实战案例

4.1数据集介绍

4.2加载数据

4.3数据预处理 

4.4Kmeans聚类

4.5DBSCAN密度聚类

4.6层次聚类

4.7总结

文末福利

源代码


 

1.KMeans聚类算法

        kmeans聚类可以说是聚类算法中最为常见的,它是基于划分方法聚类的,原理是先初始化k个簇类中心,基于计算样本与中心点的距离归纳各簇类下的所属样本,迭代实现样本与其归属的簇类中心的距离为最小的目标(如下目标函数)。

9ad2e6f0a84642049288741603ceee49.png

 

其优化算法步骤为:

1.随机选择 k 个样本作为初始簇类中心(k为超参,代表簇类的个数。可以凭先验知识、验证法确定取值);

2.针对数据集中每个样本 计算它到 k 个簇类中心的距离,并将其归属到距离最小的簇类中心所对应的类中;

3.针对每个簇类,重新计算它的簇类中心位置;

4.重复迭代上面 2 、3 两步操作,直到达到某个中止条件(如迭代次数,簇类中心位置不变等)。

关于具体的Kmeans介绍,可参考我之前博文

机器学习之KMeans聚类算法原理(附案例实战)

2.DBSCAN密度聚类算法

        BSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种基于密度的空间聚类算法。它可以替代KMeans和层次聚类等流行的聚类算法。DBSCAN算法将“簇”定义为密度相连的点的最大集合。DBSCAN 算法中有两个重要参数:Eps 和 MmPtS。Eps 是定义密度时的邻域半径,MmPts 为定义核心点时的阈值。

DBSCAN聚类算法原理:

1、DBSCAN通过检查数据集中每个点的r邻域来搜索簇,如果点p的r邻域包含多于MinPts个点,则创建一个以p为核心对象的簇;

2、然后, DBSCAN迭代的聚集从这些核心对象直接密度可达的对象,这个过程可能涉及一些密度可达簇的合并;

3、当没有新的带你添加到任何簇时,迭代过程结束。

2196e66f77e847cba772d6b388a0a922.png

DBSCAN算法的描述如下:

输入:数据集,邻域半径 Eps,邻域中数据对象数目阈值 MinPts;

输出:密度联通簇。

处理流程如下:

1)从数据集中任意选取一个数据对象点 p;

2)如果对于参数 Eps 和 MinPts,所选取的数据对象点 p 为核心点,则找出所有从 p 密度可达的数据对象点,形成一个簇;

3)如果选取的数据对象点 p 是边缘点,选取另一个数据对象点;

4)重复(2)、(3)步,直到所有点被处理。

注意:DBSCAN 算法的计算复杂的度为 O(n),n 为数据对象的数目。这种算法对于输入参数 Eps 和 MinPts 是敏感的。

6bc8b7bfdbab45cf8f4780a49d4ab1f5.png

3.层次聚类

        层次聚类(Hierarchical Clustering)是通过计算不同类别数据点间的相似度来创建一棵有层次的嵌套聚类树,不同类别的原始数据点是树的最低层,树的顶层是一个聚类的根节点。层次聚类算法分为两类:自上而下和自下而上。自下而上的算法在一开始就将每个数据点视为一个单一的聚类,然后依次合并类,直到所有类合并成一个包含所有数据点的单一聚类。

算法过程:

1.首先将每个数据点作为一个单个类,然后根据选择的度量方法计算两聚类之间的距离。

2.对所有数据点中最为相似的两个数据点进行组合,形成具有最小平均连接的组。

3.重复迭代步骤2直到只有一个包含所有数据点的聚类为止。

优点:

  • 无需指定聚类的数量
  • 对距离度量的选择不敏感
  • 当底层数据具有层次结构时,可以恢复层次结构

缺点:时间复杂度为O(n³)

确定聚类数量:对于层次聚类,可以根据聚类过程中,每次合并的两个cluster的距离来作判断,取距离突变处的值为distance_threshold。若数据应当被分为K个簇,K个簇之间会有明显的间距。若合并的两个小簇同属于一个目标簇,那么它们的距离就不会太大。但当合并出来K个目标簇后,再进行合并,则是对K个簇间进行合并了,一般来说,此合并产生的距离就会有非常明显的突变。

4.实战案例

4.1数据集介绍

        本数据集是由249名度假者在2014年10月之前发布的目的地评论组成的。在整个南印度的目的地中,分为6类的评论被考虑,每个评论(旅行者)在每一类的评论计数被记录统计。数据集共有249条,共7列。具体字段信息如下表:

属性

数据类型

属性描述

User Id

Object字符类型

用户唯一的ID

Sports

Int整数类型

对体育场馆、体育综合体等的评论数量

Religious

Int整数类型

对宗教机构的评论数量

Nature

Int整数类型

关于海滩、湖泊、河流等的评论数量

Theatre

Int整数类型

关于剧院、展览等的评论数量

Shopping

Int整数类型

对商场、购物场所等的评论数量

Picnic

Int整数类型

对公园、野餐地点等的评论数量

4.2加载数据

 f0d3eac794cd45a3932e5b0ff3a2d8a8.png

4.3数据预处理 

c69ab6d52f3c4e8c86203c0e333a7296.png

4.4Kmeans聚类

首先使用肘部法则确定K

7f843d93471543dd8da9c95565909788.png

通过图形确定K值为3,使用Kmeans聚类 

 1e96ef015597475d8f5b963632dd7fc0.png

4.5DBSCAN密度聚类

be6e84c4194a48cfafa69710a914ed44.png

4.6层次聚类

dd11fd0f268e4e7d9683bb1aa3aa1b6b.png

4.7总结

        从前面结果中得到的三类聚类算法模型结果中,我们发现KMeans模型和层次聚类模型结果相似,而DBSCAN模型结果与KMeans模型和层次聚类模型结果差距较大。通过查阅相关资料,我们发现可能是在构建BDSCAN模型的时候,参数的选择很重要,参数变化一点点都会对最后的模型造成很大的影响,且由于本次数据集样本较少,对三个模型的结果都有一定的模型,样本数据过少会导致模型的泛化能力较差,不能很好的在实际应用中进行使用。

文末福利

df6892cf72090c3d344feae94e80f8b1.jpeg

参与福利 

  • 抽奖方式:评论区随机抽取2位小伙伴免费送出!
  • 参与方式:关注博主、点赞、收藏、评论区评论“人生苦短,拒绝内卷!”(切记要点赞+收藏,否则抽奖无效,每个人最多评论三次!
  • 活动截止时间:2023-06-05 20:00:00
  •  京东自营店购买链接:https://item.jd.com/13737387.html#crumb-wrap

名单公布时间:2023-06-05 21:00:00   

aeaecc323f224bc092d2259fa7664c22.png

源代码

import pandas as pd
import warnings
warnings.filterwarnings('ignore')
data = pd.read_csv('buddymove_holidayiq.csv')
data.head()
# 数据预处理
data.dropna(inplace=True)  # 删除缺失值
data.drop_duplicates(inplace=True)  # 删除重复值
# 数据标准化
from sklearn.preprocessing import StandardScaler
df = data.drop('User Id',axis=1)
scaler = StandardScaler()
X = scaler.fit_transform(df)
data_scaler = pd.DataFrame(X,columns=df.columns)
data_scaler.head()
KMeans聚类
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #解决中文显示|
plt.rcParams['axes.unicode_minus'] = False   #解决符号无法显示
from sklearn.cluster import KMeans
# 肘部法则
loss = []
for i in range(2,6):
    model = KMeans(n_clusters=i).fit(X)
    loss.append(model.inertia_)
    
plt.plot(range(2,6),loss)
plt.xlabel('k')
plt.ylabel('loss')
plt.show()
from sklearn.cluster import KMeans
k = 3 # 聚成3类
kmodel = KMeans(k)  # 创建聚类模型
kmodel.fit(data_scaler)  # 训练模型
print(pd.Series(kmodel.labels_).value_counts())
pd.Series(kmodel.labels_).value_counts().plot(kind='bar')
plt.title('KMeans聚类的结果')
plt.xlabel('聚类标签')
plt.ylabel('聚类数量')
plt.show()
DBSCAN密度聚类
from sklearn.cluster import DBSCAN
dbscan = DBSCAN(eps=1.1)
# 模型拟合
dbscan.fit(X)
data2 = data_scaler.copy()
data2['dbscan_label'] = dbscan.labels_
print(pd.Series(dbscan.labels_).value_counts())
data2['dbscan_label'].value_counts().plot(kind='bar')
plt.title('DBSCAN密度聚类的结果')
plt.xlabel('聚类标签')
plt.ylabel('聚类数量')
plt.show()
层次聚类
from sklearn.cluster import AgglomerativeClustering 
# n_clusters为集群数,affinity指定用于计算距离的度量,linkage参数中的ward为离差平方和法
Agg_hc = AgglomerativeClustering(n_clusters = 3, affinity = 'euclidean', linkage = 'ward')
y_hc = Agg_hc.fit_predict(data_scaler) # 训练数据
print(pd.Series(y_hc).value_counts())
pd.Series(y_hc).value_counts().plot(kind='bar')
plt.title('层次聚类的结果')
plt.xlabel('聚类标签')
plt.ylabel('聚类数量')
plt.show()

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flink 学习二 Flink 编程基础API

Flink 学习二 Flink 编程基础API 1. 基础依赖引入 <dependency><groupId>org.apache.flink</groupId><artifactId>flink-java</artifactId><version>1.14.4</version></dependency><dependency><groupId>org.apa…

NLP——Topic Modelling

文章目录 A Brief History of Topic ModelsLatent Dirichlet Allocation &#xff08;LDA&#xff09;潜在狄利克雷分布核心思想LDA inputLDA output LDA 如何学习Sampling-based mothods 基于采样的方法Infer Topics For New Documents超参数 Variational methods 变分方法 Ev…

Linux MySQL 索引 事务 存储引擎 死锁

索引&#xff08;面试问得多&#xff09; 索引是一个排序的列表&#xff0c;包含索引字段的值和其相对应的行数据所在的物理地址 作用 加快表的查询速度&#xff0c;还可以对字段排序 如何实现的搜索加速&#xff1f; 没有索引的情况下&#xff0c;要查询某行数据&#xff0c;需…

【JS】中 ?.、??、??= 的用法和含义

今天分享几个处理空值简单的方法&#xff0c;避免使用三目运算、与或、if else时增加冗余的代&#xff0c;希望对大家有帮助。 可选链(?.) let a; let b a.?age; 含义&#xff1a; 可选链&#xff0c;只有当a存在,同时 a 具有 age 属性的时候,才会把值赋给b,否则就会将 u…

TCP的三次握手与四次挥手

TCP的三次握手与四次挥手 1.网络分层 网络分层代表硬件协议/技术特性应用层HTTP,DNS,FTP,SMTP,Telnet协议等应用程序实现的,规定应用程序的数据格式传输层TCP/UDP协议负责两主机之间的数据正确传输主机系统内核实现的网络层路由器IP协议负责地址管理和路由选择(确定对应主机)…

前端Vue自定义简单实用中国省市区三级联动选择器

前端Vue自定义简单实用中国省市区三级联动选择器&#xff0c; 请访问uni-app插件市场地址&#xff1a;https://ext.dcloud.net.cn/plugin?id13118 效果图如下&#xff1a; #### 使用方法 使用方法 <!-- themeColor:主题颜色 ref:设置唯一ref pickerValueDefault:默认选择…

周大福荣获2023亚洲零售大奖——年度珠宝零售商

由成立于1991年、服务于亚洲充满活力的零售业的行业杂志—《亚洲零售杂志》主办的“2023亚洲零售大奖”评选结果于6月15日揭晓&#xff0c;周大福珠宝集团凭借创新和卓越的表现荣获“2023亚洲零售大奖—年度珠宝零售商&#xff08;中国&#xff09;”&#xff0c;是中国唯一入榜…

【kafka】kafka基础架构

文章目录 1、kafka简介2、kafka的特性3、kafka的应用场景4、kafka架构&#xff08;重点&#xff09;4.1、broker4.2、topic4.3、partition4.4、offset4.5、producer4.6、consumer4.7、consumer group4.8、leader4.9、follower4.10、rebalance 5、对kafka架构的几点解释6、几种M…

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(6月 21 日论文合集)

文章目录 一、检测相关(14篇)1.1 CrossKD: Cross-Head Knowledge Distillation for Dense Object Detection1.2 Depth and DOF Cues Make A Better Defocus Blur Detector1.3 Spatiotemporal Pyramidal CNN with Depth-Wise Separable Convolution for Eye Blinking Detection …

Windows 离线安装mysql5.7

一、下载MySQL5.7最新版 1、官网地址 https://downloads.mysql.com/archives/community/ 2、下载MySQL5.7最新版 下载下图所示的安装包&#xff1a; 二、安装MySQL5.7 1、解压 将刚才下载压缩包解压搭配目录C:\software\mysql-5.7.41&#xff0c;&#xff08;路径大家可…

物联网通信技术

通信的技术指标是什么&#xff1f;AB A. 可靠性 B. 有效性 C. 实时性D. 广覆盖 多路复用技术有哪些&#xff1f;ABCD A. FDMA B. CDMA C. SDMA D. TDMA 使用多个频率来传输信号的技术被称为扩展频谱技术&#xff0c;该技术使用的目的是什么&#xff1f; AB A. 抗干扰B. 提…

python机器人编程——差速AGV机器、基于视觉和预测控制的循迹、自动行驶(下篇)

目录 一、前言二、基于轨迹与路面重心偏离度误差的预测自动差速小车循迹控制策略三、轨迹图像的处理要点四、本篇部分核心控制策略python代码&#xff1a;五、结论 一、前言 基于最近的测试&#xff0c;得到了一种粗略控制的算法&#xff0c;其控制效果适合单线路和急转弯的情…

我们该如何提升测试效率?

在大部分研发项目经理心中&#xff0c;进度往往会放在第一位&#xff0c;其次是成本&#xff0c;最后是质量&#xff0c;当然人员队伍最好也要稳定。天下武功&#xff0c;唯快不破&#xff1a;进度 > 成本 > 质量 > 人。 这个说法并不是绝对&#xff0c;今天我们并不是…

高频前端React面试题汇总

近期整理了一下高频的前端面试题&#xff0c;分享给大家一起来学习。如有问题&#xff0c;欢迎指正&#xff01; 一、组件基础 1. React 事件机制 <div onClick{this.handleClick.bind(this)}>点我</div>React并不是将click事件绑定到了div的真实DOM上&#xff0…

DDOS攻击防御实战(威胁情报)

背景&#xff1a; 不知道大家最近有没有关注到&#xff0c;百度云CDN不支持免费了&#xff0c;网站安全问题越来越严重了…… 常见攻击 DDOS Distributed Denial of Service 分布式拒绝服务攻击可以使很多的计算机在同一时间遭受到攻击&#xff0c;使攻击的目标无法正常使用&…

css基础知识六:谈谈你对BFC的理解?

一、是什么 我们在页面布局的时候&#xff0c;经常出现以下情况&#xff1a; 这个元素高度怎么没了&#xff1f;这两栏布局怎么没法自适应&#xff1f;这两个元素的间距怎么有点奇怪的样子&#xff1f; 归根究底是元素之间相互的影响&#xff0c;导致了意料之外的情况&#…

C++完成淄博烧烤节管理系统

背景&#xff1a; 这次我们结合今年淄博烧烤做一个餐厅管理系统&#xff0c;具体需求如下&#xff0c;我们选择的是餐饮商家信息管理 问题描述&#xff1a; 淄博烧烤今年大火&#xff0c;“进淄赶烤”是大家最想干的事情&#xff0c;淄博烧烤大火特火的原因&#xff0c;火的…

X86架构与Arm架构区别

X86架构和ARM架构是主流的两种CPU架构&#xff0c;X86架构的CPU是PC服务器行业的老大&#xff0c;ARM架构的CPU则是移动端的老大。X86架构和arm架构实际上就是CISC与RISC之间的区别&#xff0c;很多用户不理解它们两个之间到底有哪些区别&#xff0c;实际就是它们的领域不太相同…

【前端 - CSS】第 15 课 - 复合选择器

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01; 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、缘起 2、复合选择器 2.1、后代选择器 2.2、子代选择器 2.3、并集选择器 2.4、交集选择器&#xff08;了解&#xff09…

【华为自研】| 国产数据库 GaussDB崛起

目录 GaussDBGaussDB 简介产品优势GaussDB(for openGauss)GaussDB(for MySQL)GaussDB(for Cassandra)GaussDB(for Mongo)GaussDB(for Redis)GaussDB(for Influx) GaussDB GaussDB采用一体化架构&#xff0c;同时支持关系型和非关系型数据库引擎&#xff0c;能够满足政企全方位…