编程实现DBSCAN密度聚类算法,并以西瓜数据集4.0为例进行聚类效果分析

编程实现DBSCAN密度聚类算法,并以西瓜数据集4.0为例进行聚类效果分析

西瓜数据集4.0:

csv文件链接: 百度网盘
链接:https://pan.baidu.com/s/1NJmdbm5-3wh6EQUiHEOByA
提取码:6666

# 记得第一行要加类别标签
密度,含糖率
0.697,0.46
0.774,0.376
0.634,0.264
0.608,0.318
0.556,0.215
0.403,0.237
0.481,0.149
0.437,0.211
0.666,0.091
0.243,0.267
0.245,0.057
0.343,0.099
0.639,0.161
0.657,0.198
0.36,0.37
0.593,0.042
0.719,0.103
0.359,0.188
0.339,0.241
0.282,0.257
0.748,0.232
0.714,0.346
0.483,0.312
0.478,0.437
0.525,0.369
0.751,0.489
0.532,0.472
0.473,0.376
0.725,0.445
0.446,0.459

代码实现:

# ssy_4_DBSCANimport math
import numpy as np
import pandas as pd
import pylab as pl

xigua = pd.read_csv('xigua4.csv')
dataset=[(i[0],i[1]) for i in xigua.values]
#计算欧几里得距离,a,b分别为两个元组
def dist(a, b):
    return math.sqrt(math.pow(a[0]-b[0], 2)+math.pow(a[1]-b[1], 2))

#算法模型
def DBSCAN(D, e, Minpts):
    
    #初始化核心对象集合T,聚类个数k,聚类集合C, 未访问集合P,
    T = set() 
    k = 0 
    C = []
    P = set(D)
    for d in D:
        if len([ i for i in D if dist(d, i) <= e]) >= Minpts:
            T.add(d)
    #开始聚类
    #所有的核心的 有多个类
    while len(T):
        P_old = P
        #选取一个核心点
        o = list(T)[np.random.randint(0, len(T))]
        #把核心点从未选取中取出
        P = P - set(o)
        Q = []
        Q.append(o)
        while len(Q):
            q = Q[0]
            #核心点周围的点
            Nq = [i for i in D if dist(q, i) <= e]
            #核心点和周围的点都记录下来
            if len(Nq) >= Minpts:
                S = P & set(Nq)
                Q += (list(S))
                P = P - S
            Q.remove(q)
        k += 1
        Ck = list(P_old - P)
        T = T - set(Ck)
        C.append(Ck)
    return C
#画图  shanyou_4_DBSCAN
    
def draw(C):
    
    colValue = ['r', 'y', 'g', 'b', 'c', 'k', 'm']
    for i in range(len(C)):
        coo_X = []  #x坐标列表
        coo_Y = []  #y坐标列表
        for j in range(len(C[i])):
            coo_X.append(C[i][j][0])
            coo_Y.append(C[i][j][1])
        pl.scatter(coo_X, coo_Y, marker='o', color=colValue[i%len(colValue)], label=i+1)
    pl.legend(loc='upper left')
    pl.show()

C = DBSCAN(dataset, 0.11, 5) 
draw(C)
最终聚类结果图:

在这里插入图片描述

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 好的,我可以为您提供一个Python实现DBSCAN密度聚类算法,并使用它对数据集进行聚类,并绘制聚类结果。 首先,我们需要导入需要的Python库:numpy, pandas, matplotlib和sklearn。 ```python import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.datasets import make_blobs from sklearn.cluster import DBSCAN ``` 接下来,我们可以生成一个随机的数据集,用于演示DBSCAN算法聚类效果。 ```python X, y_true = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0) plt.scatter(X[:, 0], X[:, 1], s=50) plt.show() ``` 数据集生成代码可以看到,我们生成了一个包含300个样本的数据集,其中心点为4个,标准差为0.6。 接下来,我们可以使用DBSCAN算法数据集进行聚类。 ```python dbscan = DBSCAN(eps=0.7, min_samples=5) y_pred = dbscan.fit_predict(X) ``` 在这里,我们设置了DBSCAN算法的两个参数:eps和min_samples。eps表示两个点之间的最大距离,超出这个距离的点将不再被视为同一簇。min_samples表示一个簇中至少要有多少个点才能被视为有效簇。 最后,我们可以使用matplotlib库将聚类结果可视化。 ```python plt.scatter(X[:, 0], X[:, 1], c=y_pred, s=50) plt.show() ``` 完整代码如下: ```python import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.datasets import make_blobs from sklearn.cluster import DBSCAN X, y_true = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0) plt.scatter(X[:, 0], X[:, 1], s=50) plt.show() dbscan = DBSCAN(eps=0.7, min_samples=5) y_pred = dbscan.fit_predict(X) plt.scatter(X[:, 0], X[:, 1], c=y_pred, s=50) plt.show() ``` 运行后,我们可以看到数据集聚类结果。 ### 回答2: DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度聚类算法,用于发现具有相似密度的数据点组成的聚类DBSCAN算法的主要思想是通过指定半径ϵ和最小密度阈值MinPts来划分数据点。首先,随机选择一个未被访问的数据点,并标记为已访问。然后,找到该点的ϵ邻域内的所有点,如果该邻域内点的个数大于等于MinPts,则这些点被归为一个簇。如果该邻域内的点数量小于MinPts,则该点被标记为噪声点。对于邻域内的每个可达点,递归地进行相同的操作。最后,所有被标记为簇的点和噪声点组成了聚类结果。 下面是一个自行编写的DBSCAN密度聚类算法的简单示例代码: ```python import numpy as np import matplotlib.pyplot as plt def euclidean_distance(point1, point2): return np.sqrt(np.sum((point1 - point2)**2)) def region_query(data, point_index, epsilon): neighbors = [] for i in range(len(data)): if i != point_index and euclidean_distance(data[point_index], data[i]) <= epsilon: neighbors.append(i) return neighbors def expand_cluster(data, labels, point_index, cluster_label, epsilon, min_pts): neighbors = region_query(data, point_index, epsilon) if len(neighbors) < min_pts: labels[point_index] = -1 # 标记为噪声点 else: labels[point_index] = cluster_label for neighbor in neighbors: if labels[neighbor] == 0: # 未被访问过的点 labels[neighbor] = cluster_label expand_cluster(data, labels, neighbor, cluster_label, epsilon, min_pts) def dbscan(data, epsilon, min_pts): num_samples = len(data) labels = np.zeros(num_samples) # 0表示未被标记 cluster_label = 0 for i in range(num_samples): if labels[i] != 0: continue neighbors = region_query(data, i, epsilon) if len(neighbors) < min_pts: labels[i] = -1 # 标记为噪声点 else: cluster_label += 1 labels[i] = cluster_label for neighbor in neighbors: if labels[neighbor] != 0: # 已经被聚类过 continue labels[neighbor] = cluster_label expand_cluster(data, labels, neighbor, cluster_label, epsilon, min_pts) return labels # 生成随机数据集 np.random.seed(0) data = np.random.randn(100, 2) # 使用DBSCAN进行聚类 epsilon = 0.5 min_pts = 5 labels = dbscan(data, epsilon, min_pts) # 绘制聚类结果 plt.scatter(data[:, 0], data[:, 1], c=labels) plt.show() ``` 上述代码中,首先定义了计算欧几里德距离的函数euclidean_distance和查找邻域内的点的函数region_query。然后,定义了递归扩展簇的函数expand_cluster和整个DBSCAN算法的函数dbscan。最后,生成了一个随机数据集并使用DBSCAN聚类算法进行聚类,最终绘制出了聚类结果。 ### 回答3: DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度聚类算法,可以有效地发现具有不同密度聚类。以下是使用Python编写的DBSCAN算法的步骤,并通过绘制数据集聚类结果来说明。 步骤一:导入所需的库和数据集 首先,我们需要导入所需的库,如numpy和matplotlib,并加载一个适当的数据集,用于聚类。 步骤二:定义DBSCAN算法函数 接下来,我们需要定义DBSCAN算法的主要函数。DBSCAN算法有三个重要的参数,即eps、min_samples和metric。eps表示两个样本之间的最大距离,min_samples表示簇中所需的最小样本数量,metric表示距离度量标准。 步骤三:计算核心对象 在DBSCAN算法中,我们首先计算出核心对象。核心对象是指位于距离范围eps内具有min_samples数量以上的样本点。 步骤四:确定簇标签 接下来,根据核心对象的连接性,我们确定每个样本点的簇标签。如果两个样本点相互可达,并且至少有一个样本点是核心对象,则它们属于同一个簇。 步骤五:绘制聚类结果 最后,我们使用matplotlib库将聚类的结果可视化。通过在散点图上使用不同的颜色表示不同的簇,我们可以直观地看到数据集聚类效果。 用300字中文回答:自行编写DBSCAN密度聚类算法并绘制数据集聚类结果就是以上步骤的整合。我们首先导入所需的库和数据集,然后定义DBSCAN算法函数。接下来,我们计算核心对象,并根据其连接性确定簇标签。最后,我们使用matplotlib库将聚类结果可视化。这样,我们就成功地自行编写了DBSCAN密度聚类算法并绘制了数据集聚类结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只水熊虫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值