DBSCAN聚类算法的应用 —— Python数据工程No.6

DBSCAN算法是一种基于密度的聚类算法,与kmeans算法不同的是,DBSCAN算法在聚类的时候不需要预先指定簇的个数,最终簇的个数也是不确定的。DBSCAN算法将数据点分为三类,分别是:核心点、边界点、噪音点。
核心点的概念:在聚类半径内含有超过MinPts数目的点;
边界点的概念:在聚类半径内点的数量少于MinPts,但是落在核心点的邻域内;
噪音点的概念:既不是核心点,又不是边界点的点。

步骤:

  1. 将所有点标记为核心点、边界点或噪声点;
  2. 删除噪声点;
  3. 为距离在Eps之内的所有核心点之间赋予一条边;
  4. 每组连通的核心点形成一个簇;
  5. 将每个边界点指派到一个与之关联的核心点的簇中(在哪一个核心点的半径范围之内)

实现方法:
sklearn.cluster.DBSCAN

案例:
数据集下载方式:
https://download.csdn.net/download/qq_34706280/12497960
数据集介绍:
大学生校园网日志数据,290条大学生校园网使用情况数据,数据中的主要属性有:用户ID、用户设备MAC地址、用户IP地址、用户开始上网时间、用户停止上网时间、用户上网时长,用户校园网套餐。

实现过程:

  1. 建立工程引入相关包;
  2. 加载预处理数据;
  3. 上网时间的聚类分析 && 上网时长的聚类分析;
  4. 分析结果。

DBSCAN主要参数:

  1. eps : 两个样本被看作邻居节点的最大距离
  2. min_samples : 簇的样本数
  3. metric : 距离计算方式

代码:

import numpy as np
import sklearn.cluster as skc
from sklearn import metrics
import matplotlib.pyplot as plt
     
     
mac2id = dict()   #新建字典变量mac2id盛放用户MAC地址与用户ID键值对
onlinetimes = []    #新建列表变量onlinetimes盛放用户上网时长

f=open('TestData.txt',encoding='utf-8')

#line表示每一行的数据 
for line in f:       
    #将数据以逗号切片为欸列表取下标2的元素赋值给mac即用户MAC地址                          
    mac = line.split(',')[2]      
    #取下标6的数据元素赋值给onlinetime即用户上网时长              
    onlinetime=int(line.split(',')[6])
    #取下标为4的数据元素赋值给starttime即用户开始上网时间        
    starttime=int(line.split(',')[4].split(' ')[1].splsit(':')[0])
    #如果mac为新的MAC地址则记录mac地址及其它数据,否则只记录其他数据
    if mac not in mac2id:
        mac2id[mac]=len(onlinetimes)
        onlinetimes.append((starttime,onlinetime))
    else:
        onlinetimes[mac2id[mac]]=[(starttime,onlinetime)]
        
#把onlinetimes中的数据转换为numpy数组        
real_X = np.array(onlinetimes).reshape((-1,2))
#去除real_X中的第0列  即时间
X=real_X[:,0:1]

#根据上网时间进行DBSCAN聚类     
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('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()))

#绘制直方图         
plt.hist(X,24)

运行结果:
DBSCAN聚类算法的应用 —— Python数据工程No.6_第1张图片DBSCAN聚类算法的应用 —— Python数据工程No.6_第2张图片

你可能感兴趣的:(Python数据工程,机器学习)