聚类DBSCAN学生月上网时间分布聚类实例

**

基于《Python机器学习》——北京理工大学 学习笔记

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',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])        #读取每条数据的MAC地址,开始上网时间,上网时长
    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]              #提取每行第一列元素
 
db=skc.DBSCAN(eps=0.01,min_samples=20).fit(X)     #调用DBSCAN进行训练,labels为每个簇的标签  
labels = db.labels_
 
print('Labels:')                                             #打印数据被记上的标签,噪声数据的标签为-1
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('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()))
     
plt.hist(X,24)
plt.show()

个别函数用法说明:

  1. flatten( ) :flatten是numpy.ndarray.flatten的一个函数,即返回一个一维数组。flatten只能适用于numpy对象,即array或者mat,普通的list列表不适用。例如:

    a.flatten():按默认方向降维
    a.flatten(‘F’):按列方向降维
    a.flatten(‘A’):按行方向降维

https://www.jb51.net/article/150035.htm

  1. set():set函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。例如:
    在这里插入图片描述

个别参数说明

1.eps:两个样本被看作邻居节点的最大距离
2.min_sample:簇的样本数
3.metrics:距离计算方式(默认欧几里得距离)
4.轮廓系数(Silhouette Coefficient)的值是介于 [-1,1] ,越趋近于1代表内聚度和分离度都相对较优

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,以下是一个简单的 DBSCAN 聚类算法实例: 假设我们有以下 10 个数据点: ``` data = [(2, 3), (2, 4), (2, 5), (3, 4), (3, 5), (4, 4), (4, 5), (6, 6), (7, 7), (8, 8)] ``` 我们要使用 DBSCAN 算法对这些数据点进行聚类。首先,我们需要选择两个参数:半径 `eps` 和最小数据点数 `min_samples`。这里我们选取 `eps=1.5` 和 `min_samples=3`。 接下来,我们按照以下步骤进行聚类: 1. 随机选择一个未被访问过的数据点 p。 2. 找出以 p 为中心,半径为 eps 的圆内的所有数据点。 3. 如果圆内的数据点数目大于等于 min_samples,则将这些数据点标记为核心点,并创建一个新的簇。 4. 如果圆内的数据点数目小于 min_samples,则将 p 标记为噪声点。 5. 从圆内的所有数据点开始,递归地找出所有密度可达的数据点,并将它们加入到当前簇中。 6. 重复以上步骤,直到所有数据点都被访问过。 根据以上步骤,我们可以得到以下聚类结果: ``` data_labels = [-1, 0, 0, 0, 0, 0, 0, -1, 1, 2] ``` 其中,-1 表示噪声点,0 表示第一个簇,1 表示第二个簇,2 表示第三个簇。 具体实现可以使用 Python 的 Scikit-learn 库,代码如下: ```python from sklearn.cluster import DBSCAN data = [(2, 3), (2, 4), (2, 5), (3, 4), (3, 5), (4, 4), (4, 5), (6, 6), (7, 7), (8, 8)] dbscan = DBSCAN(eps=1.5, min_samples=3) data_labels = dbscan.fit_predict(data) print(data_labels) ``` 输出结果为: ``` [-1 0 0 0 0 0 0 -1 1 2] ``` ### 回答2: DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种密度聚类算法,可以用来发现具有相似特征的数据点群集,并且可以识别数据中的噪声。 下面是一个使用DBSCAN算法的实例: 假设我们有一组二维数据点,要对其进行聚类操作。数据点的分布如下: (1, 2), (2, 3), (3, 3), (8, 9), (9, 10), (10, 8), (4, 5), (7, 7), (8, 7), (9, 6) 在执行DBSCAN算法之前,我们需要指定两个参数:邻域半径(ε)和最小点数(MinPts)。假设我们将ε设为2.5,MinPts设为3。 首先,选择一个未被访问的数据点(例如,(1, 2)),以这个点为中心,找到其ε领域内的所有点。如图所示,与(1, 2)距离小于2.5的点有(2, 3)和(3, 3)。 然后,对于每个邻域内的点,再次找到其ε领域内的所有点。我们发现(2, 3)和(3, 3)的ε领域内没有其他点。 由于(2, 3)满足最小点数的要求(MinPts≤2),所以将它标记为核心点,并为其创建一个新的簇。然后,将(3, 3)标记为已访问。 对于下一个未被访问的点(4, 5),重复上述过程。发现与(4, 5)距离小于2.5的点有(7, 7)和(8, 7),(7, 7)又与(8, 7)距离小于2.5。 (4, 5)、(7, 7)和(8, 7)满足最小点数的要求,所以它们都被标记为核心点,并为它们创建一个新的簇。 然后,按照相同的过程,依次处理所有未被访问的数据点。 最后,剩余的无法满足最小点数要求的点都被标记为噪声,它们不属于任何一个簇。 根据以上的操作,我们可以得到两个聚类簇,分别包含点(1, 2)、(2, 3)、(3, 3)和(4, 5)、(7, 7)、(8, 7),并且有三个噪声点(8, 9)、(9, 10)、(10, 8)。 DBSCAN算法通过基于密度的定义来进行聚类,可以发现任意形状的簇,并且相对于K-means等算法对噪声更加鲁棒。 ### 回答3: DBSCAN是一种基于密度的聚类算法,可以自动发现具有相似密度的数据点。它的主要优势是可以处理任意形状的聚类,并且不需要事先指定聚类数目。 下面是一个关于DBSCAN聚类算法的实例: 我们假设有一个二维数据集,包含一些分布不规则的数据点。我们希望使用DBSCAN算法将数据点聚类成若干个簇。 首先,我们选择一个适当的半径r和一个最小的密度阈值minPts作为DBSCAN算法的参数。然后从数据集中选择一个未访问的数据点作为起始点。接下来,我们计算起始点的ε-邻域,即与起始点距离不超过r的所有数据点。如果ε-邻域中的数据点数目大于等于minPts,说明起始点是一个核心点。 然后,我们将这个核心点及其ε-邻域中的所有数据点标记为一个簇,并继续对这个簇中的每个未访问点进行进一步的密度可达判断。如果某个点也是核心点,则将其ε-邻域中的所有未访问点添加到当前簇中。 如果一个数据点不是核心点,但是在其他簇的ε-邻域中,我们将其标记为边界点。边界点不会形成新的簇,但是会被分配到相应的簇中。 最后,如果一个数据点既不是核心点也不是边界点,则将其标记为噪声点。 通过这样的过程,我们可以将数据点划分为若干个簇,每个簇代表一个聚类。而噪声点则表示无法归类的数据。 DBSCAN算法不仅适用于二维数据,也可以用于高维数据。它的聚类结果不仅能够处理不同形状的簇,还能够自动确定簇的个数。因此,在实际应用中,DBSCAN算法具有较高的灵活性和可靠性,并且被广泛应用于数据挖掘和机器学习领域。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值