国内博客,上介绍实现的K-medodis方法为:

与K-means算法类似。只是距离选择与聚类中心选择不同。

距离为曼哈顿距离

聚类中心选择为:依次把一个聚类中的每一个点当作当前类的聚类中心,求出代价值最小的点当作当前聚类中心。

维基百科上,实现的方法为PAM算法。

分成K类,把每个点都尝试当作聚类中心,并求出当前组合聚类中心点组合的代价值。找到总最小代价值的中心点。

国内实现:

kMedoids.m代码:

  1. function [cx,cost] = kMedoids(K,data,num)
  2. % 生成将data聚成K类的最佳聚类
  3. % K为聚类数目,data为数据集,num为随机初始化次数
  4. [cx,cost] = kMedoids1(K,data);
  5. for i = 2:num
  6. [cx1,min] = kMedoids1(K,data);
  7. if min<cost
  8. cost = min;
  9. cx = cx1;
  10. end
  11. end
  12. end
  13.  
  14. function [cx,cost] = kMedoids1(K,data)
  15. % 把分类数据集data聚成K
  16. % [cx,cost] = kmeans(K,data)
  17. % K为聚类数目,data为数据集
  18. % cx为样本所属聚类,cost为此聚类的代价值
  19. % 选择需要聚类的数目
  20.  
  21. % 随机选择聚类中心
  22. centroids = data(randperm(size(data,1),K),:);
  23. % 迭代聚类
  24. centroids_temp = zeros(size(centroids));
  25. num = 0;
  26. while (~isequal(centroids_temp,centroids)&&num<20)
  27. centroids_temp = centroids;
  28. [cx,cost] = findClosest(data,centroids,K);
  29. centroids = compueCentroids(data,cx,K);
  30. num = num+1;
  31. end
  32. % cost = cost/size(data,1);
  33.  
  34. end
  35.  
  36. function [cx,cost] = findClosest(data,centroids,K)
  37. % 将样本划分到最近的聚类中心
  38. cost = 0;
  39. n = size(data,1);
  40. cx = zeros(n,1);
  41. for i = 1:n
  42. % 曼哈顿距离
  43. [M,I] = min(sum(abs((data(i,:)-centroids))'));
  44. cx(i) = I;
  45. cost = cost+M;
  46. end
  47. end
  48.  
  49. function centroids = compueCentroids(data,cx,K)
  50. % 计算新的聚类中心
  51. centroids = zeros(K,size(data,2));
  52. for i = 1:K
  53. % 寻找代价值最小的当前聚类中心
  54. temp = data((cx==i),:);
  55. [~,I] = min(sum(squareform(pdist(temp))));
  56. centroids(i,:) = temp(I,:);
  57. end
  58. end

Main.m

  1. % 主函数
  2.  
  3. % 生成符合高斯分布的数据
  4. mu = [5,5];
  5. sigma = [16,0;0,16];
  6. sigma1 = [0.5,0;0,0.5];
  7. data = gaussianSample(8,50,mu,sigma,sigma1);
  8.  
  9. % 聚类
  10. K = 6;
  11. [cx,cost] = kMedoids(K,data,10);
  12. plotMedoids(data,cx,K);

执行Main.m结果为:

K-medodis聚类算法MATLAB的更多相关文章

  1. 密度峰值聚类算法MATLAB程序

    密度峰值聚类算法MATLAB程序 凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 密度峰值聚类算法简介见:[转] 密度峰值聚类算法(DPC) 数据见:MATL ...

  2. k均值聚类算法原理和(TensorFlow)实现

    顾名思义,k均值聚类是一种对数据进行聚类的技术,即将数据分割成指定数量的几个类,揭示数据的内在性质及规律. 我们知道,在机器学习中,有三种不同的学习模式:监督学习.无监督学习和强化学习: 监督学习,也 ...

  3. K均值聚类算法

    k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个 ...

  4. 机器学习实战---K均值聚类算法

    一:一般K均值聚类算法实现 (一)导入数据 import numpy as np import matplotlib.pyplot as plt def loadDataSet(filename): ...

  5. K均值聚类算法的MATLAB实现

    1.K-均值聚类法的概述    之前在参加数学建模的过程中用到过这种聚类方法,但是当时只是简单知道了在matlab中如何调用工具箱进行聚类,并不是特别清楚它的原理.最近因为在学模式识别,又重新接触了这 ...

  6. 基于改进人工蜂群算法的K均值聚类算法(附MATLAB版源代码)

    其实一直以来也没有准备在园子里发这样的文章,相对来说,算法改进放在园子里还是会稍稍显得格格不入.但是最近邮箱收到的几封邮件让我觉得有必要通过我的博客把过去做过的东西分享出去更给更多需要的人.从论文刊登 ...

  7. K-modes聚类算法MATLAB

    K-modes算法主要用于分类数据,如 国籍,性别等特征. 距离使用汉明距离,即有多少对应特征不同则距离为几. 中心点计算为,选择众数作为中心点. 主要功能: 随机初始化聚类中心,计算聚类. 选择每次 ...

  8. K-means聚类算法MATLAB

    以K-means算法为例,实现了如下功能 自动生成符合高斯分布的数据,函数名为gaussianSample.m 实现多次随机初始化聚类中心,以找到指定聚类数目的最优聚类.函数名myKmeans.m 自 ...

  9. 谱聚类算法—Matlab代码

    % ========================================================================= % 算 法 名 称: Spectral Clus ...

随机推荐

  1. QT 4.8.5 源代码目录调整

    * 前言: 有一个代码比较乱的 QT 源码,我想让它分目录整理一下,特此记录一下. * 在原来的代码里面,里面很多文件都是在主文件里面,这样做的话不好维护以及整理 network 里面所有的文件都是和 ...

  2. [systemd]Linux系统启动之systemd

    参照:https://wiki.debian.org/systemd 最近在添加板子应用程序自启动的时候,发现在rcN.d中的符号链接并没有用,文件系统为Debian Jessie 8, 后来从同事那 ...

  3. 串口编程-termios编程

    linux使用terminfo数据库来描述终端能力以及调用对应功能的方法.POSIX定义了完成终端I/O的标准方法:termios函数族 #include <termios.h>#incl ...

  4. Redis-stat is not found

    $ruby -v ruby 2.1.3p242 (2014-09-19 revision 47630) [x86_64-linux] $gem -v 2.2.2 $which ruby /usr/lo ...

  5. mysql 分区 限制

    MySQL分区的限制 •   只能对数据表的整型列进行分区源码天空,或者数据列可以通过分区函数转化成整型列 •   最大分区数目不能超过1024 •   如果含有唯一索引或者主键,则分区列必须包含在所 ...

  6. KMP + 求相等前后缀--- POJ Seek the Name, Seek the Fame

    Seek the Name, Seek the Fame Problem's Link: http://poj.org/problem?id=2752 Mean: 给你一个字符串,求这个字符串中有多少 ...

  7. java基础知识小小结

    java基础知识小总结 在一个独立的原始程序里,只能有一个 public 类,却可以有许多 non-public 类.此外,若是在一个 Java 程序中没有一个类是 public,那么该 Java 程 ...

  8. C++ 友元类,友元函数

    //友元函数 友元类 #include<iostream> using namespace std; class PointB { public: friend class PointC; ...

  9. Android_Zip解压缩工具

    public class ZipUtil { public ZipUtil(){ } /** * DeCompress the ZIP to the path * @param zipFileStri ...

  10. elasticsearch中mapping的_source和store的笔记

    0.故事引入 无意中看到了ES的mapping中有store字段,作为一个ES菜鸡,有必要对这个字段进行下笔记. 1._source _source字段我在们进行检索时相当重要, ES默认检索只会返回 ...