当前位置: 首页 > news >正文

【聚类算法】带你轻松搞懂K-means聚类(含代码以及详细解释)

文章目录

  • 一:K-means聚类算法
  • 二:实例分析
  • 三:原理与步骤
  • 四:Matlab代码以及详解

一:K-means聚类算法

聚类是一个将数据集中在某些方面相似的数据成员进行分类组织的过程,聚类就是一种发现这种内在结构的技术,聚类技术经常被称为无监督学习
k均值聚类是最著名的划分聚类算法,由于简洁和效率使得他成为所有聚类算法中最广泛使用的。给定一个数据点集合和需要的聚类数目k,k由用户指定,k均值算法根据某个距离函数反复把数据分入k个聚类中。

二:实例分析

现有50个二维数据点如下图,使用K-Means算法将以下数据实现聚类。
在这里插入图片描述
结果展示:
在这里插入图片描述

三:原理与步骤

K-means算法是典型的基于距离(欧式距离、曼哈顿距离)的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。
K-mean算法步骤如下:

  1. 先定义总共有多少个簇类,随机选取K个样本为簇中⼼。
  2. 分别计算所有样本到随机选取的K个簇中⼼的距离。
  3. 样本离哪个中⼼近就被分到哪个簇中⼼。
  4. 计算各个中⼼样本的均值(最简单的⽅法就是求样本每个点的平均值)作为新的簇心。
  5. 重复2、3、4直到新的中⼼和原来的中⼼基本不变化的时候,算法结束。

算法结束条件:

  1. 当每个簇的质心,不再改变时就可以停止k-menas。
  2. 当循环次数达到事先规定的次数时,停止k-means

原理示意图:
在这里插入图片描述
简单小实例:
有以下6个点,初始随机选取两个点作为两个簇的簇中心(这里假设选取的是A3,A4),求最后的簇所属情况。
在这里插入图片描述
1️⃣:计算每个点到簇心的距离,将距离近的归为一类。
在这里插入图片描述
2️⃣:将红色对应的点和绿色对应的每个点分别求X,Y平均值,最为新的簇心。
在这里插入图片描述
3️⃣:计算每个点到新簇心的距离,继续将对应距离近的点归为一类。
在这里插入图片描述
4️⃣:由于关联点没有发生变化,所以之后的结果不会发生变化。停止计算
5️⃣:得结果红色簇:A1,A3,A5,紫色簇:A2,A4,A6。

四:Matlab代码以及详解

clc;clear;close all;
data(:,1)=[90,35,52,83,64,24,49,92,99,45,19,38,1,71,56,97,63,...
    32,3,34,33,55,75,84,53,15,88,66,41,51,39,78,67,65,25,40,77,...
    13,69,29,14,54,87,47,44,58,8,68,81,31];
data(:,2)=[33,71,62,34,49,48,46,69,56,59,28,14,55,41,39,...
    78,23,99,68,30,87,85,43,88,2,47,50,77,22,76,94,11,80,...
    51,6,7,72,36,90,96,44,61,70,60,75,74,63,40,81,4];
%50 * 1
figure(1)

scatter(data(:,1),data(:,2),'MarkerEdgeColor','r','LineWidth',2)
%% 原理推导K均值
[m,n]=size(data);%m = 50,n = 1;
cluster_num=4;%4个初始中心
cluster=data(randperm(m,cluster_num),:);%randperm(m,cluster_num)在前m中随机选取cluster_num个  %随机选取中心
%data函数  取数据用
epoch_max=1000;%最大次数
therad_lim=0.001;%中心变化阈值
epoch_num=0;
while(epoch_num<epoch_max)
    epoch_num=epoch_num+1;
    for i=1:cluster_num
    distance=(data-repmat(cluster(i,:),m,1)).^2;% 50 * 2  repmat扩展矩阵
    %.^2是矩阵中的每个元素都求平方,^2是求矩阵的平方或两个相同的矩阵相乘,因此要求矩阵为方阵
    distance1(:,i)=sqrt(sum((distance),2));%求行和
    %distance1(:,i)=sqrt(sum(distance'));% 默认求列和  1表示每一列进行求和,2表示每一行进行求和;
    %sqrt(sum(distance')) == 1 * 50
    %distance1 50 * 4 表示每个点距离第i个点的距离
    end
    [~,index_cluster]=min(distance1');%distance1' = 4 * 50,min 求列最值  index_cluster = 最小值所在行号  index_cluster = 1 * 50
    for j=1:cluster_num
    cluster_new(j,:)=mean(data(find(index_cluster==j),:));% 4 * 2  找到距离对应中心最近的点 横纵坐标各取平均值
    end
    if (sqrt(sum((cluster_new-cluster).^2))>therad_lim)
        cluster=cluster_new;
    else
        break;
    end
end
%% 画出聚类效果
figure(2)
%subplot(2,1,1)
a=unique(index_cluster); %找出分类出的个数
C=cell(1,length(a));%1 * 4的元胞
for i=1:length(a)
   C(1,i)={find(index_cluster==a(i))};
end
for j=1:cluster_num
    data_get=data(C{1,j},:);%从data中取每个类的点
    scatter(data_get(:,1),data_get(:,2),80,'filled','MarkerFaceAlpha',.6,'MarkerEdgeAlpha',.9);
    hold on
end
plot(cluster(:,1),cluster(:,2),'kp','LineWidth',2);%画出4个聚类中心
hold on
sc_t=mean(silhouette(data,index_cluster'));
title_str=['原理推导K均值聚类','  聚类数为:',num2str(cluster_num),'  SC轮廓系数:',num2str(sc_t)];
title(title_str)

相关文章:

  • 【电源专题】案例:为什么芯片支持0.8V的工作电压,但EN却又要高达1.25V?
  • 湖仓一体电商项目(十四):实时任务执行流程
  • 猿创征文|Java中的IO流大家族 (两万字详解)
  • SQL Server 2014安装教程(保姆级图解教程)
  • 大白话理解-微信小程序获取授权
  • Spring常用注解。
  • Spring之拦截器
  • 【知识图谱】Louvain、LPA等5类经典社区发现算法 Python 实战
  • SQL server 2008 r2 安装教程
  • python wechat --- 企业微信机器人API
  • 阿里云ossutil使用
  • Spring——事务注解@Transactional【建议收藏】
  • scanf、printf使用详解
  • 基于文化算法优化的神经网络预测研究(Matlab代码实现)
  • ubuntu安装mysql详细过程
  • Git的一些常用操作
  • Laravel Telescope:优雅的应用调试工具
  • springboot_database项目介绍
  • ucore操作系统实验笔记 - 重新理解中断
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 浮动相关
  • 诡异!React stopPropagation失灵
  • 猴子数据域名防封接口降低小说被封的风险
  • 回顾2016
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​一些不规范的GTID使用场景
  • # 飞书APP集成平台-数字化落地
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • $.ajax,axios,fetch三种ajax请求的区别
  • (06)金属布线——为半导体注入生命的连接
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (二)WCF的Binding模型
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (三)Honghu Cloud云架构一定时调度平台
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • .NET CF命令行调试器MDbg入门(一)
  • .Net Web窗口页属性
  • .Net 代码性能 - (1)
  • .NET分布式缓存Memcached从入门到实战
  • .NET运行机制
  • .Net转前端开发-启航篇,如何定制博客园主题
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • @requestBody写与不写的情况
  • @RestControllerAdvice异常统一处理类失效原因
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • [2021 蓝帽杯] One Pointer PHP
  • [CCIE历程]CCIE # 20604
  • [cocos creator]EditBox,editing-return事件,清空输入框
  • [EFI]Acer Aspire A515-54g电脑 Hackintosh 黑苹果efi引导文件
  • [HOW TO]如何在iPhone应用程序中发送邮件
  • [linux]linux命令学习-netstat
  • [MySQL光速入门]003 留点作业...
  • [OpenWrt]RAX3000一根线实现上网和看IPTV