DBSCAN密度聚类算法python源代码实现(附完整数据集和代码)

转自:https://blog.csdn.net/Joyce_Ff/article/details/91955640

1.数据集

附数据集
链接:数据集788个点
提取码:rv06

2.聚类结果

在这里插入图片描述

3. 代码

提醒:如果图片不显示,请配置matplotlib.use('TkAgg'),如下面代码第7行所示。

# encoding:utf-8
import matplotlib.pyplot as plt
import pandas as pd
import random
import numpy as np
import math
import matplotlib
matplotlib.use('TkAgg')


# 计算两个点之间的欧式距离,参数为两个元组
def dist(t1, t2):
    dis = math.sqrt((np.power((t1[0] - t2[0]), 2) + np.power((t1[1] - t2[1]), 2)))
    return dis

# DBSCAN算法,参数为数据集,Eps为指定半径参数,MinPts为制定邻域密度阈值
def dbscan(Data, Eps, MinPts):
    num = len(Data)  # 点的个数
    unvisited = [i for i in range(num)]  # 没有访问到的点的列表
    visited = []  # 已经访问的点的列表
    C = [-1 for i in range(num)]  # C为输出结果,默认是一个长度为num的值全为-1的列表        
    k = -1  # 用k来标记不同的簇,k = -1表示噪声点
    while len(unvisited) > 0:        
        p = random.choice(unvisited)  # 随机选择一个unvisited对象
        unvisited.remove(p)
        visited.append(p)        
        N = []  # N为p的epsilon邻域中的对象的集合
        for i in range(num):
            if (dist(Data[i], Data[p]) <= Eps):  # and (i!=p):
                N.append(i)
        # 如果p的epsilon邻域中的对象数大于指定阈值,说明p是一个核心对象
        if len(N) >= MinPts:
            k = k + 1
            C[p] = k
            # 对于p的epsilon邻域中的每个对象pi
            for pi in N:
                if pi in unvisited:
                    unvisited.remove(pi)
                    visited.append(pi)
                    # 找到pi的邻域中的核心对象,将这些对象放入N中
                    # M是位于pi的邻域中的点的列表
                    M = []
                    for j in range(num):
                        if (dist(Data[j], Data[pi]) <= Eps):  
                            M.append(j)
                    if len(M) >= MinPts:
                        for t in M:
                            if t not in N:
                                N.append(t)
                # 若pi不属于任何簇,C[pi] == -1说明C中第pi个值没有改动
                if C[pi] == -1:
                    C[pi] = k
        # 如果p的epsilon邻域中的对象数小于指定阈值,说明p是一个噪声点
        else:
            C[p] = -1
    return C

if __name__ == '__main__':
	# 数据集二:788个点
	dataSet = pd.read_csv(r'E:\10-data\02-dbscan788points.txt')
	dataSet = dataSet.values.tolist()
	C = dbscan(dataSet, 2, 14)
	x, y = [], []
	for data in dataSet:
	    x.append(data[0])
	    y.append(data[1])
	plt.figure(figsize=(8, 6), dpi=80)
	plt.scatter(x, y, c=C, marker='o')
	plt.show()

参考链接:
[1] 手写算法-python代码实现DBSCAN 2020.12

  • 10
    点赞
  • 143
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值