K-medoids算法原理及Python实践

一、原理

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.mzph.cn/diannao/52578.shtml

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

相关文章

Excel 保持原序时计算组内排名

Excel某表格第1列是分组,第2列是日期,未排序。 AB1Agent IDDate of Sale2Agent107-12-20233Agent105-12-20234Agent209-12-20235Agent313-12-20236Agent214-12-20237Agent222-12-20238Agent115-12-20239Agent117-12-202310Agent213-12-202311Agent120-1…

wooyu漏洞库YYDS!!!入门之道:重现乌云漏洞库

目录 wooyun乌云漏洞库搭建 1、搭建资料 文件结构分析: ​编辑2、搭建过程 2.1、搭建wooyun网站 2.2、配置数据库 2.2.1、修改数据库配置文件conn.php 2.2.2、创建wooyun数据库,并解压数据库文件 2.2.3、连接数据库(数据库默认连接密…

24.8.26学习心得

验证数据集(Validation Set)和测试数据集(Test Set)在机器学习和深度学习中都是非常重要的概念。它们各自有不同的用途和目的。下面详细解释两者之间的区别: 1. 验证数据集(Validation Set) 目…

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

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

【案例61】update driver error

问题现象 顾问在保存数据源时报“update driver error”错误,重启服务器,重启sysConfig.bat后问题依旧。 问题分析 之前碰到这类问题发现是权限的问题。所以先去检查了相关文件夹的权限。 查看控制台发现客户用的是非Administrator用户登录&#xff0…

数学建模2024国赛时间及事项安排

2024年的全国大学生数学建模竞赛即将拉开帷幕。考虑到许多同学可能是首次参与此类赛事,尚不清楚如何进行有效的时间安排,博主在此整理了以往参赛的经验和时间管理策略,希望能为大家提供一些有益的参考,更从容地应对国赛。 本届全国…

网络安全 DVWA通关指南 DVWA File Upload(文件上传)

DVWA File Upload(文件上传) 文章目录 DVWA File Upload(文件上传)修复建议 LowMediumHighImpossible 修复建议 1、使用白名单限制可以上传的文件扩展名 2、注意0x00截断攻击(PHP更新到最新版本) 3、对上传…

Ubuntu 20.04 源码编译安装OpenCV 4.5.0

源码安装 OpenCV 4.5 官方文档: OpenCV: Install OpenCV-Python in Ubuntu 1. 安装编译依赖 sudo apt install build-essential cmake git pkg-config libgtk-3-dev \ libavcodec-dev libavformat-dev libswscale-dev libv4l-dev \ libxvidcore-dev libx264-dev …

出口MID电能表到欧洲市场

出口MID电能表到欧洲市场! 浙江永泰隆电子有限公司在研发和将MID能量计出口到欧盟市场方面具有丰富的经验。以下是突显该公司专业性的概述: 公司概况: 浙江永泰隆电子有限公司是一家专注于先进能量测量解决方案的制造商,特别是…

【栈】| 力扣高频题: 有效的括号

🎗️ 主页:小夜时雨 🎗️专栏:算法题 🎗️如何活着,是我找寻的方向 目录 1. 题目解析2. 代码 1. 题目解析 题目链接: 力扣20:https://leetcode.cn/problems/valid-parentheses/description/ 本…

linux系统中USB模块基本原理分析

大家好,今天主要给大家分享一下,USB设备的发展历程。 第一:USB发展变化 随着时代的发展,USB模块也随之不断的升级。 USB1.1:规范了USB低全速传输; USB2.0:规范了USB高速传输,采用NRZI(反向不归零)编码(NRZI采用8bit编码方式),位填充(在数据进行NRZI编码前…

虚幻5|制作玩家血量,体力(还未编辑,只用于引用)

未编写,仅引用 优化后: 把增加生命,减少生命,也可以用在体力里,更改如下 限制浮点,如果血量或体力按10来扣,如果你的血量降低到5,那么就会以5的数值来扣,而不会扣成-5…

es 7.17.23安装ik插件启动失败,access denied,Permission

情况简述 windows平台,下载了7.17.23的es以及7.17.23的ik分词器的zip包之后( 下载地址(官方推荐的):Index of: analysis-ik/stable/ ),解压该ik的包到es的plugins下,目录结构&…

Webpack中的 HTTP 压缩

http压缩介绍 http压缩,是指一种内置在服务器和客户端之间改进传输速度和带宽利用率的方式。 http 压缩的流程: http 数据在服务器发送前,通过 webpack配置进行压缩;兼容的浏览器在向服务器发送请求时,在请求头中会…

ElasticSearch 的单点部署环境搭建

一、摘要 ElasticSearch 是一个开源的 分布式、RESTful 的 搜索和分析引擎 ,可以用来解决使用数据库进行模糊搜索时存在的性能问题,适用于所有类型的数据,包括文本、数字、地理空间、结构化和非结构化数据 ElasticSearch 使用 Java 语言开发&…

删除Vue2残留配置文件解决异常:Cannot find module ‘@vue/babel-plugin-transform-vue-jsx‘

背景 完成Vue2代码升级为Vue3后,将新代码上传至代码库。在修改源代码库代码后,启动项目,提示:Cannot find module ‘vue/babel-plugin-transform-vue-jsx‘,尝试安装该第三方库后仍然无效。 解决方案: 删…

带你快速了解WEB应用服务器TOMCAT

目录 一、WEB技术 1.1 HTTP协议和B/S 结构 1.2 前端三大核心技术 1.2.1 HTML 1.2.2 CSS(Cascading Style Sheets)层叠样式表 1.2.3 JavaScript 二 WEB框架 2.1 web资源和访问 2.2 后台应用架构 2.2.1 单体架构 2.2.2 微服务 2.2.3 单体架构和…

C++调用python文件,python引用的其他依赖库,在c++里如何处理

前面我写过一篇《Visual Studio 2022Python3.11实现C调用python接口》,最近有朋友问C调用python文件,python引用的其他依赖库,需要在c中处理吗? 实践出真知,对于这个问题,我得先验证,然后得出…

QtCreator错误:Qt没有被正确安装,请运行make install(适用Qt4、Qt5、Qt6)

一、问题环境 (1)Windows 10企业版,64位 (2)Visual Studio 2019 (3)Qt5.12.12 x64版本(自己编译) (4)Qt Creator 12.0.1 二、问题描述&#…

leetcode518:零钱兑换II

零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…