DBSCAN 密度聚类

DBSCAN 密度聚类

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

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

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

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

这里写图片描述

DBSCAN算法流程:

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

DBSCAN 密度聚类应用

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

数据介绍:

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

实验目的:

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

这里写图片描述

这里写图片描述

代码:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu May 25 20:21:14 2017

@author: xiaolian
"""
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', 'r+', 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)
print(onlinetimes)
print(real_x)

x = real_x[:, 0:1]
print(x)

plt.hist(x, 24)

db = skc.DBSCAN(eps = 0.5, min_samples = 20).fit(x)
labels = db.labels_

print(labels)

ratio = len(labels[labels[:]  == -1]) / len(labels)

print(ratio)

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

print(n_clusters_)

for i in range(n_clusters_):
    print('cluster', i, ':')
    print(list(x[labels == i].flatten()))
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值