KMeans和KMedoid算法是聚类算法中比较普遍的方法,本文讲了其原理和matlab中实现的代码。

1.目标:

找出一个分割,使得距离平方和最小

2.K-Means算法:

1. 将数据分为k个非空子集

2. 计算每个类中心点(k-means中用所有点的平均值,K-medoid用离该平均值最近的一个点)center

3. 将每个object聚类到最近的center

4. 返回2,当聚类结果不再变化的时候stop

复杂度:

O(kndt)

-计算两点间距离:d

-指定类:O(kn)   ,k是类数

-迭代次数上限:t

3.K-Medoids算法:

1. 随机选择k个点作为初始medoid

2.将每个object聚类到最近的medoid

3. 更新每个类的medoid,计算objective function

4. 选择最佳参数

4. 返回2,当各类medoid不再变化的时候stop

复杂度:

O((n^2)d)

-计算各点间两两距离O((n^2)d)

-指定类:O(kn)   ,k是类数

4.特点:

-聚类结果与初始点有关(因为是做steepest descent from a random initial starting oint)

-是局部最优解

-在实际做的时候,随机选择多组初始点,最后选择拥有最低TSD(Total Squared Distance)的那组

Kmeans KMedoid Implementation with matlab:

===================

下面是我用matlab上的实现:

说明:fea为训练样本数据,gnd为样本标号。算法中的思想和上面写的一模一样,在最后的判断accuracy方面,由于聚类和分类不同,只是得到一些 cluster ,而并不知道这些 cluster 应该被打上什么标签,或者说。由于我们的目的是衡量聚类算法的 performance ,因此直接假定这一步能实现最优的对应关系,将每个 cluster 对应到一类上去。一种办法是枚举所有可能的情况并选出最优解,另外,对于这样的问题,我们还可以用 Hungarian algorithm 来求解。具体的Hungarian代码我放在了资源里,调用方法已经写在下面函数中了。下面给出Kmeans&Kmedoid主函数。

Kmeans.m 函数:

[cpp] view plain copy  
  1. function [ accuracy,MIhat ] = KMeans( K,mode )
  2. % Artificial Intelligence & Data Mining - KMeans & K-Medoids Clustering
  3. % Author: Rachel Zhang @ ZJU
  4. % CreateTime: 2012-11-18
  5. % Function: Clustering
  6. %  -K: number of clusters
  7. %  -mode:
  8. %   1: use kmeans cluster algorithm in matlab
  9. %   2: k_medroid algorithm: use data points as k centers
  10. %   3: k_means algorithm: use average as k centers
  11. global N_features;
  12. global N_samples;
  13. global fea;
  14. global gnd;
  15. switch (mode)
  16. case 1 %call system function KMeans
  17. label = kmeans(fea,K);
  18. [label,accuracy] = cal_accuracy(gnd,label);
  19. case 2%use kmedroid method
  20. for testcase = 1:10% do 10 times to get rid of the influence from Initial_center
  21. K_center = Initial_center(fea,K); %select initial points randomly
  22. changed_label = N_samples;
  23. label = zeros(1,N_samples);
  24. iteration_times = 0;
  25. while changed_label~=0
  26. cls_label = cell(1,K);
  27. for i = 1: N_samples
  28. for j = 1 : K
  29. D(j) = dis(fea(i,:),K_center(j,:));
  30. end
  31. [~,label(i)] = min(D);
  32. cls_label{label(i)} = [cls_label{label(i)} i];
  33. end
  34. changed_label = 0;
  35. cls_center = zeros(K,N_features);
  36. for i = 1 : K
  37. cls_center(i,:) = mean(fea(cls_label{i},:));
  38. D1 = [];
  39. for j = 1:size(cls_label{i},2)%number of samples clsutered in i-th class
  40. D1(j) = dis(cls_center(i,:),fea(cls_label{i}(j),:));
  41. end
  42. [~,min_ind] = min(D1);
  43. if ~isequal(K_center(i,:),fea(cls_label{i}(min_ind),:))
  44. K_center(i,:) = fea(cls_label{i}(min_ind),:);
  45. changed_label = changed_label+1;
  46. end
  47. end
  48. iteration_times = iteration_times+1;
  49. end
  50. [label,acc(testcase)] = cal_accuracy(gnd,label);
  51. end
  52. accuracy = max(acc);
  53. case 3%use k-means method
  54. for testcase = 1:10% do 10 times to get rid of the influence from Initial_center
  55. K_center = Initial_center(fea,K); %select initial points randomly
  56. changed_label = N_samples;
  57. label = zeros(1,N_samples);
  58. label_new = zeros(1,N_samples);
  59. while changed_label~=0
  60. cls_label = cell(1,K);
  61. changed_label = 0;
  62. for i = 1: N_samples
  63. for j = 1 : K
  64. D(j) = dis(fea(i,:),K_center(j,:));
  65. end
  66. [~,label_new(i)] = min(D);
  67. if(label_new(i)~=label(i))
  68. changed_label = changed_label+1;
  69. end;
  70. cls_label{label_new(i)} = [cls_label{label_new(i)} i];
  71. end
  72. label = label_new;
  73. for i = 1 : K  %recalculate k centroid
  74. K_center(i,:) = mean(fea(cls_label{i},:));
  75. end
  76. end
  77. [label,acc(testcase)] = cal_accuracy(gnd,label);
  78. end
  79. accuracy = max(acc);
  80. end
  81. MIhat = MutualInfo(gnd,label);
  82. function center = Initial_center(X,K)
  83. rnd_Idx = randperm(N_samples,K);
  84. center = X(rnd_Idx,:);
  85. end
  86. function res = dis(X1,X2)
  87. res = norm(X1-X2);
  88. end
  89. function [res,acc] = cal_accuracy(gnd,estimate_label)
  90. res = bestMap(gnd,estimate_label);
  91. acc = length(find(gnd == res))/length(gnd);
  92. end
  93. end

实验结果分析:

对上面得到的accuracy进行画图,横坐标为10个数据集,纵坐标为在其上进行聚类的准确率。

其中,auto为matlab内部kmeans函数。

画图:

[cpp] view plain copy  
  1. function [  ] = Plot( A,B,C )
  2. %PLOT Summary of this function goes here
  3. %   Detailed explanation goes here
  4. figure;
  5. k = 1:10;
  6. plot(k,A,'-r',k,B,'-b',k,C,'-g');
  7. legend('auto','medoid','means');
  8. end

结果:

5类聚类:

7类聚类:

from: http://blog.csdn.net/abcjennifer/article/details/8197072

聚类算法KMeans和KMedoid 的Matlab实现相关推荐

  1. matlab中的聚类算法,kmeans聚类算法matlab matlab 聚类算法silhouette

    怎样用matlab实现多维K-means聚类算法小编觉得一个好的周末应该是这样的:睡到中午醒来,在床上躺着玩两个小时手机,起床随便吃点东西,下午去超市买一大堆零食,五六点的时候去约小伙伴们吃火锅烧烤, ...

  2. 聚类算法——kmeans和meanshift

    聚类算法--kmeans和meanshift [转] 1. meanshift 转于http://www.cnblogs.com/liqizhou/archive/2012/05/12/2497220 ...

  3. 《菜菜的机器学习sklearn课堂》聚类算法Kmeans

    聚类算法 聚类算法 无监督学习与聚类算法 sklearn中的聚类算法 KMeans KMeans是如何工作的 簇内误差平方和的定义和解惑 sklearn.cluster.KMeans 重要参数 n_c ...

  4. 机器学习-Sklearn-07(无监督学习聚类算法KMeans)

    机器学习-Sklearn-07(无监督学习聚类算法KMeans) 学习07 1 概述 1.1 无监督学习与聚类算法 聚类算法又叫做"无监督分类",其目的是将数据划分成有意义或有用的 ...

  5. K均值聚类算法(Kmeans)讲解及源码实现

    K均值聚类算法(Kmeans)讲解及源码实现 算法核心 K均值聚类的核心目标是将给定的数据集划分成K个簇,并给出每个数据对应的簇中心点.算法的具体步骤描述如下. 数据预处理,如归一化.离群点处理等. ...

  6. 机器学习实战-61:K均值聚类算法(K-Means)

    K均值聚类算法(K-Means) 深度学习原理与实践(开源图书)-总目录,建议收藏,告别碎片阅读! 机器学习分为监督学习.无监督学习和半监督学习(强化学习).无监督学习最常应用的场景是聚类(clust ...

  7. 用人话讲明白聚类算法kmeans

    文章目录 1.什么是聚类 2.K-Means步骤 3.K-Means的数学描述 4.初始中心点怎么确定 5.K值怎么确定 6.小结 1.什么是聚类 先来回顾一下本系列第一篇就讲到的机器学习的种类. 监 ...

  8. K-Means聚类算法原理及其python和matlab实现

    (一)何谓聚类 还是那句"物以类聚.人以群分",如果预先知道人群的标签(如文艺.普通.2B),那么根据监督学习的分类算法可将一个人明确的划分到某一类:如果预先不知道人群的标签,那就 ...

  9. 聚类算法K-Means, K-Medoids, GMM, Spectral clustering,Ncut .

    聚类算法是ML中一个重要分支,一般采用unsupervised learning进行学习,本文根据常见聚类算法分类讲解K-Means, K-Medoids, GMM, Spectral cluster ...

最新文章

  1. matplotlib库之patch
  2. 【StatLearn】统计学习中knn算法实验(2)
  3. 【前端面试题】2021/3/12挺经典的面试题,这个经历很深刻。
  4. 语言inc c,汇编语言练习
  5. echarts js 删除框选数据_ECharts进行区域选择
  6. win11华为的电脑管家错误怎么办 Windows11华为电脑管家错误的解决方法
  7. 怎么购买企业邮箱,才不被坑?
  8. 关于微博api返回内容不全内容
  9. 共轭梯度法matlab程序精确线搜索,具有精确线性搜索的改进共轭梯度法
  10. windows环境下,搭建RTSP视频推流服务器
  11. SDD-FIQA基于人脸相似度分布距离的无监督质量评估方法
  12. 计算机开机桌面文件丢失怎么办,电脑重启桌面文件丢失怎么办
  13. 微信小程序显示圆形图片
  14. 服务器遇到DDOS攻击怎么办?
  15. 风口的猪?中国智能家居恐因没有专利集体阵亡
  16. Linux学习笔记------java学习
  17. 和机器学习和计算机视觉相关的数学
  18. SPI中NSS/CS使用和SPI常见问题
  19. java1.8安装_2020JDK1.8安装教程详解(一次就可安装成功)
  20. Oracle(甲骨文)中国研发中心大规模秘密裁员

热门文章

  1. 你在数据预处理上花费的时间,是否比机器学习还要多?
  2. Learning to rank在淘宝的应用
  3. 使用 AngularJS 和 Electron 构建桌面应用
  4. APM - Javassist 入门 生成一个简单类
  5. 并发编程-01并发初窥
  6. Spring-AOP @AspectJ切点函数之args()和@args()
  7. Java-JDK动态代理
  8. 干货二:微信SDK-分享初探-更新中
  9. 计算机死机的重启方法,使用“紧急重启”功能让电脑重启,解决电脑死机!
  10. 爬虫学习笔记(二十一)—— Appium