学生上网分析--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')

打印的结果如下:

 

 

 

 

 

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

### 基于DBSCAN的无监督密度聚类分析 #### DBSCAN算法概述 DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的空间聚类算法,其核心思想是通过寻找高密度区域并将其划分为簇,而低密度区域则被认为是噪声或孤立点。该算法的主要特点是无需提前定簇的数量,并能发现任意形状的簇结构[^4]。 #### 实现DBSCAN进行无监督密度聚类分析的关键要素 1. **输入数据准备** 数据应经过必要的预处理步骤,例如标准化或归一化操作,以便不同特征之间的量纲差异不会影响距离计算的结果[^2]。 2. **参数选择** - `eps` (Epsilon): 定义邻域半径,用于判断两个点是否属于同一个簇。 - `minPts`: 邻域内的最小点数阈值,决定一个点成为核心点所需的最少邻居数量。 合理的选择这两个参数对于获得良好的聚类效果至关重要。可以通过网格搜索法或者可视化手段辅助调整参数组合[^3]。 3. **执行DBSCAN算法** 使用Python中的Scikit-learn库可以方便地实现DBSCAN算法的应用。以下是具体的代码示例: ```python from sklearn.cluster import DBSCAN import numpy as np import matplotlib.pyplot as plt # 准备样本数据 X = np.array([[1, 2], [2, 2], [2, 3], [8, 7], [8, 8], [25, 80]]) # 初始化DBSCAN模型 dbscan = DBSCAN(eps=3, min_samples=2) # 训练模型 labels = dbscan.fit_predict(X) # 输出结果 print("Cluster labels:", labels) # 绘制散点图展示聚类结果 plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', s=50) plt.title('DBSCAN Cluster Results') plt.show() ``` 此代码片段展示了如何利用DBSCAN对二维数据集进行聚类,并通过颜色区分不同的簇以及噪声点。 #### 参数调优策略 为了优化DBSCAN的表现,在实际应用中通常采用以下几种方式: - 利用肘部法则或其他评估指标(如Silhouette Score),结合多种`(eps,minPts)`组合测试找出最优解; - 构建多张散点图对比不同参数下的分组情况,直观挑选最合适的配置方案; ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值