聚类算法介绍实现(一)

最近跟着师兄在做一些课题,有些内容师兄其实已经基本实现了,但是我不太会,所以就把师兄实现思路借鉴过来学习一下相关的内容。大的目标是用python实现密度聚类,因为坐标都是在地图上的,所以最开始学习忽略了经纬度转换问题,从最基础的开始。

聚类的类型

大多数的参考书上把聚类算法划分为了两大类:K-means与DBSCAN(Density-Based Spatial Clusting of Applications with Noise),不过除此之外还有层次聚类、系统聚类、K中心聚类等等

(一)K-means

K-means算法过程
  • 拿到数据集后,可能不知道每个数据祥本都属于什么类别,此时需要指定一个K值,明确想要将数据划分成几堆。希望把数据分为数据点分成两类,这时K值就是2,但是,如果数据集比较复杂,K值就难以确定,需要通过实验进行对比。
  • 既然想划分成两堆,需要找两个能够代表每个堆的中心的点(也称质心,就是数据各个维度的均值坐标点),但是划分前并不知道每个堆的中心点在哪个位置,所以需要随机初始化两个坐标点
  • 选择两个中心点后,就要在所有数据样本中进行遍历,看看每个数据样本应当属于哪个堆。对每个数据点分别计算其到两个中心点之间的距离,离哪个中心点近,它就属于哪一堆。距离值可以自己定义,一般情况下使用欧氏距离。
  • 此后,每一个数据都有各自的归属,由于中心点是每个堆的代表,所以此时需要更新两个准各自的中心点。做法很简单,分别对不同归属的样本数据计算其中心位置,计算结果变成新的中心点
  • 更新中心点后,数据所属的类别也会有变化,此时再根据新的数据进行中心位置计算,再更新中心点。数据所属有变化,则该数据集的中心点也会有变化,因此需要依次进行不断迭代。当中心点不再变动时,就完成了K-means的运算过程,最终也可确定不同数据所属的数据集。
K-means涉及的参数
  • K值的确定
    K值决定了数据将会被划分为几组,这关系到后期的实际分析工作,选择不同K值,,得出的结果是不同的,但是具体如何确定K值,的确是个问题。暂时没有看到很好的方法,哪位朋友了解,可留言探讨。

  • 质心的选择
    初始位置的选择不同,最终迭代出来的数据也会有所差异,所以,并不是每一次的计算结果都会相同。

  • 距离度量
    刚刚提到,选定质心后,要计算某一点到质心的距离,再进行距离大小比较,然后确定这一点的归属。那么,距离计算应该采用什么的度量方式,不同度量方式对结果也会产生影响。我们常用的就是欧氏距离。

  • 评估方法
    K-means属于无监督学习,因此没办法用交叉验证方法评估结果,轮廓系数是检验聚类结果好坏的一种评价方式。该方式需要计算两类数据:簇内不相似度和簇间不相似度。
    ··簇内不相似度:也就是计算样本到同簇其他样本的平均距离,距离数值越小,则说明该样本应该被聚类到该簇。
    ··簇间不相似度:计算样本到其他某簇的所有样本的平均距离。然后根据这个两个数值定义某个样本的轮廓系数。
    ··如果该样本轮廓系数接近1,则说明该样本聚类合理,如果接近-1,则说明该样本更应该分到另外簇中,如果接近0,则说明该样本可能处于两个簇的边界上。所有样本的轮廓系数的均值就是聚类结果的轮廓系数。

(二)DBSCAN

相关概念
  • ε-邻址:给定对象半径r内的邻域。K-means算法是基于距离计算的,但是在DBSCAN中,最核心的参数是半径,会对结果产生较大影响。
  • 核心点:如果对象的ε- 邻域至少包含一定数目(暂时还不清楚这个一定数目到底是多少数目,如何确定)的数据点,则称该数据点为核心对象, 说明这个数据点周围比较密集。
  • 边界点:边界点不是核心点,但落在某个核心点的邻域内,但其ε-邻域并不包含一定数量的点,也就是在数据集中的边界位置。
  • 离群点:既不是核心点,也不是边界点的其他数据点,也就是数据点落单了。
    在这里插入图片描述
    这个图片应该是讲DBSCAN最经典的图了。我们这样来看,在众多的样本中随机选择一点,例如A,围绕这个以r为半径画圆,并且规定如果这个圆内有不少于M个样本点,那么在这个圆圈内的其他点,也要画圆,例如除去A点的其他黑色点,以这个些点为圆心,r为半径,再看每个圆圈住的样本点的个数是否小于M,如果小于M,那么就停止画圆。最开始的那个点就被称为“核心点”,例如A,停下来的时候那个点叫做边界点,比如B/C,画了所有的圈,也没有圈住的点,叫做离群点,比如N

以上是个大概的逻辑介绍,看懂这些,接下来才能读懂代码,根据需求修改代码细节。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值