K-means算法很简单,它属于无监督学习算法中的聚类算法中的一种方法吧,利用欧式距离进行聚合啦。

解决的问题如图所示哈:有一堆没有标签的训练样本,并且它们可以潜在地分为K类,我们怎么把它们划分呢?     那我们就用K-means算法进行划分吧。

算法很简单,这么做就可以啦:

第一步:随机初始化每种类别的中心点,u1,u2,u3,……,uk;

第二步:重复以下过程:

然后 ,就没有然后了,就这样子。

太简单, 不解释。

2017年10月14日补:

今晚造了一个轮子,k-means算法在matlab中的实现,使用的是欧氏距离; 共有两个文件,分别为euclidean_distance.m 与k_means.m;   代码如下(或:http://pan.baidu.com/s/1o8p6sfo 密码:4hhb):

euclidean_distance.m文件:

function [ output ] = euclidean_distance(data, center)
% 用于计算训练样本与聚类中心的的欧氏距离的平方;
% 其中 data为一个 矩阵 M×N, 表示样本集,其中M表示共有M个样本, N表示每一个样本的维度;
% centre 为一个矩阵 K×N,表示K个聚类中心,N表示样本的维度;
% output 为一个矩阵,大小为M×K; 第x行y列表示第X个样本与第Y个聚类中心的距离;(每一行表示一个样本与K个聚类中心的距离); % 作者:殷和义;
% 时间:2017年10月14日; data_num = size(data, 1);
center_num = size(center, 1);
output = zeros(data_num, center_num);
for i = 1:center_num
difference = data - repmat(center(i,:), data_num, 1); %求样本集与第i个聚类中心的差;
sum_of_squares = sum(difference .* difference, 2); %求平方, 并对每一行求和;
output(:, i) = sum_of_squares;
end end

k_means.m 文件

function [ output ] = k_means(data, k_value)
% 功能:实现K-means算法的聚类功能;
% 输入: data, 为一个 矩阵 M×N, 表示样本集,其中M表示共有M个样本, N表示每一个样本的维度;
% k_value, 表示聚类的类别数目;
% 输出: output, 是一个列向量 M×1,表示每一个样本属于的类别编号; % 作者: 殷和义;
% 时间: 2017年10月14日 %从样本中,随机选取K个样本作为初始的聚类中心;
data_num = size(data, 1);
temp = randperm(data_num, k_value)';
center = data(temp, :); %用于计数迭代次数:
iteration = 0;
while 1
%获得样本集与聚类中心的距离;
distance = euclidean_distance(data, center);
%将距离矩阵的每一行从小到大排序, 获得相应的index值,其实我们只需要index的第一列的值;
[~, index] = sort(distance, 2, 'ascend'); %接下来形成新的聚类中心;
center_new = zeros(k_value, size(data, 2));
for i = 1:k_value
data_for_one_class = data(index(:, 1) == i, :);
center_new(i,:) = mean(data_for_one_class, 1); %因为初始的聚类中心为样本集中的元素,所以不会出现某类别的样本个数为0的情况;
end %输出迭代次数,给眼睛一个反馈;
iteration = iteration + 1;
fprintf('进行迭代次数为:%d\n', iteration); % 如果这两次的聚类中心不变,则停止迭代,跳出循环;
if center_new == center
break;
end center = center_new;
end output = index(:, 1); end

k-means算法及matlab实现的更多相关文章

  1. KNN 与 K - Means 算法比较

    KNN K-Means 1.分类算法 聚类算法 2.监督学习 非监督学习 3.数据类型:喂给它的数据集是带label的数据,已经是完全正确的数据 喂给它的数据集是无label的数据,是杂乱无章的,经过 ...

  2. K-means算法

    K-means算法很简单,它属于无监督学习算法中的聚类算法中的一种方法吧,利用欧式距离进行聚合啦. 解决的问题如图所示哈:有一堆没有标签的训练样本,并且它们可以潜在地分为K类,我们怎么把它们划分呢?  ...

  3. ISODATA聚类算法的matlab程序

    ISODATA聚类算法的matlab程序 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 参考:Kmeans及ISODATA算法的matlab实现 算法 ...

  4. GMM算法的matlab程序

    GMM算法的matlab程序 在“GMM算法的matlab程序(初步)”这篇文章中已经用matlab程序对iris数据库进行简单的实现,下面的程序最终的目的是求准确度. 作者:凯鲁嘎吉 - 博客园 h ...

  5. GMM算法的matlab程序(初步)

    GMM算法的matlab程序 在https://www.cnblogs.com/kailugaji/p/9648508.html文章中已经介绍了GMM算法,现在用matlab程序实现它. 作者:凯鲁嘎 ...

  6. KFCM算法的matlab程序(用FCM初始化聚类中心)

    KFCM算法的matlab程序(用FCM初始化聚类中心) 在“聚类——KFCM”这篇文章中已经介绍了KFCM算法,现在用matlab程序对iris数据库进行实现,用FCM初始化聚类中心,并求其准确度与 ...

  7. KFCM算法的matlab程序

    KFCM算法的matlab程序 在“聚类——KFCM”这篇文章中已经介绍了KFCM算法,现在用matlab程序对iris数据库进行简单的实现,并求其准确度. 作者:凯鲁嘎吉 - 博客园 http:// ...

  8. FCM算法的matlab程序2

    FCM算法的matlab程序2 在“FCM算法的matlab程序”这篇文章中已经用matlab程序对iris数据库进行实现,并求解准确度.下面的程序是另一种方法,是最常用的方法:先初始化聚类中心,在进 ...

  9. FCM算法的matlab程序

    FCM算法的matlab程序 在“FCM算法的matlab程序(初步)”这篇文章中已经用matlab程序对iris数据库进行简单的实现,下面的程序最终的目的是求准确度. 作者:凯鲁嘎吉 - 博客园 h ...

随机推荐

  1. Java和C++通过Socket通信中文乱码的解决

    理想的开发状态是我开始就是C开发,一直是C的开发,现在还是C的开发,若干年后,幸运的话,我可以成为C语言的高手或者专家…… 更实际的情况是我开始是C开发,后来变成了JAVA开发,然后又做起了VC++的 ...

  2. EF 多线程TransactionScope事务异常"事务EFTransaction类定义:与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。"

    解决方案代码一:使用lock锁定 //对于锁推荐使用静态私有静态变量 private readonly static object _MyLock = new object(); /// <su ...

  3. Java:集合,Map接口框架图

    Java集合大致可分为Set.List和Map三种体系,其中Set代表无序.不可重复的集合:List代表有序.重复的集合:而Map则代表具有映射关系的集合.Java 5之后,增加了Queue体系集合, ...

  4. js方法call和apply实例解析

    在js编程中实现继承时 用到了两个很特殊的方法,call和apply. 在ECMAScript v3中,给Function原型定义了这两个方法,这两个方法的作用都是一样的:使用这两个方法可以像调用其他 ...

  5. Tomcat Jboss Glassfish 三种常见web容器比较

    一.缘由: 新公司平台是纯Java架构,有用到Java Web(JSP).Java 业务(EJB).Nginx..Websphere MQ.Mysql这样.大家知道java是跑在容器里的, 这里的业务 ...

  6. HDU 4565 So Easy!(公式化简+矩阵)

    转载:http://www.klogk.com/posts/hdu4565/ 这里写的非常好,看看就知道了啊. 题意很easy.a,b,n都是正整数.求 Sn=⌈(a+b√)n⌉%m,(a−1)2&l ...

  7. vim学习日志(5):vim下wimrc的配置,解决中文乱码问题

    解决linux下vim乱码的情况:(修改vimrc的内容) 全局的情况下:即所有用户都能用这个配置 文件地址:/etc/vimrc 在文件中添加: ,ucs-bom,gb18030,gbk,gb231 ...

  8. weblogic连接池问题总结(转载)

    转自:某局Weblogic 连接池问题(现场报告)(Connection has been administratively disabled. Try later.) 目录 1. 概述 3 1.1 ...

  9. eclipse 修改java代码不重启服务器 生效配置

    1.本文目的:用tomcat进行web开发时,修改Java代码往往要重启代码,当工程较大启动较慢时,严重影响效率,本文通过eclipse下tomcat开发和发布web程序时,对一些Java代码一般修改 ...

  10. SparkSQL ThriftServer服务的使用和程序中JDBC的连接

    SparkSQL ThriftServer服务的使用和程序中JDBC的连接 此时要注意版本问题,我第一次用的是hive2.1.1的,因为要用sparksql的hive服务,但是sparksql默认的是 ...