当前位置: 代码迷 >> 综合 >> python sklearn DBSCAN 实例 上网时间聚类
  详细解决方案

python sklearn DBSCAN 实例 上网时间聚类

热度:64   发布时间:2023-12-08 23:56:24.0

python sklearn DBSCAN

DBSCAN密度聚类

DBSCAN算法是一种基于密度的聚类算法
1、聚类的时候不需要预先指定簇的个数
2、最终的簇的个数不定

DBSCAN数据点分为三类:

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

DBSCAN算法流程:

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

DBSCAN的应用实例

实验目的
通过DBSCAN聚类,分析学生上网时间和上网时长的模式
技术路线
sklearn.cluster.DBSCAN

实验过程:
建立工程,引入相关包–>加载数据,预处理数据–>
1、–>上网时长的取类分析–>分析结果
2、–>上网时间的聚类分析–>分析结果

主要参数
DBSCAN(eps=0.5,min_samples=5,metric=‘euclidean’,metric_params=None,
algorithm=‘auto’,leaf_size=30,p=None,n_jobs=None)
eps:两个样本被看作邻居节点的最大距离
min_samples:簇的样本数
metric:距离计算方式

实例代码

import numpy as np
import sklearn.cluster as skc
from sklearn import metrics
import matplotlib.pyplot as pltf=open('学生月上网时间分布-TestData.txt','r+',encoding='utf8')mac2id=dict()
onlinetmac=[]
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(onlinetmac)onlinetmac.append((starttime,onlinetime))else:onlinetime[mac2id[mac]]=[(starttime,onlinetime)]
real_x=np.array(onlinetmac).reshape((-1,2))#print(real_x)
x=real_x[:,0:1]
db=skc.DBSCAN(eps=0.01,min_samples=20).fit(x) #调用DBSCAN方法进行训练,labels为每个数据的簇标签
labels=db.labels_
print('Labels:')
print(labels)
raito=len(labels[labels[:]==-1])/len(labels) #打印数据被记上的标签,计算标签为-1,即噪声数据的比例
print('Noise raito:',format(raito,'.2%'))
n_clusters_=len(set(labels))-(1 if -1 in labels else 0)
print('Eatimated number of clusters: %d' % n_clusters_)
print('silhouetto 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)
plt.show()y=np.log(1+real_x[:,1:])
db_y=skc.DBSCAN(eps=0.14,min_samples=10).fit(x)
labels_y=db_y.labels_
print('Labels_y:')
print(labels_y)
raitc=len(labels_y[labels_y[:]==-1])/len(labels)
print('Noise raito:',format(raitc,'.2%'))
n_clusters_y=len(set(labels_y))-(1 if -1 in labels_y else 0)
print('Estimated number of clusters: %d' % n_clusters_y)
print('sihouette coefficient: %0.3f'% metrics.silhouette_score(y,labels))
for i in range(n_clusters_y):print('Cluster ',i,':')count=len(x[labels_y==1])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'))plt.hist(y)
plt.show()

数据下载:
数据