相关聚类算法
---------------------------------------------------
参考链接
https://blog.csdn.net/huacha__/article/details/81094891
https://baike.baidu.com/item/DBSCAN/4864716?fr=aladdin
DBSCAN 为密度聚类的无监督方法。
DBScan需要二个参数: 扫描半径 (eps)和最小包含点数(minPts)。 任选一个未被访问(unvisited)的点开始,找出与其距离在eps之内(包括eps)的所有附近点。
DBSCAN对用户定义的参数很敏感,细微的不同都可能导致差别很大的结果,而参数的选择无规律可循,只能靠经验确定。
算法原理
下面这些点是分布在样本空间的众多样本,现在我们的目标是把这些在样本空间中距离相近的聚成一类。我们发现A点附近的点密度较大,红色的圆圈根据一定的规则在这里滚啊滚,最终收纳了A附近的5个点,标记为红色也就是定为同一个簇。其它没有被收纳的根据一样的规则成簇。(形象来说,我们可以认为这是系统在众多样本点中随机选中一个,围绕这个被选中的样本点画一个圆,规定这个圆的半径以及圆内最少包含的样本点,如果在指定半径内有足够多的样本点在内,那么这个圆圈的圆心就转移到这个内部样本点,继续去圈附近其它的样本点,类似传销一样,继续去发展下线。等到这个滚来滚去的圈发现所圈住的样本点数量少于预先指定的值,就停止了。那么我们称最开始那个点为核心点,如A,停下来的那个点为边界点,如B、C,没得滚的那个点为离群点,如N)。
kmeans聚类算法只能处理球形的簇,也就是一个聚成实心的团(这是因为算法本身计算平均距离的局限)。但往往现实中还会有各种形状,比如下面两张图,环形和不规则形,这个时候,那些传统的聚类算法效果就会差一些。基于样本密度的DBSCAN算法就会取得较好的效果。
具体算法描述
(1)检测数据库中尚未检查过的对象p,如果p未被处理(归为某个簇或者标记为噪声),则检查其邻域,若包含的对象数不小于minPts,建立新簇C,将其中的所有点加入候选集N;
(2)对候选集N 中所有尚未被处理的对象q,检查其邻域,若至少包含minPts个对象,则将这些对象加入N;如果q 未归入任何一个簇,则将q 加入C;
(3)重复步骤2),继续检查N 中未处理的对象,当前候选集N为空;
(4)重复步骤1)~3),直到所有对象都归入了某个簇或标记为噪声。
优点
与K-means方法相比,DBSCAN不需要事先知道要形成的簇类的数量。
与K-means方法相比,DBSCAN可以发现任意形状的簇类。
DBSCAN能够识别出噪声点。
DBSCAN对于数据库中样本的顺序不敏感,即Pattern的输入顺序对结果的影响不大。但是,对于处于簇类之间边界样本,可能会根据哪个簇类优先被探测到而其归属有所摆动。
缺点
1. DBScan不能很好反映高维数据。
2. DBScan不能很好反映数据集以变化的密度。
3. 如果样本集的密度不均匀、聚类间距差相差很大时,聚类质量较差
代码
import pandas as pd
df = pd.read_csv('data.txt', sep=' ')
from sklearn.cluster import DBSCAN
X = df[["calories", "sodium", "alcohol", "cost"]]
# 设置半径为10,最小样本量为2,建模
db = DBSCAN(eps=10, min_samples=2).fit(X) # eps 参数设置调节密度, 通过eps参数调节达到比较好的聚类效果,具体需要根据聚类样本分布确定
labels = db.labels_
df['cluster_db'] = labels # 在数据集最后一列加上经过DBSCAN聚类后的结果
df.sort_values('cluster_db')
# 查看根据DBSCAN聚类后的分组统计结果(均值)
print(df.groupby('cluster_db').mean())
注:eps 参数设置调节密度, 通过eps参数调节达到比较好的聚类效果,具体需要根据聚类样本分布确定