Python大数据分析——DBSCAN聚类模型(密度聚类)

news2024/9/23 3:27:07

Python大数据分析——DBSCAN聚类模型

  • 介绍
  • 数学基础
  • 模型步骤
  • 函数
  • 密度聚类对比Kmeans聚类
    • 球形簇聚类情况
    • 非球形簇的情况
  • 示例

介绍

Kmeans聚类存在两个致命缺点,一是聚类效果容易受到异常样本点的影响(因为求的是均值,而异常值对于均值聚类非常容易受到异常点影响);二是该算法无法准确地将非球形样本进行合理的聚类。
基于密度的聚类则可以解决非球形簇的问题,“密度”可以理解为样本点的紧密程度,如果在指定的半径领域内,实际样本量超过给定的最小样本量阈值,则认为是密度高的对象,就可以聚成一个簇。

数学基础

对于几个数学概念我们做下讲解:
在这里插入图片描述
直接密度可达:是在领域内的点到中心点;
密度可达:是各个领域的中心点,也就是核心点直接的距离;
举例说明:
在这里插入图片描述
除此之外还有四点数学概念:
在这里插入图片描述
举例说明:
在这里插入图片描述
在这里插入图片描述

模型步骤

  1. 为密度聚类算法设置一个合理的半径c以及ε领域内所包含的最少样本量MinPts。
  2. 从数据集中随机挑选一个样本点p,检验其在ε领域内是否包含指定的最少样本量,如果包含就将其定性为核心对象,并构成一个簇C;否则,重新挑选一个样本点。
  3. 对于核心对象p所覆盖的其他样本点q,如果点q对应的ε领域内仍然包含最少样本量MinPts,就将其覆盖的样本点统统归于簇C。
  4. 重复步骤(3),将最大的密度相连所包含的样本点聚为一类,形成一个大簇。
  5. 完成步骤(4)后,重新回到步骤(2),并重复步骤(3)和(4),直到没有新的样本点可以生成新簇时算法结束。

这个模型的缺点就是我们需要靠经验得到合理半径c,而无其他办法。

函数

cluster.DBSCAN(eps=0.5, min_samples=5, metric=‘euclidean’, p=None)
eps:用于设置密度聚类中的e领域,即半径,默认为0.5
min_samples:用于设置e领域内最少的样本量,默认为5
metric:用于指定计算点之间距离的方法,默认为欧氏距离
p:当参数metric为闵可夫斯基(‘minkowski’)距离时,p=1,表示计算点之间的曼哈顿距离;p=2,表示计算点之间的欧氏距离;该参数的默认值为2

密度聚类对比Kmeans聚类

球形簇聚类情况

Kmeans聚类效果:
在这里插入图片描述
密度聚类效果:
在这里插入图片描述
我们发现密度聚类能排除这个异常值点,说明效果更好。

非球形簇的情况

Kmeans聚类效果:
在这里插入图片描述
密度聚类效果:
在这里插入图片描述
发现非球形要用密度聚类

示例

  1. 导入功能包
# 导入第三方模块
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import cluster

注:
在最新的sklearn版本中导入模块from sklearn.datasets.samples_generator import make_blobs时报错:ModuleNotFoundError: No module named ‘sklearn.datasets.samples_generator’,因为已经删除samples_generator了,我们需要改为from sklearn.datasets import make_blobs

  1. 读取数据,查看分布
# 读取外部数据
Province = pd.read_excel(r'D:\pythonProject\data\Province.xlsx')
Province.head()
# 绘制出生率与死亡率散点图
plt.scatter(Province.Birth_Rate, Province.Death_Rate, c = 'steelblue')
# 添加轴标签
plt.xlabel('Birth_Rate')
plt.ylabel('Death_Rate')
# 显示图形
plt.show()

在这里插入图片描述

  1. 数据处理
    首先进行标准化处理(对于量纲不一致的必须需要进行标准化处理,但这里都是百分比其实可以不做的):
# 读入第三方包
from sklearn import preprocessing
# 选取建模的变量
predictors = ['Birth_Rate','Death_Rate']
# 变量的标准化处理
X = preprocessing.scale(Province[predictors])
X = pd.DataFrame(X)

再循环迭代ε,也就是eps,对每一次组合进行一次聚类,从而寻找最佳组合:

# 构建空列表,用于保存不同参数组合下的结果
res = []
# 迭代不同的eps值
for eps in np.arange(0.001,1,0.05):
    # 迭代不同的min_samples值
    for min_samples in range(2,10):
        dbscan = cluster.DBSCAN(eps = eps, min_samples = min_samples)
        # 模型拟合
        dbscan.fit(X)
        # 统计各参数组合下的聚类个数(-1表示异常点)
        n_clusters = len([i for i in set(dbscan.labels_) if i != -1])
        # 异常点的个数
        outliners = np.sum(np.where(dbscan.labels_ == -1, 1,0))
        # 统计每个簇的样本个数
        stats = str(pd.Series([i for i in dbscan.labels_ if i != -1]).value_counts().values)
        res.append({'eps':eps,'min_samples':min_samples,'n_clusters':n_clusters,'outliners':outliners,'stats':stats})
# 将迭代后的结果存储到数据框中        
df = pd.DataFrame(res)
df

在这里插入图片描述
其中eps是ε也就是范围;min_simples指定的最小样本量;n_clusters形成的簇的数量;outliners形成的异常点的个数;stats一个簇的里面的样本个数

我们根据经验:簇类均匀,不要让异常点过多,也就是综合平均选择参数。我们挑选到3可能是适合的

# 根据条件筛选合理的参数组合
df.loc[df.n_clusters == 3, :]

在这里插入图片描述
通过发现每个簇的样本数量不要差异太大,发现0.801是合适的,也就是[17 7 3]

  1. 结果分类
    通过上面分析的数据得到的我们认为可靠的参数值,来拟合分析分类
# 中文乱码和坐标轴负号的处理
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False

# 利用上述的参数组合值,重建密度聚类算法
dbscan = cluster.DBSCAN(eps = 0.801, min_samples = 3)
# 模型拟合
dbscan.fit(X)
Province['dbscan_label'] = dbscan.labels_
# 绘制聚类聚类的效果散点图
sns.lmplot(x = 'Birth_Rate', y = 'Death_Rate', hue = 'dbscan_label', data = Province,
           markers = ['*','d','^','o'], fit_reg = False, legend = False)
# 添加省份标签
for x,y,text in zip(Province.Birth_Rate,Province.Death_Rate, Province.Province):
    plt.text(x+0.1,y-0.1,text, size = 8)
# 添加参考线
plt.hlines(y = 5.8, xmin = Province.Birth_Rate.min(), xmax = Province.Birth_Rate.max(), 
           linestyles = '--', colors = 'red')
plt.vlines(x = 10, ymin = Province.Death_Rate.min(), ymax = Province.Death_Rate.max(), 
           linestyles = '--', colors = 'red')
# 添加轴标签
plt.xlabel('Birth_Rate')
plt.ylabel('Death_Rate')
# 显示图形
plt.show()

在这里插入图片描述
五角星代表的是四个异常值,其余的分布为类别

我们可以对比下Kmeans聚类来分析下(这里面采用的是轮廓系数法):

  1. 首先轮廓系数法分析
# 导入第三方模块
from sklearn import metrics
# 构造自定义函数,用于绘制不同k值和对应轮廓系数的折线图
def k_silhouette(X, clusters):
    K = range(2,clusters+1)
    # 构建空列表,用于存储个中簇数下的轮廓系数
    S = []
    for k in K:
        kmeans = cluster.KMeans(n_clusters=k)
        kmeans.fit(X)
        labels = kmeans.labels_
        # 调用字模块metrics中的silhouette_score函数,计算轮廓系数
        S.append(metrics.silhouette_score(X, labels, metric='euclidean'))

    # 中文和负号的正常显示
    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
    plt.rcParams['axes.unicode_minus'] = False
    # 设置绘图风格
    plt.style.use('ggplot')    
    # 绘制K的个数与轮廓系数的关系
    plt.plot(K, S, 'b*-')
    plt.xlabel('簇的个数')
    plt.ylabel('轮廓系数')
    # 显示图形
    plt.show()
    
# 聚类个数的探索
k_silhouette(X, clusters = 10)

在这里插入图片描述
发现类别数为3是合适的

  1. 利用Kmeans聚类分析
    通过得到的K值,来拟合分析,查看聚类效果:
# 利用Kmeans聚类
kmeans = cluster.KMeans(n_clusters = 3)
# 模型拟合
kmeans.fit(X)
Province['kmeans_label'] = kmeans.labels_
# 绘制Kmeans聚类的效果散点图
sns.lmplot(x = 'Birth_Rate', y = 'Death_Rate', hue = 'kmeans_label', data = Province,
           markers = ['d','^','o'], fit_reg = False, legend = False)
# 添加轴标签
plt.xlabel('Birth_Rate')
plt.ylabel('Death_Rate')
plt.show()

在这里插入图片描述
所不同的是,有无异常点和这些点的归属问题

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

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

相关文章

移动UI:阅读类应用如何从设计上吸引读者?

阅读类应用的用户界面设计对于吸引读者和提升用户体验至关重要。 以下是一些设计上的建议,可以帮助阅读类应用吸引读者: 1. 清晰的内容布局: 确保内容排版清晰,字体大小适中,行间距和段落间距合适,让用户…

纯技巧,伦敦金投资入门阶段怎么学习K线?

投资者刚进入伦敦金市场,都需要学习一定的交易知识,否则没办法在市场中立足。而K线很可能是我们做伦敦金投资入门时第一个碰到的需要学习的理论。下面我们就来讨论一下,在投资入门阶段,我们怎么学习K线。其实作为伦敦金投资的工具…

vega ai创作平台官网基础教程-文生图功能使用

我们都知道vega ai创作平台是右脑科技公司发布的一款革新性的在线AI艺术创作工具,它凭借先进的人工智能技术,为艺术家们打开了一扇通往无限创作可能的大门。无论是将文字灵感转化为视觉艺术,还是通过融合多张图片来训练出独特的艺术风格&…

2024.8.12

2024.8.12 【梦最让我费解的地方在于&#xff0c;明明你看不清梦里人们的脸&#xff0c;却清晰地知道他们是谁。】 Monday 七月初九 序理论 最小链覆盖&最长反链长度 我们设定一个二元关系符R和一个集合A 我们设定<A,R>这样一个类群&#xff0c;那么对于任意 a i…

酒店行业如何利用XML进行营销短信

随着信息社会的到来&#xff0c;消费者获得会所的服务也从单纯的电话方式&#xff0c;逐渐转变为电话、互联网、传真&#xff0c;群发短信等多种媒体并行的方式。今天着重介绍下酒店行业如何利用短信平台进行营销。 群发短信业务对酒店起到的效率&#xff1a;根据新产品或服务向…

20240813 每日AI必读资讯

Flux生成网红博主因太逼真爆火&#xff01;有人用Claude写代码识破“AI美女” - Flux生成的情侣合照逼真程度达到恐怖级别&#xff0c;挑战人类视觉辨识能力。 - 网友发现Flux生成的照片几乎完美&#xff0c;但仍有细微瑕疵可供识别。 - 有人利用Flux等工具制作逼真的YouTub…

分班查询一键发布,老师们都在用

新学期的钟声即将敲响&#xff0c;校园里又将迎来一批充满好奇和期待的新生。对于老师们来说&#xff0c;这不仅仅是一个新起点&#xff0c;更是一项挑战——如何高效而准确地将新生的分班信息传达给每一位家长。传统的方法是通过私信逐一发送&#xff0c;这不仅耗时耗力&#…

【Story】不同操作系统的命令行命令对比

目录 表格汇总1&#xff1a;Windows CMD、Windows PowerShell、Linux Shell、macOS Terminal详细说明表格汇总2&#xff1a;Windows CMD、Windows PowerShell、Linux Shell、macOS Terminal详细说明结束语 以下的表格&#xff0c;包括了不同操作系统的命令行命令对比&#xff0…

仿Muduo库实现高并发服务器——Buffer模块

Buffer模块并没有什么复杂错误。 上图反应了下面代码的各种操作。 #define BUFFER_DEFAULT_SIZE 1024 class Buffer {private:std::vector<char> _buffer; //使用vector进行内存空间管理uint64_t _reader_idx; //读偏移uint64_t _writer_idx; //写偏移public:Buffer():_…

Ubuntu24.04、22.04或20.04安装Golang方法教程

在Ubuntu Linux&#xff08;例如 Ubuntu 24.04、22.04 或 20.04&#xff09;上安装Go&#xff08;Golang&#xff09;是一个简单的过程。我们可以使用默认系统存储库使用本教程中给出的命令下载开源 Go 编程语言&#xff0c;轻松构建简单、可靠和高效的软件。 Go语言由Google…

LoadRunner内置参数介绍

参数菜单 我用的是2023版本&#xff0c;每个版本的位置不一样&#xff0c;通常差不多&#xff0c;2种方式进入参数菜单 菜单栏进入参数 点击设计 - 参数 - 参数列表 脚本右键进入参数 选中你要参数化的内容&#xff0c;右键&#xff1a;使用参数替换 - 参数列表 参数列表 …

day16:一文弄懂函数对象、函数嵌套和函数闭包的关系和应用

1.函数的对象 精髓&#xff1a;可以把函数当成变量去用 1.1 可以赋值 # func内存地址 def func():print(from func)ffunc print(f,func) f()输出&#xff1a; <function func at 0x0000017A4E24F7F0> <function func at 0x0000017A4E24F7F0> from func 1.2 可以…

PythonStudio 控件使用常用方式(十四)TCheckListBox

PythonStudio是一个极强的开发Python的IDE工具&#xff0c;它使用的是Delphi的控件&#xff0c;常用的内容是与Delphi一致的。但是相关文档并一定完整。现在我试试能否逐步把它的控件常用用法写一点点&#xff0c;也作为PythonStudio的参考。 从1.2.1版开始&#xff0c;Python…

视频融合项目中的平台抉择:6大关键要素助力精准选型

随着安防监控系统行业的快速发展&#xff0c;视频融合项目逐渐成为城市治理、企业管理及智能建筑等领域的重要组成部分。视频融合平台作为视频数据整合、管理和分析的核心&#xff0c;其选择直接影响到项目的成功与否。 在当前智慧业务类项目的集成过程中&#xff0c;我们不仅…

漂亮网站是门面,和你的豪车、奢侈品、秘书一样,该投就得投。

对于企业来说&#xff0c;一个漂亮的网站可以起到很好的门面作用。一个好的网站可以让客户更容易地找到你的产品和服务&#xff0c;提高品牌形象和知名度&#xff0c;增加业务成功几率。因此&#xff0c;对于企业来说&#xff0c;投资于一个漂亮的网站是非常必要的。 经常看到…

用Python实现9大回归算法详解——01线形回归算法

1. 线性回归的基本概念 线性回归是一种最基本的监督学习算法&#xff0c;用于预测因变量&#xff08;目标变量&#xff09;和一个或多个自变量&#xff08;特征变量&#xff09;之间的关系。线性回归假设因变量与自变量之间的关系是线性的&#xff0c;即可以用以下形式的线性方…

2024国赛Word论文模板【一键生成式操作】

一、比赛介绍 该竞赛创办于1992年&#xff0c;每年一届&#xff0c;是首批列入“高校学科竞赛排行榜”的19项竞赛之一。2023年&#xff0c;来自全国及美国、澳大利亚、马来西亚的1685所院校/校区、59611队(本科54158队、专科5453队)、近18万人报名参赛。 而今年的国赛马上就要…

《Unity3D网络游戏实战》正确收发数据流

TCP数据流 系统缓冲区 当收到对端数据时&#xff0c;操作系统会将数据存入到Socket的接收缓冲区中 操作系统层面上的缓冲区完全由操作系统操作&#xff0c;程序并不能直接操作它们&#xff0c;只能通过socket.Receive、socket.Send等方法来间接操作。当系统的接收缓冲区为空&…

C#去掉文件夹或文件名非法字符

实现有输入字符串创建文件夹的功能&#xff0c;需要检查字符串中是否包含不能在文件夹中使用的非法字符 。C#中如果需要生成文件路径&#xff0c;有时会抛出“文件路径中出现非法字符”的异常&#xff0c;这时我们就会找到这个非法的字符串&#xff0c;然后Replace替换掉。net类…