Python机器学习应用-聚类之DBSCAN

DBSCAN密度聚类

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

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

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

  1. 核心点:在半径Eps内含有超过MinPts数目的点。
  2. 边界点:在半径Eps内点的数量小于MinPts,但是落在核心点的邻域内。
  3. 噪声点:既不是核心点也不是边界点的点。
    这里写图片描述

DBSCAN算法流程:

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

举例:

这里写图片描述
这里写图片描述
这里写图片描述

DBSCAN的应用实例

数据介绍:

现有大学校园网的日志数据,290条大学生的校园网使用情况数据,数据包括用户ID,设备的MAC地址,IP地址,开始上网时间,停止上网时间,上网时长,校园网套餐等。利用已有数据,分析学生上网模式。

实验目的:

通过DBSCAN聚类,分析学生上网时间和上网时长的模式。

技术路线:

sklearn.cluster.DBSCAN

数据实例:

这里写图片描述

实验过程:

这里写图片描述

  1. 建立工程,导入sklearn相关包
    import numpy as np
    from sklearn.cluster import DBSCAN

    DBCSAN主要参数:
    (1)eps:两个样本被看作邻居节点的最大距离
    (2)min_samples:簇的样本数
    (3)距离计算方式

  2. 读入数据并进行处理
    这里写图片描述

  3. 上网时间聚类,创建DBSCAN算法实例,并进行训练,获取标签
    这里写图片描述

  4. 输出标签,查看结果
    这里写图片描述

import numpy as np
import sklearn.cluster as skc
from sklearn import metrics
import matplotlib.pyplot as plt


mac2id=dict()
onlinetimes=[]
f=open('TestData.txt',encoding='utf-8')
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('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)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值