学生上网分析--DBSCAN密度聚类

DBSCAN算法是一种基于密度的聚类算法:
DBSCAN是基于一组邻域来描述样本集的紧密程度的,参数 (ϵ, MinPts) 用来描述邻域的样本分布紧密程度。其中,ϵ 描述了某一样本的邻域距离阈值,MinPts 描述了某一样本的距离为ϵ的邻域中样本个数的阈值。


1.聚类的时候不需要预先指定簇的个数;
2.最终的簇的个数不定。


DBSCAN算法将数据点分为三类:
核心点:在半径Eps内含有超过MinPts数目的点。
边界点:在半径Eps内点的数量小于MinPts,但是落在核心点的领域内。
噪音点:既不是核心点也不是边界点的点。

密度可达和密度相连直观解释:

从上图可以很容易看出理解上述定义,图中MinPts=5,红色的点都是核心对象,因为其ϵ-邻域至少有5个样本。黑色的样本是非核心对象。所有核心对象密度直达的样本在以红色核心对象为中心的超球体内,如果不在超球体内,则不能密度直达。图中用绿色箭头连起来的核心对象组成了密度可达的样本序列。在这些密度可达的样本序列的ϵ-邻域内所有的样本相互都是密度相连的。

        由密度可达关系导出的最大密度相连的样本集合,即为我们最终聚类的一个类别,或者说一个簇。这个DBSCAN的簇里面可以有一个或者多个核心对象。如果只有一个核心对象,则簇里其他的非核心对象样本都在这个核心对象的ϵ-邻域里;如果有多个核心对象,则簇里的任意一个核心对象的ϵ-邻域中一定有一个其他的核心对象,否则这两个核心对象无法密度可达。这些核心对象的ϵϵ-邻域里所有的样本的集合组成的一个DBSCAN聚类簇。

 

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

 

取Eps=3,MinPts=3,依据DBSCAN对所有点进行聚类(曼哈顿距离):

 

1.对每个点计算其邻域Eps=3内的点的集合。
2.集合内点的个数超过MinPts=3的点为核心点。
3.查看剩余点是否在核心点的邻域内,若在,则为边界点,否则为噪声点。

 

4.将距离不超过Eps=3的点相互连接,构成一个簇,核心点邻域内的点也会被加入到这个簇中。则右侧形成3个簇。

 

 

DBSCAN主要参数:
eps:两个样本被看作邻居节点的最大距离。
min_samples:簇的样本数。
metric:距离计算方式。

例:sklearn.cluster.DBSCAN(eps=0.5,min_samples=5,metric='euclidean')

 

 

 

学生上网分析--DBSCAN密度聚类:

数据样式:

 

 

'''
学生上网分析--DBSCAN密度聚类
'''

#导入相关包:
import numpy as np
import sklearn.cluster as skc
from sklearn import metrics
import matplotlib.pyplot as plt

f=open(r'd:\Users\zhanggl21\Desktop\Python机器学习应用\课程数据\聚类\学生月上网时间分布-TestData.txt',encoding='utf-8')

#读取每条数据中的mac地址、开始上网时间、上网时长:
mac2id=dict()
onlinetimes=[]


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] #提取出上网时间(小时)

#调用DBSCAN方法进行训练,labels为每个数据的簇标签:
db=skc.DBSCAN(eps=0.01,min_samples=20).fit(X)
labels=db.labels_

#打印数据被记上的标签,计算标签为-1即噪声数据的比例:
print('labels:\n',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('估计簇的个数为:%d' %(n_clusters_))
print('Silhouette Coefficient: %0.3f' %(metrics.silhouette_score(X,labels)))


#打印各簇标号以及各簇内数据
for i in range(n_clusters_):
	print('Cluster ',i,':\n',list(X[labels==i].flatten()),'\n')

打印的结果如下:

 

 

 

 

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: k-means和dbscan都是常用的聚类算法。 k-means算法是一种基于距离的聚类算法,它将数据集划分为k个簇,每个簇的中心点是该簇中所有点的平均值。该算法的优点是简单易懂,计算速度快,但需要预先指定簇的数量k,且对初始中心点的选择敏感。 dbscan算法是一种基于密度聚类算法,它将数据集中的点分为核心点、边界点和噪声点三类。核心点是指在半径为ε内至少有MinPts个点的点,边界点是指在半径为ε内不足MinPts个点但与核心点相邻的点,噪声点是指既不是核心点也不是边界点的点。该算法的优点是不需要预先指定簇的数量,能够发现任意形状的簇,但对于不同密度的簇效果可能不同,且需要置合适的参数ε和MinPts。 ### 回答2: K-means和DBSCAN都是常用的聚类算法。 K-means算法是一种基于中心点的聚类算法,其目标是将数据点划分到不同的簇中,使得同一簇内的数据点彼此相似度高,不同簇间的数据点相似度低。算法工作流程如下: 1. 随机选择K个初始中心点; 2. 将各个数据点分配给最近的中心点,形成K个簇; 3. 对于每个簇,计算其中所有数据点的平均值,将该平均值作为新的中心点; 4. 重复步骤2和步骤3,直到簇的中心点不再发生变化或达到预迭代次数。 K-means算法的优点是简单易懂、计算时间短,对于大规模数据也有不错的效果。但是其缺点也比较明显,如需要指定簇的数量,且对于空间形状不规则的数据或噪声数据处理效果较差。 DBSCAN算法是一种基于密度聚类算法,其核心思想是将密度相连的数据点划分为一个簇中,将稀疏区域中的数据点划分为噪声数据。算法工作流程如下: 1. 选择一个数据点,检查其邻域内是否有足够多的数据点,如果有足够多的数据点,则将该数据点作为核心点; 2. 核心点的邻域内所有的点组成一个簇,将所有邻域内密度不足的点视为噪声数据,未被分配簇的点到簇中; 3. 扫描所有未被访问的点,如果该点被一个簇访问,则将其加入该簇中。 DBSCAN算法的优点是可以发现任意形状的簇,不需要指定簇的数量,而且可以有效处理噪声数据。但是其缺点也比较明显,如容易受到密度相差悬殊的数据分布影响,计算时间随着数据规模的增大而呈指数增长。 综上,两种算法各有优缺点,需要根据应用场景选择合适的算法。 ### 回答3: K-means和DBSCAN是常用的聚类算法,它们可以用于将数据集中的数据对象分组成不同的簇。虽然K-means和DBSCAN都是聚类算法,但它们之间有很多的区别。 K-means是一种迭代算法,其原理是将所有数据对象划分为K个簇,在每次迭代中,计算每个簇的中心点,并将与中心点最近的数据对象划分到该簇中。然后重新计算每个簇的中心点,并再次将数据对象划分到最近的簇中,直到收敛为止。K-means算法简单且易于理解,但需要人工对簇的数量做出选择。 DBSCAN是一种基于密度聚类算法,它的核心思想是,一个簇是由相互密集连接的数据对象组成的,而簇与簇之间的密度差别较大。DBSCAN算法的过程是首先选取一个未被访问的数据对象,然后找出该对象密度可达的所有数据对象,将它们归为一个簇,并递归地找出这些簇的邻居,直到所有的数据对象都被归为一个簇或者标记为噪声点。DBSCAN算法不需要人工指定簇的数量,因此比K-means更加灵活和自适应。 总之,K-means和DBSCAN算法在聚类过程中采用了不同的原理和策略,各有其适用的场景。K-means适用于数据分布比较规则和簇的数量明确的情况下,而DBSCAN适用于数据分布不规则、簇的数量不确定或者簇的密度变化不同的情况下。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值