天天看点

机器学习:【学习笔记】DBSCAN密度聚类

DBSCAN密度聚类算法

DBSCAN密度聚类算法是一种基于密度的聚类算法:

  • 聚类的时候不需要预先指定簇的个数
  • 最终的簇的个数不定

DBSCAN密度聚类算法将数据点分为三类:

  • 核心点:在半径Eps内含有超过MinPts数目的点。
  • 边界点:在半径Eps内点的数量小于MinPts,但是落在核心点的邻域内。
  • 噪音点:既不是核心点也不是边界点的点。

算法过程:

  • 将所有点标记为核心点、边界点或噪音点。
  • 删除噪音点。
  • 为距离在Eps之内的所有核心点之间赋予一条边。
  • 每组连通的核心点形成一个簇。
  • 将每个边界点指派到一个与之关联的核心点的簇中。

1 建立工程,导入sklearn相关包

import numpy as np
from sklearn.cluster import DBSCAN
           

DBSCAN主要参数:

  • eps:两个样本被看作邻居结点的最大距离
  • min_samples:簇的样本数
  • metric:距离计算方式
import numpy as np
import sklearn.cluster as skc
from sklearn import metrics
import matplotlib.pyplot as plt

mac2id = dict()
onlinetimes = []
f = open('TextData.txt')
for line in f:
    mac = line.split(',')[2]
    onlinetime = int(line.split(',')[6])
    starttime = int(line.split(',')[4].split(' ')[1].split(':')[0])
    if mac not in mac2id:
        mac2id[mac] = len(onlinetimes)
        onlinetimes.append((starttime, onlinetime))
    else:
        onlinetimes[mac2id[mac]] = [(starttime, onlinetime)]

real_X = np.array(onlinetimes).reshape((-1, 2))
X = real_X[:,0:-1]

db = skc.DBSCAN(eps=0.01, min_samples=20).fit(X)
labels = db.labels_


print("Labels:")
print(labels)
raito = len(labels[labels[:] == -1]) / len(labels)
print("Noise raito:", format(raito, ".2%"))

n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)

print('Estinated number of clusters: %d' % n_clusters_)
print('Silhouette Coefficient: %0.3f' % metrics.silhouette_score(X, labels))

for i in range(n_clusters_):
    print('Cluster ', i, ':')
    print(list(X[labels == i].flatten()))

# 转化成直方图形式分析
plt.hist(X, 24)