首页 > 其他分享 >【scikit-learn基础】--『监督学习』之 空间聚类

【scikit-learn基础】--『监督学习』之 空间聚类

时间:2024-01-20 14:48:46浏览次数:26  
标签:DBSCAN -- scikit eps 算法 plt learn samples 聚类

空间聚类算法是数据挖掘和机器学习领域中的一种重要技术。

本篇介绍的基于密度的空间聚类算法的概念可以追溯到1990年代初期。
随着数据量的增长和数据维度的增加,基于密度的算法逐渐引起了研究者的关注。
其中,DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是最具代表性的算法之一。

基于密度的空间聚类算法在许多领域都有应用,例如图像处理、生物信息学、社交网络分析等。
在图像处理中,该算法可以用于检测图像中的密集区域,用于识别物体或形状。

1. 算法概述

DBSCAN算法的基本思想是,对于给定的数据集,基于数据点的密度进行聚类。
在密度高的区域,数据点更为集中,而密度低的区域数据点较为稀疏。
基于密度的算法能够发现任意形状的簇,并且对噪声有较好的鲁棒性。

算法的核心在于:

  1. 定义邻域:对于数据集中的每个点,其邻域是由距离该点在一定半径(通常称为Eps)内的所有点组成的
  2. 定义密度:一个点的密度是其邻域内的点的数量。如果一个点的密度超过某个阈值(通常称为MinPts),则该点被视为核心点
  3. 寻找簇:从每个核心点出发,找到所有密度可达的点,即这些点通过一系列核心点可以与该核心点相连,这些点形成一个簇
  4. 标记噪声点:不属于任何簇的点被标记为噪声点

2. 创建样本数据

下面,创建三种不同的样本数据,来测试DBSCAN的聚类效果。

from sklearn.datasets import make_blobs, make_moons, make_circles

fig, axes = plt.subplots(nrows=1, ncols=3)
fig.set_size_inches((9, 3))

X_moon, y_moon = make_moons(noise=0.05, n_samples=1000)
axes[0].scatter(
    X_moon[:, 0],
    X_moon[:, 1],
    marker="o",
    c=y_moon,
    s=25,
    cmap=plt.cm.spring,
)

X_circle, y_circle = make_circles(noise=0.05, factor=0.5, n_samples=1000)
axes[1].scatter(
    X_circle[:, 0],
    X_circle[:, 1],
    marker="o",
    c=y_circle,
    s=25,
    cmap=plt.cm.winter,
)

X_blob, y_blob = make_blobs(n_samples=1000, centers=3)
axes[2].scatter(
    X_blob[:, 0],
    X_blob[:, 1],
    marker="o",
    c=y_blob,
    s=25,
    cmap=plt.cm.autumn,
)

plt.show()

image.png

3. 模型训练

scikit-learnDBSCAN模型来训练,这个模型主要的参数有两个:

  1. eps (eps):这个参数表示邻域的大小,或者说是邻域的半径。具体来说,对于数据集中的每个点,其 eps-邻域包含了所有与该点的距离小于或等于 eps 的点。
  2. min_samples (minPts):在给定 eps-邻域内,一个点需要有多少个邻居才能被视为核心点。

通过调节这2个参数,基于上面创建的样本数据,训练效果如下:

from sklearn.cluster import DBSCAN

# 定义
regs = [
    DBSCAN(min_samples=2, eps=0.1),
    DBSCAN(min_samples=2, eps=0.2),
    DBSCAN(min_samples=3, eps=2),
]

# 训练模型
regs[0].fit(X_moon, y_moon)
regs[1].fit(X_circle, y_circle)
regs[2].fit(X_blob, y_blob)

fig, axes = plt.subplots(nrows=1, ncols=3)
fig.set_size_inches((9, 3))

# 绘制聚类之后的结果
axes[0].scatter(
    X_moon[:, 0],
    X_moon[:, 1],
    marker="o",
    c=regs[0].labels_,
    s=25,
    cmap=plt.cm.spring,
)

axes[1].scatter(
    X_circle[:, 0],
    X_circle[:, 1],
    marker="o",
    c=regs[1].labels_,
    s=25,
    cmap=plt.cm.winter,
)

axes[2].scatter(
    X_blob[:, 0],
    X_blob[:, 1],
    marker="o",
    c=regs[2].labels_,
    s=25,
    cmap=plt.cm.autumn,
)

plt.show()

image.png

针对3种不同的样本数据,调节参数之后,聚类的效果还不错。
感兴趣的话,可以试试修改上面代码中的DBSCAN定义部分的参数:

# 定义
regs = [
    DBSCAN(min_samples=2, eps=0.1),
    DBSCAN(min_samples=2, eps=0.2),
    DBSCAN(min_samples=3, eps=2),
]

调节不同的 min_sampleeps,看看不同的聚类效果。

4. 总结

总的来说,基于密度的空间聚类算法是一种强大的工具,能够从数据中提取有价值的信息。
但是,如同所有的算法一样,它也有其局限性,需要在合适的应用场景中使用,才能达到最佳的效果。

它的优势主要在于:

  1. 能够发现任意形状的簇
  2. 对噪声和异常值有较好的鲁棒性
  3. 不需要提前知道簇的数量

不足之处则在于:

  1. 对于高维数据,密度计算可能会变得非常复杂和计算量大
  2. 算法的性能高度依赖于密度阈值的选择
  3. 在处理密度变化较大的数据时可能效果不佳

标签:DBSCAN,--,scikit,eps,算法,plt,learn,samples,聚类
From: https://www.cnblogs.com/wang_yb/p/17976448

相关文章

  • 直播app系统源码,通过延迟加载非关键资源实现首屏优化
    直播app系统源码,通过延迟加载非关键资源实现首屏优化将非关键资源(如广告、推荐内容等)的加载延迟到首屏渲染完成之后,以提高首屏展示速度。<!DOCTYPEhtml><html><head><title>延迟加载示例</title></head><body><h1>首屏内容</h1><!--非关键资源--><d......
  • JavaScript数组常用方法
    1、带回调函数的方法当涉及到数组操作时,JavaScript提供了许多有用的方法。下面是对一些常见的数组方法的讲解:forEach:forEach方法用于遍历数组中的每个元素,并对每个元素执行一个回调函数。它没有返回值,仅用于执行操作。例如:constnumbers=[1,2,3,4,5];numbers.forEa......
  • 第一章读后感
    读第一章,我首先明白了程序是指示计算机每一步动作的一组指令,程序是由指令和数据组成的,CPU可以直接识别并使用的语言就是机器语言,正在运行的程序存储在内存里,内存中,用来表示命令和数据存储位置的数值就是内存地址,计算机的构成元件中,负责程序的解释和运行的是CPU这些概念。 这些......
  • 算法-数组
    1.二分查找(LeetCode704)题目:给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。输入:nums=[-1,0,3,5,9,12],target=9输出:4解释:9出现在nums中并且下标为4......
  • 选择器优先级
    1、简单了解    2、详细了解选择器的优先级(a,b,c) 当鼠标悬浮选择器的时候会出现一组权重  行内样式是指在body里直接定义元素的样式 ......
  • WIN32 动态 UAC 提权
    UAC(UserAccountControl)是Windows平台的用户权限控制。它可以让程序使用管理员权限执行某些操作。静态UAC提权静态UAC提权让程序一直运行在管理员权限下,只要在项目设置里把"UACExecutionLevel"设置为"requireAdministrator"。这样生成的exe文件图标会自动加上......
  • 使用树莓派学习Linux驱动 硬件环境评估
    1.现有设备surface,树莓派3B 简介优点缺点树莓派+鼠标键盘显示屏开发方便需要购买小/静音键盘需要购买显示屏显示屏小了用着不舒服,大了太贵树莓派不需要显示屏!将来还要刷机不带桌面的核心系统surface+usb转串口只需要购买usb转串口线,成本低速......
  • 【Python】查找和删除表格中的重复行
    查找:importpandasaspddf=pd.read_excel("秘籍.xlsx")#打开list1=[]foriinrange(df.shape[0]):#总行数list1.append(list(df.values[i]))#将每行以列表的形式装入列表forxinlist1:iflist1.count(x)>1:#如果列表中元素出现次数>1prin......
  • hey_left 10 Codeforces Round 871 (Div. 4) 再续
    题目链接H.没思路,查看题解选择数组的非连续的子序列,就是每个数选或不选的问题求个数,易dp求子序列的数二进制相与结果有k个1的个数把所有结果记录,再去筛选满足条件的结果f[i][j]表示到第i个数,相与结果为j的子序列个数正向思维:多个数相与得到结果dp思维:枚举结果,考虑数如何......
  • 斯特林数相关
    定义第一类斯特林数:\({n\brackk}\),指将\(n\)个数放入\(k\)个环中(环无区分)的方案数。第二类斯特林数:\({n\bracek}\),指将\(n\)个数放入\(k\)个盒子(盒子无区分)的方案数。递推式:\[{n\brackk}=(n-1){n-1\brackk}+{n-1\brackk-1}\]说明:我们考虑最后一个数......