聚类算法KMeans和KMedoid 的Matlab实现
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 函数:
- function [ accuracy,MIhat ] = KMeans( K,mode )
- % Artificial Intelligence & Data Mining - KMeans & K-Medoids Clustering
- % Author: Rachel Zhang @ ZJU
- % CreateTime: 2012-11-18
- % Function: Clustering
- % -K: number of clusters
- % -mode:
- % 1: use kmeans cluster algorithm in matlab
- % 2: k_medroid algorithm: use data points as k centers
- % 3: k_means algorithm: use average as k centers
- global N_features;
- global N_samples;
- global fea;
- global gnd;
- switch (mode)
- case 1 %call system function KMeans
- label = kmeans(fea,K);
- [label,accuracy] = cal_accuracy(gnd,label);
- case 2%use kmedroid method
- for testcase = 1:10% do 10 times to get rid of the influence from Initial_center
- K_center = Initial_center(fea,K); %select initial points randomly
- changed_label = N_samples;
- label = zeros(1,N_samples);
- iteration_times = 0;
- while changed_label~=0
- cls_label = cell(1,K);
- for i = 1: N_samples
- for j = 1 : K
- D(j) = dis(fea(i,:),K_center(j,:));
- end
- [~,label(i)] = min(D);
- cls_label{label(i)} = [cls_label{label(i)} i];
- end
- changed_label = 0;
- cls_center = zeros(K,N_features);
- for i = 1 : K
- cls_center(i,:) = mean(fea(cls_label{i},:));
- D1 = [];
- for j = 1:size(cls_label{i},2)%number of samples clsutered in i-th class
- D1(j) = dis(cls_center(i,:),fea(cls_label{i}(j),:));
- end
- [~,min_ind] = min(D1);
- if ~isequal(K_center(i,:),fea(cls_label{i}(min_ind),:))
- K_center(i,:) = fea(cls_label{i}(min_ind),:);
- changed_label = changed_label+1;
- end
- end
- iteration_times = iteration_times+1;
- end
- [label,acc(testcase)] = cal_accuracy(gnd,label);
- end
- accuracy = max(acc);
- case 3%use k-means method
- for testcase = 1:10% do 10 times to get rid of the influence from Initial_center
- K_center = Initial_center(fea,K); %select initial points randomly
- changed_label = N_samples;
- label = zeros(1,N_samples);
- label_new = zeros(1,N_samples);
- while changed_label~=0
- cls_label = cell(1,K);
- changed_label = 0;
- for i = 1: N_samples
- for j = 1 : K
- D(j) = dis(fea(i,:),K_center(j,:));
- end
- [~,label_new(i)] = min(D);
- if(label_new(i)~=label(i))
- changed_label = changed_label+1;
- end;
- cls_label{label_new(i)} = [cls_label{label_new(i)} i];
- end
- label = label_new;
- for i = 1 : K %recalculate k centroid
- K_center(i,:) = mean(fea(cls_label{i},:));
- end
- end
- [label,acc(testcase)] = cal_accuracy(gnd,label);
- end
- accuracy = max(acc);
- end
- MIhat = MutualInfo(gnd,label);
- function center = Initial_center(X,K)
- rnd_Idx = randperm(N_samples,K);
- center = X(rnd_Idx,:);
- end
- function res = dis(X1,X2)
- res = norm(X1-X2);
- end
- function [res,acc] = cal_accuracy(gnd,estimate_label)
- res = bestMap(gnd,estimate_label);
- acc = length(find(gnd == res))/length(gnd);
- end
- end
实验结果分析:
对上面得到的accuracy进行画图,横坐标为10个数据集,纵坐标为在其上进行聚类的准确率。
其中,auto为matlab内部kmeans函数。
画图:
- function [ ] = Plot( A,B,C )
- %PLOT Summary of this function goes here
- % Detailed explanation goes here
- figure;
- k = 1:10;
- plot(k,A,'-r',k,B,'-b',k,C,'-g');
- legend('auto','medoid','means');
- end
结果:
5类聚类:
7类聚类:
from: http://blog.csdn.net/abcjennifer/article/details/8197072
聚类算法KMeans和KMedoid 的Matlab实现相关推荐
- matlab中的聚类算法,kmeans聚类算法matlab matlab 聚类算法silhouette
怎样用matlab实现多维K-means聚类算法小编觉得一个好的周末应该是这样的:睡到中午醒来,在床上躺着玩两个小时手机,起床随便吃点东西,下午去超市买一大堆零食,五六点的时候去约小伙伴们吃火锅烧烤, ...
- 聚类算法——kmeans和meanshift
聚类算法--kmeans和meanshift [转] 1. meanshift 转于http://www.cnblogs.com/liqizhou/archive/2012/05/12/2497220 ...
- 《菜菜的机器学习sklearn课堂》聚类算法Kmeans
聚类算法 聚类算法 无监督学习与聚类算法 sklearn中的聚类算法 KMeans KMeans是如何工作的 簇内误差平方和的定义和解惑 sklearn.cluster.KMeans 重要参数 n_c ...
- 机器学习-Sklearn-07(无监督学习聚类算法KMeans)
机器学习-Sklearn-07(无监督学习聚类算法KMeans) 学习07 1 概述 1.1 无监督学习与聚类算法 聚类算法又叫做"无监督分类",其目的是将数据划分成有意义或有用的 ...
- K均值聚类算法(Kmeans)讲解及源码实现
K均值聚类算法(Kmeans)讲解及源码实现 算法核心 K均值聚类的核心目标是将给定的数据集划分成K个簇,并给出每个数据对应的簇中心点.算法的具体步骤描述如下. 数据预处理,如归一化.离群点处理等. ...
- 机器学习实战-61:K均值聚类算法(K-Means)
K均值聚类算法(K-Means) 深度学习原理与实践(开源图书)-总目录,建议收藏,告别碎片阅读! 机器学习分为监督学习.无监督学习和半监督学习(强化学习).无监督学习最常应用的场景是聚类(clust ...
- 用人话讲明白聚类算法kmeans
文章目录 1.什么是聚类 2.K-Means步骤 3.K-Means的数学描述 4.初始中心点怎么确定 5.K值怎么确定 6.小结 1.什么是聚类 先来回顾一下本系列第一篇就讲到的机器学习的种类. 监 ...
- K-Means聚类算法原理及其python和matlab实现
(一)何谓聚类 还是那句"物以类聚.人以群分",如果预先知道人群的标签(如文艺.普通.2B),那么根据监督学习的分类算法可将一个人明确的划分到某一类:如果预先不知道人群的标签,那就 ...
- 聚类算法K-Means, K-Medoids, GMM, Spectral clustering,Ncut .
聚类算法是ML中一个重要分支,一般采用unsupervised learning进行学习,本文根据常见聚类算法分类讲解K-Means, K-Medoids, GMM, Spectral cluster ...
最新文章
- matplotlib库之patch
- 【StatLearn】统计学习中knn算法实验(2)
- 【前端面试题】2021/3/12挺经典的面试题,这个经历很深刻。
- 语言inc c,汇编语言练习
- echarts js 删除框选数据_ECharts进行区域选择
- win11华为的电脑管家错误怎么办 Windows11华为电脑管家错误的解决方法
- 怎么购买企业邮箱,才不被坑?
- 关于微博api返回内容不全内容
- 共轭梯度法matlab程序精确线搜索,具有精确线性搜索的改进共轭梯度法
- windows环境下,搭建RTSP视频推流服务器
- SDD-FIQA基于人脸相似度分布距离的无监督质量评估方法
- 计算机开机桌面文件丢失怎么办,电脑重启桌面文件丢失怎么办
- 微信小程序显示圆形图片
- 服务器遇到DDOS攻击怎么办?
- 风口的猪?中国智能家居恐因没有专利集体阵亡
- Linux学习笔记------java学习
- 和机器学习和计算机视觉相关的数学
- SPI中NSS/CS使用和SPI常见问题
- java1.8安装_2020JDK1.8安装教程详解(一次就可安装成功)
- Oracle(甲骨文)中国研发中心大规模秘密裁员
热门文章
- 你在数据预处理上花费的时间,是否比机器学习还要多?
- Learning to rank在淘宝的应用
- 使用 AngularJS 和 Electron 构建桌面应用
- APM - Javassist 入门 生成一个简单类
- 并发编程-01并发初窥
- Spring-AOP @AspectJ切点函数之args()和@args()
- Java-JDK动态代理
- 干货二:微信SDK-分享初探-更新中
- 计算机死机的重启方法,使用“紧急重启”功能让电脑重启,解决电脑死机!
- 爬虫学习笔记(二十一)—— Appium