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、连接数据库(数据库默认连接密…

计算机基础知识总结(八股文--计算机网络、操作系统、数据库、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、对上传…

出口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配置进行压缩;兼容的浏览器在向服务器发送请求时,在请求头中会…

删除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 单体架构和…

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 二、问题描述&#…

使用CORS解决跨域问题

CORS(Cross-Origin Resource Sharing)跨域资源共享 因为浏览器的同源策略才出现了跨域问题。 CORS是一套机制,用于浏览器校验跨域请求。 它的基本理念是: 只要服务器明确表示允许,则校验通过服务器明确拒绝或没有表…

NAT网关产品手册

产品用途 SG-NAT-410 网关支持 IP 地址跨网段和通讯端口的转换,为不方便修改参数的以太网通讯设备的信息化联网提供便捷的解决方案。网关有 1 个两口以太网交换机接口(LAN 口 ) 和 1 个单口以太网通讯接口 (WAN 口 ) 。不对原系统做任何硬件和软件修改&…

秃姐学AI系列之:批量归一化 + 代码实现

目录 批量归一化 核心想法 批归一化在做什么 总结 代码实现 从零实现 创建一个正确的BatchNorm层 应用BatchNorm于LeNet模型 简单实现 QA 批量归一化 训练深层神经网络是十分困难的,特别是在较短的时间内使他们收敛更加棘手。 因为数据在网络最开始&…

OpenHarmony中的fastjson gson应该这样用

【问题背景】 随着越来越多的开发者开始投入北向应用的开发,无数的人开始问我:鸿蒙三方库是否有fastjson,是否有gson,当前json和对象的转换要怎么搞。 作为程序员,我的每个项目都逃不掉fastjson/gson等三方库&#x…

六西格玛培训真相曝光:识别并避免这些常见陷阱!

在当今企业管理领域,六西格玛作为提升质量与效率的强大工具,其影响力日益增强,但伴随其普及的浪潮,一系列培训陷阱也悄然浮现,成为求学者路上的隐形障碍。作为深耕企业咨询领域的专家,张驰咨询特此为您揭秘…