k-medoids聚类算法

2023-10-26

引言

上一篇博客介绍了k-means聚类算法,该算法虽然高效快速,但却受异常点的影响严重,如果样本中存在异常点,则聚类结果会产生极大的偏差。针对异常点对聚类结果的影响,本文介绍k-medoids聚类算法,k-medoids算法能有效削弱异常点的影响。

k-medoids算法

k-mediods每次选取的中心点,必须是样本点,而 k-means每次选取的中心点可以是样本点之外的点,就好比中位数和平均值的区别;

k-medoids算法步骤:
1.任意选取k个初始中心点medoids;
2.按照与medoids最近的原则,将剩余点分配到当前最佳的medoids代表的类中;
3.在每一类中,计算每个样本点与其他点的距离之和,选取距离之和最小的点作为新的medoids;
4.重复2-3的过程,直到所有的medoids点不再发生变化,或已达到设定的最大迭代次数;
k-medoids算法选取簇中心点的准则函数是:当前簇中所有其他点到该中心点的距离之和最小,所以需要遍历簇中所有点;

算法总结
1)基于“代表对象”的聚类方法;
2)数据变量为数值型的聚类算法;
3)异常点不会严重影响聚类结果;
4)时间复杂度高于k-means算法。

python实现

#加载所需模块
import numpy as np
from numpy import *
import sys
from sklearn import metrics
from sklearn.preprocessing import StandardScaler
import pandas as pd
import matplotlib.pyplot as plt
# 定义欧式距离的计算
def func_of_dis(x, y):
	return np.sqrt(sum(np.square(x - y)))
#k-medoids算法实现
def KMedoids(df, k_num_center):
    """
    选定好距离公式开始进行训练
    :param df:样本数据,pd.DataFrame类型
    :param k_num_center:类别数
    """
    print('初始化',k_num_center, '个中心点')
    data = df.values
    #data = StandardScaler().fit_transform(df) #数据标准化
    indexs = list(range(len(data)))
    random.shuffle(indexs)  # 随机选择质心
    init_centroids_index = indexs[:k_num_center]
    centroids = data[init_centroids_index, :]   # 初始中心点
    # 确定类别编号
    levels = list(range(k_num_center))
    print('开始迭代')
    #sample_target = [] #样本类别结果
    if_stop = False
    while(not if_stop):
        if_stop = True
        classify_points = [[centroid] for centroid in centroids] #初始中心点转换为列表
        sample_target = [] #样本类别结果
        
        # 遍历数据
        for sample in data:
            # 计算距离,由距离该数据最近的核心,确定该点所属类别
            distances = [func_of_dis(sample, centroid) for centroid in centroids] #计算所有样本到初始中心点的距离
            cur_level = np.argmin(distances) #每个样本到中心点的距离最小所对应的中心点的位置
            sample_target.append(cur_level)
            # 统计,方便迭代完成后重新计算中间点
            classify_points[cur_level].append(sample) #将样本和最近的中心点归为一类
        
        # 重新划分质心
        distances_res = [] #每个簇内各点到中心点的距离值之和列表,k个类别对应k个值
        for i in range(k_num_center):  # 几类中分别寻找一个最优点
            distances = [func_of_dis(point_1, centroids[i]) for point_1 in classify_points[i]] #计算之前被归为一类的样本中每个点和中心点的距离
            now_distances = sum(distances)   # 首先计算出现在中心点和其他所有点的距离总和
            for point in classify_points[i]:
                distances = [func_of_dis(point_1, point) for point_1 in classify_points[i]] #计算簇中每个点和其他点的距离
                new_distance = sum(distances)
                # 计算出该聚簇中各个点与其他所有点的总和,若是有小于当前中心点的距离总和的,中心点去掉
                if new_distance < now_distances:
                    now_distances = new_distance
                    centroids[i] = point    # 换成该点
                    if_stop = False
                    distances_res.append(now_distances)
    return(sample_target,distances_res)
#确定k值
def k_value_sse(k_value_list):
	#利用SSE选择k
	SSE = []  # 存放每次结果的误差平方和
	sse_df = pd.DataFrame()
	for i in k_value_list:
		estimator = KMedoids(df,i)  # 构造聚类器
		distances_res = estimator[1]
		dist_sum = sum(distances_res)
		SSE.append(dist_sum)

	return(k_value_list,SSE)

不同的k值与SSE值得对应关系,最终画出一条曲线,这条曲线相当于人的手肘,而肘部对应的点就是最佳的k取值点,即曲线的拐点。

#确定最佳的k值后
best_model = KMedoids(data,k)

#模型评价,计算轮廓系数
labels = KMedoids(data,k)[0]
score = silhouette_score(data,labels,metric='euclidean')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

k-medoids聚类算法 的相关文章

  • 统计分析:聚类分析(详细讲解)

    聚类分析是研究 物以类聚 的一种方法 人类认识世界往往首先将被认识的对象进行分类 早起人们主要靠经验和专业知识实现分类 但随着生产技术和社会科学的发展 对分类学的要求越来越高 靠经验和专业知识来分类越来越难 于是数学这一有力工具被引入分类学
  • 【数学建模笔记 29】数学建模的多元分析

    29 多元分析 定义 多元分析是多变量的统计分析方法 是数理统计中应用广泛的一个重要分支 判别分析 判别分析是一种分类方法 假定有 r r r 类判别对象 A 1
  • 常见聚类算法及使用--均衡的迭代并减少聚类中心的层次聚类(BIRCH)

    前言 前面文章给大家介绍了 关于层次聚类算法的实现 那么本文给大家继续介绍层次聚类的优化算法 BIRCH 大家都知道像 K means 这样的聚类算法比较有局限性 而且在大数据场景下很难处理 特别是在有限的内存和较慢的CPU硬件条件下 我相
  • 实现KNN算法&搭建人工神经网络ANN——第三次数据挖掘实验

    实验结果直接戳这里免费下载实验报告 决策树算法的实验还没做 做了之后再上传吧 最近有点忙555 文章目录 1 KNN算法 1 1 KNN算法原理 1 2 KNN算法的优点 1 3 KNN算法的缺点 1 4 KNN的做法 目的 1 5 编程实
  • R语言第八次课堂小测 rattle的应用(包括rattle的安装)

    题目 安装rattle 并使用rattle 用三种聚类方法对鸢尾花数据集进行聚类 步骤一 修改镜像源 首先 在Rstudio上打开如下界面 进入后 找到packages 再点击change 下图是已经更换了的截图 选择中国的任意一个镜像 最
  • 第二个作业:贝叶斯估计

    第二个作业 贝叶斯估计实战 第一小题 试使用西瓜数据集3 0作为训练集 通过AIC准则构建一个贝叶斯网 我先看看scikit learn官网上关于贝叶斯估计 特别是贝叶斯网的构建方面的包和函数 然后再看看这个AIC准则具体是怎么样的 如何构
  • 机器学习--聚类(12)

    一 基本概念 聚类的概念 一种无监督的学习 事先不知道类别 自动将相似的对象归到同一个簇中 应用场景 文档分类器 客户分类 保险欺诈检测 乘车数据分析 二 距离计算 对于有序距离 其中P 1为曼哈顿距离 P 2为欧氏距离 对于无序距离 使用
  • 科研笔记(九)重构智能手机CSI指纹用于室内定位(上)

    重构智能手机CSI指纹用于室内定位 题目 CRISLoc Reconstructable CSI Fingerprinting for Indoor Smartphone Localization 论文作者 Zhihui Gao Yunfa
  • 无监督分类的4种方法

    1 等宽法 类似于制作频数分布图 将属性分布值分为几个等分的分布区间 2 等频法 将相同数量的记录放入每个区间 3 基于聚类的分析方法 将属性按照K means算法进行聚类 然后根据聚类的分类 将同一聚类的记录合并到同一组内 4 模拟退火法
  • 智能优化算法改进-K-means聚类种群初始化附Matlab代码

    目录 0引言 一 K means聚类原理 二 K Means聚类算法步骤 三 K Means聚类原理图 编辑 四 K means聚类改进智能优化算法种群初始化效果图 4 1 初始种群数据图 4 2 K means聚类结果图 4 2 1 根据
  • kmeans算法和kmeans++

    kmeans算法及其优化改进 kmeans聚类算法 算法原理 kmeans的算法原理其实很简单 我用一个最简单的二维散点图来做解释 如上图 我们直观的看到该图可聚成两个分类 我们分别用红点和蓝点表示 下面我们模拟一下Kmeans是怎么对原始
  • 【毕设教程】FCM模糊聚类算法

    文章目录 0 前言 1 如何理解模糊聚类 2 模糊C means聚类算法 3 FCM算法原理 4 Python FCM支持 4 1 安装相关库 4 2 skfuzzy cmeans函数说明 4 3 代码实现 4 4 运行结果 5 FCM算法
  • 《机器学习》理论——速读学习2 常用方法(3)

    机器学习 理论 速读学习2 常用方法 3 该系列文章系个人读书笔记及总结性内容 任何组织和个人不得转载进行商业活动 time 2021 12 24 学习目标 我需要了解神经网络除了工程化部分之外的更多内容 以便于在实际有效数据中可以获得抽象
  • 数据技术之数据挖掘

    第7章 数据挖掘 1 什么是数据挖掘 数据挖掘 Data Mining 就是从大量的数据中 提取隐藏在其中的 事先不知道的 但潜在有用的信息的过程 数据挖掘的目标是建立一个决策模型 根据过去的行动数据来预测未来的行为 2 阿里数据挖掘平台
  • stata学习笔记

    离散被解释变量 二值选择型 二值选择模型 多值选择型 多项选择模型 条件选择 混合 排序数据 排序模型 非负整数计数型 泊松 负二项 二值选择型 采用logit和probit模型 probit即把logit换一下就好 logit y x1
  • 机器学习(三)K-means聚类(手肘法、轮廓系数、可视化代码)

    K means聚类 聚类是无监督学习当中非常重要的一部分 能够在没有标签的情况下将数据分类 说到聚类 最常用也是最重要的一个算法就是K means算法 算法介绍 K means是一种非常简单快速高效的算法 只需要迭代几次即可 其原理用一句话
  • 单细胞测序数据的降维方法和细胞亚型鉴定聚类方法

    单细胞测序数据的降维方法和细胞亚型鉴定聚类方法是单细胞转录组分析中常用的技术 下面是对这些方法的总结 1 降维方法 主成分分析 PCA PCA是一种常用的降维方法 通过线性变换将高维数据转化为低维表示 保留最大的方差 t SNE t SNE
  • 层次聚类在MATLAB中实现

    层次聚类在MATLAB中实现 By Yang Liu 1 第一种方法 1 输入要聚类的数据 2 计算各个样本之间的欧氏距离 3 把距离化成矩阵 矩阵中的元素 X i j X ij Xij 表示第i个样本和第j个样
  • Query 聚类

    为了提高阅读体验 请移步到 Query 聚类 背景 搜索系统优化长尾 query 想了解一下长尾 query 长什么样 大体上都有几类 最好能归类 一类一类处理 Query 数据源 包含 什么 怎么 如何 关键词的 Query K mean
  • 一网打尽目前常用的聚类方法,详细介绍了每一种聚类方法的基本概念、优点、缺点!!

    目前常用的聚类方法 1 K 均值聚类 K Means Clustering 2 层次聚类 Hierarchical Clustering 3 DBSCAN聚类 DBSCAN Clustering 4 谱聚类 Spectral Cluster

随机推荐

  • 程序员如何做好职业规划?

    1 了解自己的职业目标 首先 要明确自己的职业目标 包括想成为什么样的程序员 是否想做管理工作等 2 了解市场需求 了解市场对技能的需求 通过对人才市场的认识 了解市场对不同类型程序员的需求和薪资水平 3 学习技能 根据自己的职业目标和市场
  • 软件使用:如何彻底把VMware卸载干净

    1 禁用VM虚拟机服务 首先 需要停止虚拟机VMware相关服务 按下快捷键WIN R 打开windows运行对话框 输入services msc 点击确定 在服务管理中 找到VM开头的所有服务类别 将所有VM开头的服务禁用掉 右击选择属性
  • 直接插入排序(深入讲解哨兵的作用)---------通俗易懂,直击重点!!!

    直接插入排序详细讲解 直接插入排序 Straight Insertion Sort 哨兵 代码区实例 你好 欢迎来和我一起学习 直接插入排序算法内容 如果大佬们发现问题希望指出 我会尽全力来更改 希望我们共同进步 直接插入排序 Straig
  • Python:PyCharm 永久破解方法,真的超超超超超超超超超级简单!!!

    准备工作 1 破解包 gt gt gt 下载链接 gt gt gt 提取码 jjbf 2 注册码 gt gt gt 获取地址 gt gt gt 第一步 进入PyCharm 的安装目录的bin文件夹下 把破解包放到该目录 第二步 把bin 目
  • 正确理解stem教育

    成人对STEM教育的理解和态度将深刻地影响孩子们对STEM学习的信念和他们的能力发展 无论孩子天赋如何 STEM对所有的孩子非常有利 也对所有学科领域都很重要 格物斯坦小坦克告诉大家如何正确理解stem教育 当我们学习新技能时 大脑将整合之
  • Tensorflow中tf.nn.bias_add()以及tf.add()和tf.add_n的实现

    tf nn bias add 通俗解释 一个叫bias的向量加到一个叫value的矩阵上 是向量与矩阵的每一行进行相加 得到的结果和value矩阵大小相同 import tensorflow as tf a tf constant 1 1
  • Qt 内存回收机制

    关于 Qt 内存回收机制的 刚接触 Qt 不久 第一次看到这方面的问题 这篇文章需要在对Qt有很多了解后才会理解的更透彻 在你不断补充知识时 温故而知新 看到更全面和更官方的内容时随时更新 C GUI Programming with Qt
  • 多线程+隧道代理:提升爬虫速度

    在进行大规模数据爬取时 爬虫速度往往是一个关键问题 本文将介绍一个提升爬虫速度的秘密武器 多线程 隧道代理 通过合理地利用多线程技术和使用隧道代理 我们可以显著提高爬虫的效率和稳定性 本文将为你提供详细的解决方案和实际操作价值 同时附上Py
  • H5页面实现跳转微信公众号主页面

    由于考虑到微信商城内用户分享给未关注用户 所以进行openid判断 并且进行 跳转 谨此记录一下 1 登录公众号管理后台 2 F12 进入element 模块 3 ctrl f 搜索uin base64字段 4 在下面代码中填入uin ba
  • 戴尔计算机网卡驱动程序,dell戴尔网卡驱动如何安装

    网卡是电脑连接外部网络的重要设备 可以实现局域网传输介质之间的物理连接和电信号匹配 不过想要正常使用网卡设备还需要安装网卡驱动 下面 我就以Dell网卡为例 教大家安装驱动的方法 Dell 戴尔 以设计 生产 销售类型电脑而闻名 戴尔电脑质
  • vue-element-admin项目关闭eslint校验

    事情是这样的 今天在启动项目的时候报错了 报错差不多是这样的 我们都知道 ESLint 是一个代码规范和错误检查工具 对于代码的语法格式的规范相当的严格 我忘记自己在哪里的代码写的出现问题了 但现在直接启动不了就很麻烦了 只有先关闭一下es
  • CentOS7.6服务器搭建SFTP服务及JAVA工具类

    一 SFTP的简介 sftp Secure File Transfer Protocol 是一种安全的文件传送协议 是ssh内含协议 也就是说只要sshd服务器启动了 sftp就可使用 不需要额外安装 它的默认端口和SSH一样为22 1 s
  • thinkphp6 入门(4)--数据库操作 增删改查

    一 设计数据库表 比如我新建了一个数据库表 名为test 二 配置数据库连接信息 本地测试 直接在 env中修改 不用去config database php中修改 正式环境 三 增删改查 引入Db库 use think facade Db
  • 分析 Spring 的依赖注入模式

    一 依赖注入 二 Field Injection 优点 缺点 三 Constructor Injection 优点1 容易发现 code smell 优点2 容易厘清依赖关系 优点3 容易写单元测试 优点4 Immutable Object
  • 微信小程序 用户协议和隐私协议

  • 金山桌面软件测试实习生笔试面试

    2014年5月 实习生 笔试 3道数列推导题 1道推理题 2道编程题 2道设计测试用例题 推理题 A B C D E五个人将来的职业分别是预言师 侍女 舞蹈师 魔术师 侍应生 这5个人现在说的话 只有将来是预言师的那个人说的才是正确的 A
  • 经常使用runOnUiThread(),你真的理解它吗

    在Android开发的过程中 主线程主要来完成UI绘制和响应用户的操作 默认情况下 我们大部分的代码都是在主线程 中执行的 因此我们时刻要考虑主线程的情况 我们都知道要开启一个子线程来完成一个耗时操作 以避免阻塞主线程影响 用户体验 甚至A
  • FCM——(Fuzzy C-means)模糊C均值算法

    FCM算法是一种基于划分的聚类算法 它的思想就是使得被划分到同一簇的对象之间相似度最大 而不同簇之间的相似度最小 模糊C均值算法是普通C均值算法的改进 普通C均值算法对于数据的划分是硬性的 而FCM则是一种柔性的模糊划分 模糊聚类的目标函数
  • 【目标跟踪】1、基础知识

    文章目录 一 卡尔曼滤波 二 匈牙利匹配 一 卡尔曼滤波 什么是卡尔曼滤波 状态估计器 卡尔曼滤波用于在包含不确定信息的系统中做出预测 对系统下一步要做什么进行推测 且会结合推测值和观测值来得到修正后的最优值 卡尔曼滤波就是利用 t 1 状
  • k-medoids聚类算法

    引言 上一篇博客介绍了k means聚类算法 该算法虽然高效快速 但却受异常点的影响严重 如果样本中存在异常点 则聚类结果会产生极大的偏差 针对异常点对聚类结果的影响 本文介绍k medoids聚类算法 k medoids算法能有效削弱异常