DBSCAN密度聚类

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

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

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

  • 核心点:在半径Eps内含有超过MinPts数目的点
  • 边界点:在半径Eps内点的数量小于MinPts,但是落在核心点的邻域内
  • 噪音点:既不是核心点也不是边界点的点
    在这里插入图片描述

DBSCAN算法流程:

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

DBSCAN密度聚类

在这里插入图片描述
在这里插入图片描述
应用实例

案列来源

https://www.icourse163.org/course/BIT-1001872001

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

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
对数变换

在这里插入图片描述

在这里插入图片描述

import numpy as np
from sklearn.cluster import DBSCAN

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=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) 
X = np.log(1+ real_X [:,1:])
db = DBSCAN(eps=0.14,min_samples=10).fit(X)
labels = db.labels_
print('Lables:')
print(labels)
raito=len(labels[labels[:]== -1])/len(labels)
print('Noise ratio:',format(raito, '.2%' ))
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0 )
print('Estimated numbre of clusters : %d'% n_clusters_)
print('Silhouette Coefficent : %0.3f'% metrics.silhouette_score(X,labels))
for i in range(n_clusters_):
    print('Cluster',i)
    count = len(X[labels==i])
    mean = np.mean(real_X[labels ==i][:,1])
    std = np.std(real_X[labels ==i][:,1])
    print('\t number of sample :',count)
    print('\t mean of sample :',format(mean,'.1f'))
    print('\t std of sample :',format(std,'.1f'))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小刘要努力。

顺便点一个赞

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值