【机器学习】利用numpy实现DBSCAN聚类算法(Python代码)

简介: 【机器学习】利用numpy实现DBSCAN聚类算法(Python代码)

简 介:下面是我在学习时候的记录并加上自己的理解。本文意在记录自己近期学习过程中的所学所得,如有错误,欢迎大家指正。

 

关键词:Python、机器学习、DBSCAN

自己实现DBSCAN算法,需要对两个参数ξ和Minpt的选取选取进行说明,语言不限。要能支持多维数组,距离用欧式距离。

"""
 * Created with PyCharm
 * 作者: 阿光
 * 日期: 2021/7/18
 * 时间: 21:53
 * 描述: 使用numpy实现DBSCAN
"""
import warnings
import numpy as np
import pandas as pd
from Draw import draw
warnings.filterwarnings('ignore')
epsilon = 4  # 定义邻域半径
M = 5  # 定义阈值
k = 0  # 类别标签
# 加载数据
data = pd.read_csv("../../data/cluster_500-10_7.csv", encoding="gbk")
X = data.iloc[:, 1:-2].values
y = data.iloc[:, -1].values.flatten()
label_ = np.zeros(len(X))
def dbscan(X):
    """
     * 描述: DBSCAN算法的主入口
     * 参数:
            X:样本数据
     * 返回值:
    """
    # 获取核心对象
    coreObjectList = get_coreobject(X)
    # 开始迭代每个核心对象,进行划圈
    iter_coreobject(coreObjectList, X)
def iter_coreobject(coreObjectList, X):
    """
     * 描述: 迭代每个核心对象,然后将其可达的对象划为一簇
     * 参数:
            coreObjectList:核心列表对象
            X:样本数据
     * 返回值:
    """
    def get_epsilonobject(row):
        """
         * 描述: 获取某个样本邻域内的样本
         * 参数:
                row:核心对象
         * 返回值: 邻域内的样本的索引
        """
        return np.where(np.sqrt((((X - row) ** 2).sum(axis=1))) <= epsilon)[0]
    def distance_epsilon(coreobject, X):
        """
         * 描述: 判断某一核心对象邻域内是否有核心对象,如果有重复该步骤,如果不是将其划为一簇
         * 参数:
                coreobject:核心对象
                X:样本数据
         * 返回值:
        """
        # 保存某一簇内的样本
        queue = [coreobject]
        # 判断队列中是否还存在数据
        while len(queue) != 0:
            object = X[queue.pop(0), :]
            # 判断其是否是核心对象,如果是将它的邻域内的样本也加入队列
            if judge_coreobject(X, object):
                nonlocal noAccess  # 获取上一层作用域的变量
                # 获取未访问和该核心对象邻域内样本的交集
                delta = set(noAccess).intersection(set(get_epsilonobject(object)))
                # 将邻域内的样本添加到队列
                queue.extend(delta)
                # 将已经访问的数据从noAccess中去掉
                noAccess = list(set(noAccess).difference(set(delta)))
    # 记录未被访问过的数据
    noAccess = list(range(X.shape[0]))
    # 判断是否还有核心对象可以进行迭代
    while len(coreObjectList) != 0:
        # 为了获取本次迭代的数据
        AccessOld = noAccess.copy()
        # 取出一个核心对象
        coreobject = coreObjectList.pop(0)
        # 扩充领域,添加邻域内的样本
        distance_epsilon(coreobject, X)
        # 取得本轮划分簇的数据,就是本次迭代到的数据
        cluster_k = list(set(AccessOld).difference(set(noAccess)))
        global k
        # 将本次迭代到的数据划分成一簇
        label_[[cluster_k]] = k
        # 将所有已经访问过的数据从noAccess中移除
        coreObjectList = list(set(coreObjectList).difference(set(cluster_k)))
        # 将簇+1
        k += 1
def judge_coreobject(X, row):
    """
     * 描述: 判断某一样本是否为核心对象
     * 参数:
            X:样本数据
            row:待判断的样本数据
     * 返回值: 返回true和false
    """
    # 判断在邻域距离内的样本数是否达到阈值
    if (np.sqrt(((X - row) ** 2).sum(axis=1)) <= epsilon).sum() - 1 >= M:
        return True
    return False
def get_coreobject(x):
    """
     * 描述: 迭代数据集,获取核心对象列表
     * 参数:
            x:样本数据
     * 返回值: 核心对象列表
    """
    # 初始化列表
    coreObjectList = []
    # 判断是否是核心对象
    for i, row in enumerate(x):
        if judge_coreobject(X, row):
            coreObjectList.append(i)
    return coreObjectList
if __name__ == "__main__":
    dbscan(X)
    draw(X, y, label_, 7)

目录
相关文章
|
4天前
|
SQL 自然语言处理 数据库
【Azure Developer】分享两段Python代码处理表格(CSV格式)数据 : 根据每列的内容生成SQL语句
本文介绍了使用Python Pandas处理数据收集任务中格式不统一的问题。针对两种情况:服务名对应多人拥有状态(1/0表示),以及服务名与人名重复列的情况,分别采用双层for循环和字典数据结构实现数据转换,最终生成Name对应的Services列表(逗号分隔)。此方法高效解决大量数据的人工处理难题,减少错误并提升效率。文中附带代码示例及执行结果截图,便于理解和实践。
|
2天前
|
人工智能 编解码 算法
如何在Python下实现摄像头|屏幕|AI视觉算法数据的RTMP直播推送
本文详细讲解了在Python环境下使用大牛直播SDK实现RTMP推流的过程。从技术背景到代码实现,涵盖Python生态优势、AI视觉算法应用、RTMP稳定性及跨平台支持等内容。通过丰富功能如音频编码、视频编码、实时预览等,结合实际代码示例,为开发者提供完整指南。同时探讨C接口转换Python时的注意事项,包括数据类型映射、内存管理、回调函数等关键点。最终总结Python在RTMP推流与AI视觉算法结合中的重要性与前景,为行业应用带来便利与革新。
|
2天前
|
存储 监控 算法
基于 Python 哈希表算法的员工上网管理策略研究
于当下数字化办公环境而言,员工上网管理已成为企业运营管理的关键环节。企业有必要对员工的网络访问行为予以监控,以此确保信息安全并提升工作效率。在处理员工上网管理相关数据时,适宜的数据结构与算法起着举足轻重的作用。本文将深入探究哈希表这一数据结构在员工上网管理场景中的应用,并借助 Python 代码示例展开详尽阐述。
26 3
|
3天前
|
人工智能 监控 算法
Python下的毫秒级延迟RTSP|RTMP播放器技术探究和AI视觉算法对接
本文深入解析了基于Python实现的RTSP/RTMP播放器,探讨其代码结构、实现原理及优化策略。播放器通过大牛直播SDK提供的接口,支持低延迟播放,适用于实时监控、视频会议和智能分析等场景。文章详细介绍了播放控制、硬件解码、录像与截图功能,并分析了回调机制和UI设计。此外,还讨论了性能优化方法(如硬件加速、异步处理)和功能扩展(如音量调节、多格式支持)。针对AI视觉算法对接,文章提供了YUV/RGB数据处理示例,便于开发者在Python环境下进行算法集成。最终,播放器凭借低延迟、高兼容性和灵活扩展性,为实时交互场景提供了高效解决方案。
|
15天前
|
存储 算法 文件存储
探秘文件共享服务之哈希表助力 Python 算法实现
在数字化时代,文件共享服务不可或缺。哈希表(散列表)通过键值对存储数据,利用哈希函数将键映射到特定位置,极大提升文件上传、下载和搜索效率。例如,在大型文件共享平台中,文件名等信息作为键,物理地址作为值存入哈希表,用户检索时快速定位文件,减少遍历时间。此外,哈希表还用于文件一致性校验,确保传输文件未被篡改。以Python代码示例展示基于哈希表的文件索引实现,模拟文件共享服务的文件索引构建与检索功能。哈希表及其分布式变体如一致性哈希算法,保障文件均匀分布和负载均衡,持续优化文件共享服务性能。
|
21天前
|
监控 算法 安全
公司电脑网络监控场景下 Python 广度优先搜索算法的深度剖析
在数字化办公时代,公司电脑网络监控至关重要。广度优先搜索(BFS)算法在构建网络拓扑、检测安全威胁和优化资源分配方面发挥重要作用。通过Python代码示例展示其应用流程,助力企业提升网络安全与效率。未来,更多创新算法将融入该领域,保障企业数字化发展。
41 10
|
22天前
|
监控 算法 安全
基于 Python 广度优先搜索算法的监控局域网电脑研究
随着局域网规模扩大,企业对高效监控计算机的需求增加。广度优先搜索(BFS)算法凭借其层次化遍历特性,在Python中可用于实现局域网内的计算机设备信息收集、网络连接状态监测及安全漏洞扫描,确保网络安全与稳定运行。通过合理选择数据结构与算法,BFS显著提升了监控效能,助力企业实现智能化的网络管理。
28 7
|
1月前
|
算法 Serverless 数据处理
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
62 12
|
1月前
|
算法 安全 网络安全
基于 Python 的布隆过滤器算法在内网行为管理中的应用探究
在复杂多变的网络环境中,内网行为管理至关重要。本文介绍布隆过滤器(Bloom Filter),一种高效的空间节省型概率数据结构,用于判断元素是否存在于集合中。通过多个哈希函数映射到位数组,实现快速访问控制。Python代码示例展示了如何构建和使用布隆过滤器,有效提升企业内网安全性和资源管理效率。
53 9
|
1月前
|
数据采集 供应链 API
实战指南:通过1688开放平台API获取商品详情数据(附Python代码及避坑指南)
1688作为国内最大的B2B供应链平台,其API为企业提供合法合规的JSON数据源,直接获取批发价、SKU库存等核心数据。相比爬虫方案,官方API避免了反爬严格、数据缺失和法律风险等问题。企业接入1688商品API需完成资质认证、创建应用、签名机制解析及调用接口四步。应用场景包括智能采购系统、供应商评估模型和跨境选品分析。提供高频问题解决方案及安全合规实践,确保数据安全与合法使用。立即访问1688开放平台,解锁B2B数据宝藏!

热门文章

最新文章