问题:
什么是聚类算法,其难点在哪
有哪些是聚类算法,其处理过程是什么,优劣势有哪些
评估聚类算法的方法
聚类算法,是无监督学习,也就是无标签(label),是把相似的数据划分在一起
聚类算法的普遍难点在于:如何选择合适的参数(调参),怎样评估聚类效果是好的(评估)
聚类算法中比较常用的有K-means 和DBSCAN
K-means : 以质心为中心,聚类成K个簇
需要设定的参数:K值
质心——对该簇所有点所有特征取均值
怎么找到点形成簇呢——距离度量:欧式距离或者(先标准化)余弦相似度(使用欧式距离的比较多)
K-means 就是找到离某个质心更近的那些点形成一个簇
那么我们希望的情况就是,聚完类后,每个点都能离所属簇的质心距离最近(相比于其他簇的质心)
因此我们可以得到我们的优化目标,就是使该簇的所有点到该簇的质心的距离之和尽量小,那么不断优化,直到质心不再变时,总距离也就不变,此时我们得到最后的聚类。
那么如何优化我们的质心呢?(也就是K-means的聚类过程)
首先,因为一开始没有质心可以确定,那么K个质心就会随机取(最后要分为K个簇),
那么质心就有初始化了,也就可以开始计算和比较各个点和各个质心之间的距离了,每个点找到离自己距离最近的质心,
那么第一次聚类就完成了。
之后的优化:除了质心以外,再次计算每个簇中每个点的均值,得到新的质心,然后又重新计算计算和比较各个点和各个质心之间的距离(也就是重新进行聚类,分簇),每个点再次找到离自己距离最近的质心,那么完成了新一次的聚类。
不断重复上面的优化,直到质心基本不变了,那么最后的聚类结果也就出来了。
动态分析网站:https://www.naftaliharris.com/blog/visualizing-k-means-clustering/
上面可以动态展示这个过程。
在K-means的聚类过程中,我们可以发现到,K-means会收一开始取得随机质心的位置影响十分大,会影响最后的聚类结果。
同时也可以发现,K-means对于规则的数据集效果是不错的,但是对于不规则的数据,例如笑脸数据和环状数据,效果不好,或者说是没有我们想要的聚类效果,难以发现不规则形状的簇。这是K-means的劣势。
还有的就是从数据方面,可以发现,K-means的复杂程度是会和数据量成线性关系,数据量大,复杂程度越大
那么K-means也有其优势:简单、适用于常规数据集(也就是我们人能直接分开的)
DBSCAN,基于密度的带有噪声点数据的空间聚类
Density-Based Spatial Clustering of Applications with Noise
DBSCAN 其实就是“画圆”
圆多大,圆里怎么样
“谁”能画,“谁”又不能
怎样聚类成簇
DSCAN,需要设定参数有:圆的半径r , 圆内至少多少个点(阈值):minPts
核心对象:以某个点为圆心,画半径为r的圆,如果圆内点数(不包括本身)超过阈值,那么就是核心对象
边界点:圆内点数(不包括本身)超过阈值,但在核心对象的领域内的点
离群点:圆不能圈到的点
还有一些相关的概念可看参考文章 聚类算法之DBSCAN
http://itindex.net/detail/58485-%E8%81%9A%E7%B1%BB-%E7%AE%97%E6%B3%95-dbscan
DBSCAN聚类的过程就是
对于某个点来说,丈量一个圆,如果圆能圈住了超过阈值的点,那么就能“画圆”把点圈住,而他就是核心对象
核心对象加进簇中,
然后看被圈住的点,同样去看他是不是核心对象,如果不是核心对象,不能画圆,那么他们是边界点
边界点同样能加进簇中。重复这个过程直到簇没有新加点才去再建立一个新的簇
而最后没有在簇中,也不能被圈住的 点就是离群点
所以对于DBSCAN来说,聚类就是把核心对象和其领域里的点都包括起来
那么我们如何知道有合适的r和minPts呢
我们需要借助k-距离
k-距离的意思是某个点到所有点,除自己以外,距离第k近的距离,
而每个点都计算k-距离,也就是每个点都有到所有点,距离第k近的距离,把所有的距离由小到大进行排序
那么我们就能得到一个集合,放的都是距离
我们去观察距离,找到突变的点
例如 排序如 0.1 0.11 0.12 0.3 0.32 0.32 。。。
这样类似的,那么可以确定到0.3那发生了突变,而前面的三个值,我们可以拿来当r值,有三个点,即作为阈值
可以知道DBSCAN 的优势是不用指定簇,但同样的需要指定参数——半径r和阈值minPts
同时,因为这是基于密度的聚类方法,可以很好地发现不规则形状的簇,
而因为它能找到离群点,擅长离群点检测(sklearn中离群点作为-1的簇)
但是也有其劣势
处理高纬度的数据难,效率慢,也需要合适的参数
它需要进行比K-means进行更多的处理
对此我们可以进行降维,和数据削减
DBSCAN 动态处理展示:
https://www.naftaliharris.com/blog/visualizing-dbscan-clustering/
最后我们需要对聚类进行评估,聚类的效果怎么样——轮廓系数 silhoutte Coefficient
s(i)=b(i)-a(i) / max{b(i),a(i)}
a(i):样本i到同样簇的其他样本的平均距离
b(i):样本i到其他簇Cj的其他样本的平均距离
a(i)越小,说明其越该被聚类到该簇
可以知道
s(i)接近1,则样本i聚类合理,-1就是该分到别的簇,0就是意味着样本在两簇的边界上
对于聚类算法,大多流程如下:
聚类——可视化展示——评估——重新选取更合适参数