凝聚层次聚类及DBscan算法详解与Python实例

news/2024/5/20 10:15:42 标签: python, 算法, 聚类

凝聚层次聚类及DBscan算法详解与Python实例

在本篇博客中,我们将深入探讨凝聚层次聚类(Agglomerative Hierarchical Clustering)和DBscan算法,并通过Python实例演示它们的应用。这两种算法都属于聚类算法的范畴,用于将数据点划分为不同的簇。
在这里插入图片描述

凝聚层次聚类

凝聚层次聚类是一种层次化的聚类方法,其主要思想是将每个数据点视为一个初始簇,然后逐步合并相邻的簇,直到满足停止条件。以下是一个简单的Python实例,演示了如何使用凝聚层次聚类对随机生成的点进行聚类

python">import math
import random
import pylab

class Point:
    __slots__ = ["x", "y", "group"]
    def __init__(self, x=0, y=0, group=0):
        self.x, self.y, self.group = x, y, group

# 生成随机数据点
def generatePoints(pointsNumber, radius):
    points = [Point() for _ in range(4 * pointsNumber)]
    originX = [-radius, -radius, radius, radius]
    originY = [-radius, radius, -radius, radius]
    count = 0
    countCenter = 0
    for index, point in enumerate(points):
        count += 1
        r = random.random() * radius
        angle = random.random() * 2 * math.pi
        point.x = r * math.cos(angle) + originX[countCenter]
        point.y = r * math.sin(angle) + originY[countCenter]
        point.group = index
        if count >= pointsNumber * (countCenter + 1):
            countCenter += 1    
    return points

# 计算两点间的欧氏距离
def solveDistanceBetweenPoints(pointA, pointB):
    return (pointA.x - pointB.x) ** 2 + (pointA.y - pointB.y) ** 2

# 获取距离映射
def getDistanceMap(points):
    distanceMap = {}
    for i in range(len(points)):
        for j in range(i + 1, len(points)):
            distanceMap[str(i) + '#' + str(j)] = solveDistanceBetweenPoints(points[i], points[j])
    distanceMap = sorted(distanceMap.items(), key=lambda dist:dist[1], reverse=False)
    return distanceMap

# 凝聚层次聚类算法
def agglomerativeHierarchicalClustering(points, distanceMap, mergeRatio, clusterCenterNumber):
    unsortedGroup = {index: 1 for index in range(len(points))}
    for key, _ in distanceMap:
        lowIndex, highIndex = int(key.split('#')[0]), int(key.split('#')[1])
        if points[lowIndex].group != points[highIndex].group:
            lowGroupIndex = points[lowIndex].group
            highGroupIndex = points[highIndex].group
            unsortedGroup[lowGroupIndex] += unsortedGroup[highGroupIndex]
            del unsortedGroup[highGroupIndex]
            for point in points:
                if point.group == highGroupIndex:
                    point.group = lowGroupIndex
        if len(unsortedGroup) <= int(len(points) * mergeRatio):
            break
    sortedGroup = sorted(unsortedGroup.items(), key=lambda group: group[1], reverse=True)
    topClusterCenterCount = 0
    for key, _ in sortedGroup:
        topClusterCenterCount += 1
        for point in points:
            if point.group == key:
                point.group = -1 * topClusterCenterCount
        if topClusterCenterCount >= clusterCenterNumber:
            break
    return points

# 可视化聚类结果
def showClusterAnalysisResults(points):
    colorStore = ['or', 'og', 'ob', 'oc', 'om', 'oy', 'ok']
    pylab.figure(figsize=(9, 9), dpi=80)
    for point in points:
        color = ''
        if point.group < 0:
            color = colorStore[-1 * point.group - 1]
        else:
            color = colorStore[-1]
        pylab.plot(point.x, point.y, color)
    pylab.show()

# 主函数
def main():
    clusterCenterNumber = 4
    pointsNumber = 500
    radius = 10
    mergeRatio = 0.025
    points = generatePoints(pointsNumber, radius)
    distanceMap = getDistanceMap(points)
    points = agglomerativeHierarchicalClustering(points, distanceMap, mergeRatio, clusterCenterNumber)
    showClusterAnalysisResults(points)

main()

在这个例子中,我们首先生成了一个包含随机数据点的数据集,然后使用凝聚层次聚类算法对这些点进行聚类。通过调整参数,如clusterCenterNumberpointsNumber等,我们可以观察到不同的聚类效果。最终,我们通过可视化展示了聚类的结果。

DBscan算法

DBscan(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,具有排除噪声点的优势。该算法通过定义密度的概念,将数据点划分为核心点、边界点和噪声点。以下是DBscan算法的Python实例:

python"># 代码部分略,详见前文提供的Python代码

在DBscan算法中,我们需要设置参数,如Eps(领域半径)和minPointsNumberWithinBoundary(边界点最小邻居数)。通过调整这些参数,我们可以对数据点进行不同粒度和范围的聚类,以满足具体问题的要求。

实例演示

在博客的最后,我们通过实例演示了凝聚层次聚类和DBscan算法在随机点集上的应用,通过可视化的方式展示了聚类的效果。读者可以通过运行这些代码,并自行调整参数,深入理解这两种聚类算法的工作原理。

通过本篇博客,读者可以学到如何使用Python实现凝聚层次

聚类和DBscan算法,并了解如何通过调整参数优化聚类效果。这两种算法在不同场景下具有广泛的应用,是聚类分析中重要的工具。希望本文对大家学习聚类算法有所帮助。


http://www.niftyadmin.cn/n/5306001.html

相关文章

最长连续序列【哈希】

Problem: 128. 最长连续序列 文章目录 思路解题方法复杂度Code 思路 用set去重并且使用hash查找某个数存在与否 解题方法 遍历每个数&#xff0c;先判断这个数-1是否在hash表里面&#xff0c;如果在则跳过&#xff0c;否则从这个数开始一直枚举&#xff0c;一直到枚举到的数不在…

【C语言深度解剖——第二节(关键字2)】《C语言深度解剖》+蛋哥分析+个人理解

今日的星辰辉映太古的源起&#xff0c;过往的故事指引明日的生死&#xff01;&#xff08;王者荣耀李信&#xff09; 本文由睡觉待开机原创&#xff0c;未经允许不得转载。 本内容在csdn网站首发 欢迎各位点赞—评论—收藏 如果存在不足之处请评论留言&#xff0c;共同进步&…

高并发如何保证接口的幂等性?

前言 接口幂等性问题&#xff0c;对于开发人员来说&#xff0c;是一个跟语言无关的公共问题。本文分享了一些解决这类问题非常实用的办法&#xff0c;绝大部分内容我在项目中实践过的&#xff0c;给有需要的小伙伴一个参考。 不知道你有没有遇到过这些场景&#xff1a; 有时我…

Selenium-java 定位元素时切换iFrame时的方法

具体方法如下图所示&#xff0c;如果iFrame中嵌套多层iFrame需要逐层定位到需要的那一层iFrame,完成操作后&#xff0c;执行该代码&#xff1a;driver.switchTo() .defaultContent() ; 是返回最顶部的frame

如何访问GitHub快的飞起?两步解决访问超时GitHub,无法访问GitHub的问题

1.查找国内访问比较快的IP 站长工具网址&#xff1a; https://tool.chinaz.com 测速链接: https://tool.chinaz.com/speedtest/github.com 输入 github.com 点击查看分析 往下滑动&#xff0c;找一个比较快的IP&#xff0c;然后去修改hosts配置文件 &#xff08;例如&#xff…

一切皆文件有必要单独提出来说

引述 Unix/Linux操作系统血脉&#xff0c;一切皆文件的设计哲学被一直继承了下来。 以前多次很有疑问&#xff0c;为什么操作系统设计上会锚点到文件上呢&#xff1f; 图灵机 如果去刨根问底一切皆文件的设计哲学&#xff0c;就不得不提到图灵机理论。 在图灵机模型中&…

一致性算法Paxos

Paxos Paxos 算法解决的问题是一个分布式系统如何就某个值&#xff08;决议&#xff09;达成一致。一个典型的场景是&#xff0c;在一个分布式数据库系统中&#xff0c;如果各节点的初始状态一致&#xff0c;每个节点执行相同的操作序列&#xff0c;那么他们最后能得到一个一致…

bootstrap5实现家具品牌商城网站Furniq(电商通用)

一、需求分析 家具品牌宣传网站是指用于宣传和推广家具品牌的网站。它的功能主要包括以下几个方面&#xff1a; 品牌介绍&#xff1a;家具品牌宣传网站通常会提供关于品牌的背景信息&#xff0c;包括品牌的历史、核心价值观、设计理念等。这些信息可以帮助消费者了解品牌的定位…