K-medoids算法原理及Python实践

news2024/11/15 14:10:27

一、原理

K-medoids算法是一种聚类算法,它的原理与K-Means算法相似,但关键区别在于它使用数据集中的实际点(称为medoids)作为簇的中心点,而不是像K-Means那样使用簇内所有点的平均值。以下是K-medoids算法的主要原理:

1. 初始化

选择初始Medoids:首先,从数据集中随机选择K个数据点作为初始的medoids,这些medoids将作为初始的簇中心点。

2. 分配数据点到簇

计算距离:对于数据集中的每个非medoid点,计算它到所有K个medoids的距离。

分配簇:根据计算得到的距离,将每个非medoid点分配到离它最近的medoid所在的簇中。

3. 更新簇中心点

选择新的Medoids:在每个簇中,尝试用簇内的其他非medoid点替换当前的medoid。替换的标准是使得替换后簇内所有点到新medoid的总距离(或称为代价)最小化。

接受或拒绝替换:如果替换某个medoid后,簇的总距离减小了,则接受这个替换;否则,保持原来的medoid不变。

4. 迭代

重复分配和更新:重复上述的分配和更新步骤,直到medoids不再发生变化,或者达到预设的最大迭代次数。

5. 输出结果

最终簇和Medoids:当算法收敛时,输出最终的K个簇以及每个簇的medoid。

优点

鲁棒性:由于medoids是数据集中的实际点,K-medoids算法对噪声和离群点具有更好的鲁棒性。

可解释性:每个簇的medoid可以直接观察和分析,使得聚类结果更容易解释。

缺点

计算复杂度:与K-Means算法相比,K-medoids算法的计算复杂度更高,因为每次迭代都需要在每个簇中选择一个新的medoid,这通常涉及大量的距离计算。

敏感性:K-medoids算法的性能也受到初始medoids选择的影响,不同的初始选择可能导致不同的聚类结果。

应用

K-medoids算法广泛应用于各种领域的数据聚类分析中,特别是在需要处理噪声和离群点的情况下。在Python中,可以使用scikit-learn库中的KMedoids类来实现K-medoids算法。

总之,K-medoids算法通过选择数据集中的实际点作为簇的中心点,并在迭代过程中不断优化这些中心点,从而实现了对数据的有效聚类。

二、Python实践

K-medoids算法的Python实现可以通过自定义函数来完成,但请注意,scikit-learn库本身并不直接提供K-medoids的实现(尽管它提供了K-Means和其他聚类算法)。不过,我们可以利用sklearn.cluster中的KMedoids类(注意:在较新版本的scikit-learn中,这个类可能不是内置的,但可以通过sklearn.cluster.k_medoids_函数访问,或者你可以使用第三方库如pyclustering)。

然而,为了演示目的,我将提供一个简单的K-medoids算法的Python实现。这个实现将包括初始化、分配数据点到簇、以及更新簇中心(medoids)的基本步骤。

请注意,这个实现可能不是最优的,特别是在处理大数据集时,因为它在每次迭代中都会计算所有数据点到所有候选medoids的距离。

import numpy as np

def find_closest(points, medoid):

    """找到离给定medoid最近的点"""

    distances = np.sqrt(((points - medoid)**2).sum(axis=1))

    return np.argmin(distances)

def k_medoids(X, k, max_iter=100):

    """

    K-medoids聚类算法的实现。

    参数:

    - X: ndarray, 形状为 (n_samples, n_features),数据点集合。

    - k: int, 要形成的簇的数量。

    - max_iter: int, 最大迭代次数。

    返回:

    - medoids: ndarray, 形状为 (k, n_features),每个簇的medoid。

    - labels: ndarray, 形状为 (n_samples,), 每个点的簇标签。

    """

    n_samples, n_features = X.shape

   

    # 初始化medoids

    medoid_indices = np.random.choice(n_samples, k, replace=False)

    medoids = X[medoid_indices]

   

    # 迭代开始

    for _ in range(max_iter):

        # 分配簇

        clusters = [[] for _ in range(k)]

        for i in range(n_samples):

            distances = np.sqrt(((X[i] - medoids)**2).sum(axis=1))

            closest_medoid_index = np.argmin(distances)

            clusters[closest_medoid_index].append(i)

       

        # 尝试更新medoids

        new_medoids = np.copy(medoids)

        for j in range(k):

            if len(clusters[j]) > 0:

                cluster_points = X[clusters[j]]

                new_medoid_index = find_closest(cluster_points, new_medoids[j])

                new_medoids[j] = cluster_points[new_medoid_index]

       

        # 检查是否收敛

        if np.array_equal(new_medoids, medoids):

            break

       

        medoids = new_medoids

   

    # 为每个点分配簇标签

    labels = np.zeros(n_samples, dtype=int)

    for j in range(k):

        for point in clusters[j]:

            labels[point] = j

   

    return medoids, labels

# 示例用法

if __name__ == "__main__":

    np.random.seed(0)

    X = np.random.randn(100, 2)  # 生成一些随机数据

    k = 3  # 聚类数量

    medoids, labels = k_medoids(X, k)

    print("Medoids:\n", medoids)

    print("Labels:", labels)

    # 可选:使用matplotlib进行可视化

    import matplotlib.pyplot as plt

    plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', marker='o', edgecolor='k')

    plt.scatter(medoids[:, 0], medoids[:, 1], s=200, c='red', marker='X')

    plt.title('K-Medoids Clustering')

    plt.xlabel('Feature 1')

    plt.ylabel('Feature 2')

    plt.colorbar(label='Cluster')

plt.show()

在这个实现中,find_closest函数用于在给定簇内找到离当前medoid最近的点。k_medoids函数执行K-medoids算法的主要步骤,包括初始化medoids、分配簇、更新medoids以及迭代直到收敛或达到最大迭代次数。最后,我们使用matplotlib(如果已安装)来可视化聚类结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2076723.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在算家云搭建模型Stable-Fast-3D(3D模型生成)

一、模型介绍 Stable-Fast-3D 具有 UV 展开和照明解缠的稳定快速 3D 网格重建,它是一种从单个图像进行快速前馈 3D 网格重建的最先进的开源模型。 二、模型搭建流程 基础环境最低要求说明: 环境名称版本信息1Ubuntu22.04.4 LTSCudaV12.1.105Python3.…

【项目日记】高并发内存池 ---项目介绍及组件定长池的实现

余生还长,你别慌,也别回头,别念旧. --- 余华 --- 1 高并发内存池简介 高并发内存池项目是实现一个高并发的内存池,他的原型是google的一个开源项目tcmalloc,tcmalloc全称Thread-Caching Malloc,即线程缓存…

快速排序与其例题

一、快速排序 1、简单介绍:快速排序(Quick Sort)是一种高效的排序算法,由计算机科学家Tony Hoare在1960年提出。它是基于分治法的排序算法,其基本思想和步骤如下: 基本概念 快速排序的核心思想是将待排序…

一种商业模式既解决引流又解决复购 你想了解一下嘛?

欢迎各位,我是你们的电商策略顾问,吴军。今天,我将向大家介绍一种新颖的商业模式——循环购物模式。这种模式有何独特之处?商家真的在进行慷慨的赠金活动吗?消费者在购物的同时还能获得额外收益?甚至可以将…

Python控制流:条件语句(if, elif, else)①

文章目录 前言1. 基本条件语句1.1 if 语句1.2 else 语句1.3 elif 语句1.4 嵌套条件语句 2. 条件表达式3. 多条件判断4. 比较运算符和逻辑运算符5. 常见错误和最佳实践5.1 常见错误5.2 最佳实践 6. 综合详细的例子:学生成绩管理系统6.1 类和方法Student 类 6.2 主函数…

LD/T698.45 协议解析(新)

通信架构 客户机和服务器在开始通信前,通信信道必须先完成预连接。预连接建立后,默认具有一个最低权限的应用连接,客户机和服务器之间可直接进行数据交换。当客户机需要得到更高权限的服务器服务时,客户机必须发起建立更高权限的…

浦发银行不良堆积,新任领导的无奈

撰稿|芋圆 浦发银行在2023年进行了一波董监高人员大变动,董事长和行长两位掌舵人双双离职,在其任内,浦发银行自2020年起的营收、利润状况和资产质量就一直难有起色。 目前,距新任领导班子上任已差不多过去一年之久。在这一年里&a…

Redis(面试题【速记】)

Redis简介 Redis 是一个开源(BSD 许可)内存数据结构存储用作数据库、缓存、消息代理和流引擎。Redis 提供数据结构,例如 字符串、散列、列表、集合、带范围查询的排序集合、位图、超日志、地理空间索引和流。Redis 内置了复制、Lua 脚本、LRU 驱逐、事务和不同级别的…

【Linux —— 线程同步 - 条件变量】

Linux —— 线程同步 - 条件变量 条件变量的概念互斥量与条件变量的关系条件变量的操作代码示例 条件变量的概念 条件变量是一种用于线程间同步的机制,主要用于协调线程之间的执行顺序,允许线程在某个条件不满足时进入等待状态,直到其他线程通…

【Linux I/O】万字长文带思维导图,一文彻底掌握Linux I/O:深入解析操作系统数据交互的艺术

Linux I/O Linux I/O(输入/输出)是操作系统与外部设备进行数据交互的过程。在Linux系统中,I/O操作的管理和优化对于系统性能有着至关重要的影响。本文将详细介绍Linux中的各种I/O模型,包括它们的工作原理、优缺点以及适用场景&am…

ImportError: DLL load failed while importing _ssl: 找不到指定的模块。

windonw cmd下的输出: (python3.9) PS D:\git\ImageAnalysisService\core\medical_bills> python Python 3.9.19 (main, May 6 2024, 20:12:36) [MSC v.1916 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or …

计算机基础知识总结(八股文--计算机网络、操作系统、数据库、c++、数据结构与算法)

一、操作系统 0.内存管理 01.什么是虚拟内存?为什么需要虚拟内存? 虚拟内存为程序提供比实际物理内存更大的内存空间,同时提高内存管理的灵活性和系统的多任务处理能力。虚拟地址空间就是进程所能看到的内存空间,这段空间是连续…

苍穹外卖项目DAY11

苍穹外卖项目DAY11 1、Apache ECharts 1.1、介绍 Apache ECharts是一款基于JavaScript的数据可视化图标库&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性化定制的数据可视化图标 官网&#xff1a;Apache ECharts 1.3、入门案例 <!DOCTYPE…

LlamaIndex 实现 RAG(四)- RAG 跟踪监控

RAG 整个流程不复杂&#xff0c;集成三大部分包括文档解析并生成向量、根据查询问题查找语意相似的数据文档块、把查询问题和召回文档作为上下文的数据传给模型进行解答。大语言模型的应用开发和传统的开发方式区别很大&#xff0c;以前开发完成&#xff0c;只要逻辑正确&#…

解决IDEA 控制台中文乱码及无法输入中文

一、IDEA 控制台中文乱码&#xff1a; 问题描述&#xff1a; IntelliJ IDEA 如果不进行相关设置&#xff0c;可能会导致控制台中文乱码、配置文件中文乱码等问题。 解决方案&#xff1a; ①&#xff1a;设置字体为支持中文的字体&#xff1a; 点击菜单 File - > settings …

二分查找【算法 09】

二分查找算法详解 二分查找&#xff08;Binary Search&#xff09;是一种高效的查找算法&#xff0c;前提是数据必须是有序的。相比于线性查找&#xff0c;二分查找的时间复杂度从 O(n) 降低到了 O(log n)&#xff0c;适合处理大规模的数据查找问题。本文将详细介绍二分查找的原…

Catf1ag CTF Crypto(六)

前言 Catf1agCTF 是一个面向所有CTF&#xff08;Capture The Flag&#xff09;爱好者的综合训练平台&#xff0c;尤其适合新手学习和提升技能 。该平台由catf1ag团队打造&#xff0c;拥有超过200个原创题目&#xff0c;题目设计注重知识点的掌握&#xff0c;旨在帮助新手掌握C…

集团数字化转型方案(十六)

为了全面推进集团的数字化转型&#xff0c;我们将实施一系列战略举措&#xff0c;包括整合最新的人工智能、大数据分析和云计算技术&#xff0c;升级企业资源规划&#xff08;ERP&#xff09;系统&#xff0c;实现业务流程的自动化与优化&#xff1b;同时&#xff0c;建立全方位…

计算机是如何工作的(2)

文章目录 一. 寄存器和存储器二. 操作系统二. 进程PCB1. pid2. 内存指针3. 文件描述符表4. 属性1) 状态2) 优先级3) 上下文4) 记账信息 一. 寄存器和存储器 存储器是内存和硬盘的通称 内存, 存储空间比硬盘小, 速度比硬盘快, 价格比硬盘高, 掉电后数据流失寄存器是CPU上的一个…

ORACLE EBS R12系统的安装及维护案例

引言&#xff1a; Oracle E-Business Suite (EBS) R12 是企业中广泛应用的一体化管理解决方案&#xff0c;涵盖了财务、人力资源、供应链等多个业务领域。以下将详细介绍如何在 Windows 系统上安装 Oracle EBS R12&#xff0c;并分享一些日常维护的技巧和最佳实践。 点击下载…