文章目录

  • 一: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_numdistance=(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 * 50for j=1:cluster_numcluster_new(j,:)=mean(data(find(index_cluster==j),:));% 4 * 2  找到距离对应中心最近的点 横纵坐标各取平均值endif (sqrt(sum((cluster_new-cluster).^2))>therad_lim)cluster=cluster_new;elsebreak;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_numdata_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)

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

  1. proe常用c语言语句,带你轻松搞懂Proe条件语句

    原标题:带你轻松搞懂Proe条件语句 本文通过几个简单的例子介绍Proe中的条件语句,希望对你能有所帮助.Proe中使用的IF条件语句和C语言中的IF语句原理是一样的,其结构稍有差别.首先我们了解一下 ...

  2. 一文带你轻松搞懂事务隔离级别(图文详解)

    本文由 SnailClimb 和读者 BugSpeak 共同完成. 事务隔离级别(图文详解) 什么是事务? 事务是逻辑上的一组操作,要么都执行,要么都不执行. 事务最经典也经常被拿出来说例子就是转账了 ...

  3. java 一个大事务下的新增、修改、查询_一文带你轻松搞懂事务隔离级别(图文详解)...

    点击上方"linkoffer", 选择关注公众号高薪职位第一时间送达 本文由 SnailClimb 和读者 BugSpeak 共同完成. 事务隔离级别(图文详解) 什么是事务? 事 ...

  4. 带你轻松搞懂JDK动态代理机制(ssm框架先行必备)

    学习动态代理之前需要先搞清楚静态代理,可以回看我之前在Mybatis里写的代理那一篇文章 MyBatis入门基础3 ---代理 动态代理 使用反射机制,在程序执行过程中,创建代理类对象,无需创建类文件 ...

  5. 一文搞懂k近邻(k-NN)算法(一)

    原文链接 一文搞懂k近邻(k-NN)算法(一) 前几天和德川一起在学习会上讲解了k-NN算法,这里进行总结一下,力争用最 通俗的语言讲解以便更多同学的理解. 本文目录如下: 1.k近邻算法的基本概念, ...

  6. php service原理,轻松搞懂WebService工作原理

    用更简单的方式给大家谈谈WebService,让你更快更容易理解,希望对初学者有所帮助. WebService是基于网络的.分布式的模块化组件. 我们直接来看WebService的一个简易工作流程: ...

  7. 10分钟带你彻底搞懂服务限流和服务降级

    文章目录 十分钟搞懂系列 服务限流 计数器法 滑动窗口法 漏桶算法 令牌桶算法 服务降级 十分钟搞懂系列 序号 标题 链接 1 10分钟带你彻底搞懂企业服务总线 https://blog.csdn.n ...

  8. 10分钟带你彻底搞懂负载均衡

    文章目录 十分钟搞懂系列 负载均衡是如何保证软件系统的生产部署的? 负载均衡分发策略 请求由谁来分发? 服务器端负载均衡器 客户端负载均衡 请求分发到哪去? 静态负载均衡算法 动态负载均衡算法 十分钟 ...

  9. 8分钟带你深入浅出搞懂Nginx

    8分钟带你深入浅出搞懂Nginx Nginx是一款轻量级的Web服务器.反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用. 架构图 上图基本上说明了当下流行的技术架构 ...

  10. 【机器学习sklearn】两个例子轻松搞懂核密度估计KernelDensity

    前言 作业中遇到了需要使用KernelDensity的情况,但是网上的资料参差不齐,找了不短的时间却失望而归,最后还是靠着自己的理解才弄懂sklearn这个函数的使用,特此纪念. [机器学习sklea ...

最新文章

  1. vim的基本快捷操作(二)——可视模式
  2. ffmpeg+nginx+video实现rtsp流转hls流,通过H5查看监控视频
  3. 线性表算法题库_数据结构与算法(线性表)练习题
  4. 《操作系统》OS学习(四):计算机体系结构、内存层次和地址生成
  5. 计算机系统操作在线作业,电子科大《计算机操作系统》在线作业3
  6. 高精地图中地面标识识别技术历程与实践
  7. linux概述、基本命令
  8. 存储过程没有执行完后没有释放锁_【大厂面试07期】说一说你对synchronized锁的理解?...
  9. 多个vue项目合并成一个_再见Vlookup,合并多个表格发现一个最简单方法
  10. 怎么实现角色权限的分配_在 Go 语言中使用 casbin 实现基于角色的 HTTP 权限控制...
  11. 【matlab2014B安装教程及下载】
  12. matlab建模与仿真应用pdf,MATLAB建模与仿真应用教程 第2版
  13. 微带滤波器摘要_微带低通滤波器的设计
  14. 电商系统如何搭建会员体系/会员制玩法?
  15. Android 84、gc、高德、百度、墨卡托地理坐标转换
  16. 综合布线(楼栋)设计报告
  17. VUE:element ui组件应用之个人中心页面
  18. word打开提示无法加载此程序mathpage.wll
  19. 苹果设备上的无损音乐alac
  20. 在线考试系统的倒计时

热门文章

  1. 小葫芦弹幕助手连接服务器失败,为什么自动弹幕发送老是失败?如何解决?
  2. OligoGreen染料|花菁类(Cyanine系列)-引物、Oligo核酸、多肽标记染料
  3. oracle价格的数据类型,oracle数据库中的number类型
  4. detours介绍与使用
  5. 前端工具使用记录(css/js/htm)
  6. 最好的jQuery文件上传插件
  7. 计算机应用技术ps考证,2017计算机等级考试一级Photoshop应用试题及答案
  8. 高淇java_关于高淇JAVA中SORM总结学习笔记详细个人解释
  9. poi excel 添加水印
  10. numpy-poly1d、polyfit、polyval多项式使用