聚类(1)----DBSCAN实例

来源:互联网 发布:四知的翻译 编辑:程序博客网 时间:2024/05/22 03:23

DBSCAN算法是一种基于密度聚类算法:
- 聚类的时候不需要预先指定簇的个数
- 最终簇的个数不一定

DBSCAN算法将数据点分为三类:
- 核心点:在半斤EPS内含有超过MinPts数目的点
- 边界点:在半斤EPS内点的数量小于MinPts,但是落在核心点的领域内
这里写图片描述

算法流程:
1. 对所有点计算其领域Eps=distance内的点的集合
2. 集合内的点个数超过MinPt3=count的点为核心点
3. 查看剩余点是否在核心点的领域内,若在则为边界点,否则为噪声点

这里写图片描述

import numpy as npimport sklearn.cluster as skcfrom sklearn import metricsimport matplotlib.pyplot as pltmac2id = dict()onlinetimes = []f = open('/Users/tangweize/Desktop/TestData.txt', encoding='utf-8')for line in f:    mac = line.split(',')[2]    onlinetime = int(line.split(',')[6]) #上网时间长度    #print(onlinetime)    starttime = int(line.split(',')[4].split(' ')[1].split(':')[0])#上网开始时间,2014-07-20 22:44:18.540000000,提取其中的小时    if mac not in mac2id: #mac2id是个字典,给每个mac地址编id序号        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) #DBSCAN聚类方法 还有参数,matric = ""距离计算方法labels = db.labels_  #和X同一个维度,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('Estimated 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())) #flatten 合并子维度的数组  ("C")按照列来合并,("F")按照行合并plt.hist(X, 24)  #24条数plt.show()