当前位置: 首页 > news >正文

聚类算法

一、DBSCAN

 1.简介:

  DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种基于密度的空间聚类算法。

  该算法要求聚类空间中的一定区域内所包含对象(点或其他空间对象)的数目不小于某一给定阈值。

  DBSCAN算法的显著优点是聚类速度快且能够有效处理噪声点和发现任意形状的空间聚类,具有两个比较明显的弱点:

  • 当数据量增大时,要求较大的内存支持I/O消耗也很大;
  • 当空间聚类的密度不均匀、聚类间距差相差很大时,聚类质量较差

 2.原理:

  该算法将数据点分为3类:

  • 核心点:在半径Eps内含有超过MinPts数目的点
  • 边界点:在半径Eps内含有点的数量小于MinPts,但是落在核心点邻域内的点
  • 噪音点:既不是核心点又不属于边界点
  • 直接密度可达(directly density-reachable)如果pqEps邻域内,而q是一个核心对象,则从对象q出发到p时是直接密度可达的

红色为核心点,黄色为边界点,蓝色为噪音点,minPts = 4,Eps是图中圆的半径大小有关

 

  过程如下:

  3. scikit-learn DBSCAN聚类实例

    首先,我们生成一组随机数据,为了体现DBSCAN在非凸数据的聚类优点,我们生成了三簇数据,两组是非凸的。代码如下:

#coding = utf-8
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets

#make_circles: Make a large circle containing a smaller circle in 2d.
#factor: Scale factor between inner and outer circle.
X1, y1 = datasets.make_circles(n_samples=5000, factor=0.6,noise=0.05)
print X1.shape
print y1

#make_blobs: Generate isotropic Gaussian blobs for clustering.
#n_features: The number of features for each sample.
#cluster_std: The standard deviation of the clusters.
X2, y2 = datasets.make_blobs(n_samples=1000, n_features=2, centers=[[1.2, 1.2]], cluster_std=[[0.1]],random_state=9)
print X2.shape
print y2

#np.concatenate: 拼接
X = np.concatenate((X1, X2))
print X.shape

#s: marker size
plt.scatter(X[:, 0], X[:, 1], marker='o', s=3, color='blue')
plt.show()

  K-Means的聚类,代码如下:

#K-Means聚类效果
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3, random_state=9)
y_pred = kmeans.fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=y_pred, s=3)
plt.show()

  K-Means对于非凸数据集的聚类表现不好,从上面代码输出的聚类效果图可以明显看出,输出图如下:

  那么如果使用DBSCAN效果如何呢?我们先不调参,直接用默认参数,代码如下: 

#DBSCAN: 使用默认参数
from sklearn.cluster import DBSCAN
dbscan = DBSCAN()
y_pred = dbscan.fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=y_pred, s=3)
plt.show()

   DBSCAN居然认为所有的数据都是一类,输出效果图如下:

 

  我们需要对DBSCAN的两个关键的参数eps和min_samples进行调参, 从上图我们可以发现,类别数太少,我们需要增加类别数,那么我们可以减少邻域的大小,默认是0.5,我们减到0.1看看效果。代码如下:

#DBSCAN: 调参邻域eps
from sklearn.cluster import DBSCAN
dbscan = DBSCAN(eps = 0.1)
y_pred = dbscan.fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=y_pred, s=3)
plt.show()

    聚类效果图如下:

   可以看到聚类效果有了改进,边上的那个簇已经被发现出来了。此时我们需要继续调参增加类别,有两个方向都是可以的,一个是继续减少eps,另一个是增加min_samples。将min_samples从默认的5增加到10,代码如下:

#DBSCAN: 调参样本数
from sklearn.cluster import DBSCAN
dbscan = DBSCAN(eps = 0.1, min_samples = 10)
y_pred = dbscan.fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=y_pred, s=3)
plt.show()

   效果如下:

  效果已经不错了,总代码如下:

#coding = utf-8
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets

#make_circles: Make a large circle containing a smaller circle in 2d.
#factor: Scale factor between inner and outer circle.
X1, y1 = datasets.make_circles(n_samples=5000, factor=0.6,noise=0.05)
print X1.shape
print y1


#make_blobs: Generate isotropic Gaussian blobs for clustering.
#n_features: The number of features for each sample.
#cluster_std: The standard deviation of the clusters.
X2, y2 = datasets.make_blobs(n_samples=1000, n_features=2, centers=[[1.2, 1.2]], cluster_std=[[0.1]],random_state=9)
print X2.shape
print y2

#np.concatenate: 拼接
X = np.concatenate((X1, X2))
print X.shape

#s: marker size
plt.scatter(X[:, 0], X[:, 1], marker='o', s=3, color='blue')
#plt.show()

#K-Means聚类效果
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3, random_state=9)
y_pred = kmeans.fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=y_pred, s=3)
#plt.show()

#DBSCAN: 使用默认参数
from sklearn.cluster import DBSCAN
dbscan = DBSCAN()
y_pred = dbscan.fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=y_pred, s=3)
#plt.show()

#DBSCAN: 调参邻域
from sklearn.cluster import DBSCAN
dbscan = DBSCAN(eps = 0.1)
y_pred = dbscan.fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=y_pred, s=3)
#plt.show()

#DBSCAN: 调参样本数
from sklearn.cluster import DBSCAN
dbscan = DBSCAN(eps = 0.1, min_samples = 10)
y_pred = dbscan.fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=y_pred, s=3)
plt.show()

   DBSCAN其实需要调参的就是两个参数eps和min_samples,这两个值的组合对最终的聚类效果有很大的影响。

 

转载于:https://www.cnblogs.com/always-fight/p/8831647.html

相关文章:

  • 20165215 结对编程——四则运算第一周
  • E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。...
  • 01 JS基础
  • geth常用指令
  • 信号是如何在光纤中传播的?
  • 解析Json字符串的三种方法
  • Python_字符串处理方法
  • SqlSugar解决SQLite访问的问题:Unable to load DLL 'SQLite.Interop.dll'
  • PL/SQL的安装
  • xgboost-PythonR
  • 实验环境的搭建
  • python实现微信扫码支付模式
  • 20.20 告警系统主脚本 20.21 告警系统配置文件 20.22 告警系统监控项目
  • [NodeJS]NodeJS基于WebSocket的多用户点对点即时通讯聊天
  • Cpython 解释器下实现并发编程
  • ----------
  • hexo+github搭建个人博客
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • 78. Subsets
  • es6(二):字符串的扩展
  • Git 使用集
  • Java教程_软件开发基础
  • Mysql5.6主从复制
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • spark本地环境的搭建到运行第一个spark程序
  • Sublime Text 2/3 绑定Eclipse快捷键
  • Vue 2.3、2.4 知识点小结
  • VUE es6技巧写法(持续更新中~~~)
  • Yeoman_Bower_Grunt
  • 分布式任务队列Celery
  • 基于Android乐音识别(2)
  • 算法之不定期更新(一)(2018-04-12)
  • 06-01 点餐小程序前台界面搭建
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​flutter 代码混淆
  • #14vue3生成表单并跳转到外部地址的方式
  • #Java第九次作业--输入输出流和文件操作
  • #微信小程序:微信小程序常见的配置传旨
  • $.proxy和$.extend
  • (1)bark-ml
  • (C++20) consteval立即函数
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (MATLAB)第五章-矩阵运算
  • (SpringBoot)第二章:Spring创建和使用
  • (二)pulsar安装在独立的docker中,python测试
  • (二)构建dubbo分布式平台-平台功能导图
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (一)UDP基本编程步骤
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)菜鸟学数据库(三)——存储过程
  • (转载)虚函数剖析
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .gitignore文件---让git自动忽略指定文件
  • .NET BackgroundWorker