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

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

距离为曼哈顿距离

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

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

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

国内实现:

kMedoids.m代码:

function [cx,cost] = kMedoids(K,data,num)
% 生成将data聚成K类的最佳聚类
% K为聚类数目,data为数据集,num为随机初始化次数
[cx,cost] = kMedoids1(K,data);
for i = 2:num
[cx1,min] = kMedoids1(K,data);
if min<cost
cost = min;
cx = cx1;
end
end
end function [cx,cost] = kMedoids1(K,data)
% 把分类数据集data聚成K类
% [cx,cost] = kmeans(K,data)
% K为聚类数目,data为数据集
% cx为样本所属聚类,cost为此聚类的代价值
% 选择需要聚类的数目 % 随机选择聚类中心
centroids = data(randperm(size(data,1),K),:);
% 迭代聚类
centroids_temp = zeros(size(centroids));
num = 0;
while (~isequal(centroids_temp,centroids)&&num<20)
centroids_temp = centroids;
[cx,cost] = findClosest(data,centroids,K);
centroids = compueCentroids(data,cx,K);
num = num+1;
end
% cost = cost/size(data,1); end function [cx,cost] = findClosest(data,centroids,K)
% 将样本划分到最近的聚类中心
cost = 0;
n = size(data,1);
cx = zeros(n,1);
for i = 1:n
% 曼哈顿距离
[M,I] = min(sum(abs((data(i,:)-centroids))'));
cx(i) = I;
cost = cost+M;
end
end function centroids = compueCentroids(data,cx,K)
% 计算新的聚类中心
centroids = zeros(K,size(data,2));
for i = 1:K
% 寻找代价值最小的当前聚类中心
temp = data((cx==i),:);
[~,I] = min(sum(squareform(pdist(temp))));
centroids(i,:) = temp(I,:);
end
end

Main.m

% 主函数

% 生成符合高斯分布的数据
mu = [5,5];
sigma = [16,0;0,16];
sigma1 = [0.5,0;0,0.5];
data = gaussianSample(8,50,mu,sigma,sigma1); % 聚类
K = 6;
[cx,cost] = kMedoids(K,data,10);
plotMedoids(data,cx,K);

执行Main.m结果为:

最新文章

  1. 【代码笔记】iOS-获得徐家汇的天气预报
  2. SharePoint 2013必备组件离线包安装:AppFabric无法安装问题解决
  3. ansible中tag的用法
  4. 一个平台BUG,好吧,找到了一个新的办法,同样的效果
  5. python--自动删除文件
  6. django-crontab定时任务
  7. C++中的术语
  8. Maven 工程下 Spring MVC 站点配置 (二) Mybatis数据操作
  9. 玩了几天的ARToolKit
  10. hdu1009 FatMouse&#39; Trade---贪心
  11. 20个大大节省你时间的HTML5开发工具
  12. Python项目,VS Code控制台输出乱码问题解决办法
  13. lua语言自学知识点----Lua与.Net相互调用
  14. Android开发 解决EditText与NestedScrollView 滚动冲突问题
  15. Java实现AES加密,异常java.security.InvalidKeyException: Illegal key size 的解决
  16. js canvas 转动时钟实例
  17. LODOP暂存、应用、复原 按钮的区别
  18. asp.net core自定义模型验证——前端验证
  19. NFS Iptables放行服务端口
  20. UI设计初学者如何避免走弯路?

热门文章

  1. [shell]system和execlp简单示例
  2. PHP——简单的表单提交
  3. 使用Navicat连接阿里云服务器上的MySQL数据库=======Linux 开放 /etc/hosts.allow
  4. Fastcgi_Finish_Request 提高页面响应速度
  5. 很多人都不知道的监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法
  6. trim() 是什么意思?
  7. qtcreator 中文乱码
  8. Python 资料性网站。
  9. 关于CSS 里的_width是什么意思???
  10. bootstrap基础学习七篇