一起读代码_DBSCAN学生上网情况分析

DBSCAN算法是一种基于密度的聚类算法,算法使用时需要给定半径范围(Eps)和在该邻域内至少包含的样本点个数(MinPts),这里的距离可以根据需要选定欧式、曼哈顿、马氏距离等;当数据过于稀疏时则不适合采用该方法。
DBSCAN算法将数据点分为三类
核心点:在半径Eps内含有超过MinPts数目的点
边界点:在半径Eps内点的数量小于MinPts,但是落在核心点的邻域内
噪音点:既不是核心点也不是边界点的点
DBSCAN算法流程
1.将所有点标记为核心点、边界点或噪声点;
2.删除噪声点;
3.为距离在Eps之内的所有核心点之间赋予一条边;
4.每组连通的核心点形成一个簇;
5.将每个边界点指派到一个与之关联的核心点的簇中(哪一个核心点的半 径范围之内)
实验数据:
实验数据
代码详解:

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

if __name__=='__main__':
 mac2id=dict()
 onlinetimes=[]
 f=open('学生月上网时间分布-TestData.txt',encoding='gb18030',errors='ignore')#用于解决目标文件编码中出现的问题
 for line in f:
     mac=line.split(',')[2]
     onlinetime=int(line.split(',')[6])
     starttime=int(line.split(',')[4].split(' ')[1].split(':')[0])#取出小时的数据,具体操作:找到以逗号分隔的第5个数据中以空格分隔的后一个和以冒号分隔的第一个数据-22(以第一条数据为例)
     if mac not in mac2id:
         mac2id[mac]=len(onlinetimes)
         onlinetimes.append((starttime,onlinetime))
     else:
         onlinrtimes[mac2id[mac]]=[(starttime,onlinetime)]#将每一个mac地址中的上网时间放入字典中,如果重复,放入另一个字典(字典中同一目录多次写入数据会保留最后一次数据)
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_#调用DBSCAN算法并给每个数据标签
plt.hist(X,24)
plt.title("Distribution of student's onlinetime")
plt.xlabel("Time")
plt.ylabel("Numbers of students")
plt.show()#用图展示
print('Labels:')
print(labels)
ratio=len(labels[labels[:]== -1])/len(labels)
print('Noise ratio:',format(ratio,'.2%'))#计算标签为-1(噪声)的比例
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()否则就是小数组的输出方式

运行结果:
直方图展示
数据展示
实验总结:
DBSCAN算法可以很好的处理数据分类的任务,相比于K-means算法,它不用设置聚类中心的个数,并且对于噪声和数据偏差较大的样本点有着较好的鲁棒性。
但是当数据较为稀疏或数据间距离过大维数较高时,该算法的适用性较差。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值