Kmeans算法简介


  作为无监督学习领域的一种简单的算法,Kmeans在实际应用中却是相当广泛的。其过程是通过不断交替迭代求得最优的类中心以及每个样本所属类别,具体步骤如下:

  1. 确定类别个数k
  2. 随机初始化k个类的中心,分别为(\mu_1, \mu_2, …, \mu_k )
  3. 确定每个样本类别,原则为样本与类中心距离最小,即

    \begin{aligned} c^{(i)}=\underset{j}{arg min}Dist(x^{(i)}, \mu_j) \end{aligned}
  4. 更新每个类的中心

    \begin{aligned} \mu_j = \frac{\sum_{i=1}^m I(c{(i)}=j)x{(i)}} {\sum_{i=1}^m I(c^{(i)}=j)} \end{aligned}

    若已收敛,则结束迭代,否则转到3。迭代是否收敛可以跟据本次与前一次每个类的中心的变化来确定。

算法实现


  其实matlab本身已经有kmeans的函数,这里实现主要是熟悉算法过程。首先生成训练样本,这里生成3类高斯分布的样本,代码如下:

N = 100;
%生成第0类数据
mu = [2 2];
Sigma = [1 .5; .5 2]; R = chol(Sigma);
x = repmat(mu,N,1) + randn(N,2)*R;
y = zeros(N,1);
Sample = [x y];
figure, plot(x(:,1),x(:,2),'k.','LineWidth',3); hold on
%生成第1类数据
mu = [8 6];
Sigma = [1.0 0.5; 1.5 1.7]; R = chol(Sigma);
x = repmat(mu,N,1) + randn(N,2)*R;
y = ones(N,1);
Sample = [Sample;x y];
plot(x(:,1),x(:,2),'g.','LineWidth',3);
%生成第2类数据
mu = [5 -6];
Sigma = [2 0.3; 0.3 1.4]; R = chol(Sigma);
x = repmat(mu,N,1) + randn(N,2)*R;
y = 2 * ones(N,1);
Sample = [Sample;x y];
plot(x(:,1),x(:,2),'b.','LineWidth',3);
save('data.mat', 'Sample')

  生成的样本数据如下图:



  kmeans算法的实现代码如下:

    function [Label C IterInfo] = MyKmeans(Samples, k)
[m n] = size(Samples); %m个n维样本
C = Samples(1:k, :);
C1 = C;
MaxIterTime = 1000;
i = 0;
Label = zeros(m, 1);
IterInfo.C = {C};
while(i < MaxIterTime)
C1 = C;
%calc label
for j = 1:m
x = Samples(j,:)';
Label(j) = GetLabel(x, C1);
end
%calc center
for j = 1:k
idx = find(Label == j);
C(j, :) = mean(Samples(idx, :));
end
IterInfo.C = [IterInfo.C, {C}];
i = i + 1;
%end iter
if max(abs(C-C1)) < 1e-3
break;
end
end
IterInfo.IterTime = i+1;
end
function d = Dist(x, y)
d = (x - y)' * (x - y);
end
function L = GetLabel(x, C)
[k, n] = size(C);
min_d = inf;
L = 0;
for i = 1:k
d = Dist(x, C(i, :)');
if d < min_d
min_d = d;
L = i;
end
end
end

  对于上面的一组样本,迭代了5次就已经收敛,可见速度相当快,每次迭代结果如下图所示,红色方块是3个类的中心。





算法分析


  1. 关于算法的收敛性。算法的代价函数为每个样本距离其所属类别的中心距离和,即

    \begin{aligned} J=\sum_{i=1}mD(x{(i)}, \mu_{c(i)}) \end{aligned}

    可以比较容易分析出,每一次迭代,此函数J是在递减的。根据课件中所讲,该函数为非凸函数,迭代可能陷入局部最优解,因此可以多次随机初始化类中心来比较结果(这一点我暂时还没法从理论上证明)。

    然而某些特殊情况又可能导致不同的初始化类心会计算出不同的结果,比如3个样本点,两两距离相等(即等边三角形的3个顶点)的情况。
  2. 算法需要输入类别数k,这一点在很多实际问题中是比较困难的。当然目前有一些文章给出了自动确定k的方法,我还未详细了解,后续找时间补上。但基本的思想是通过检验不同k的条件下分类结果的聚合性来选择最优k。
  3. kmeans中使用的距离度量可以有很多种,如欧式距离,街区距离,余弦距离等等,具体使用哪种需要根据实际情况来定。上面代码中使用的是欧式距离。
  4. kmeans算法不是万能的,它只能出来类别呈中心聚集的情况。比如下面左图的情况kmeans的处理结果就很差。但是通过极坐标变换后(见右图),两类点就都分布呈中心聚集的状态,再使用kmeans就OK了。

斯坦福机器学习实现与分析之八(kmeans算法)的更多相关文章

  1. 吴恩达机器学习笔记(七) —— K-means算法

    主要内容: 一.K-means算法简介 二.算法过程 三.随机初始化 四.二分K-means 四.K的选择 一.K-means算法简介 1.K-means算法是一种无监督学习算法.所谓无监督式学习,就 ...

  2. 机器学习(十四)— kMeans算法

    参考文献:https://www.jianshu.com/p/5314834f9f8e # -*- coding: utf-8 -*- """ Created on Mo ...

  3. K-means算法(理论+opencv实现)

    写在前面:之前想分类图像的时候有看过k-means算法,当时一知半解的去使用,不懂原理不懂使用规则...显然最后失败了,然后看了<机器学习>这本书对k-means算法有了理论的认识,现在通 ...

  4. 视觉机器学习------K-means算法

    K-means(K均值)是基于数据划分的无监督聚类算法. 一.基本原理       聚类算法可以理解为无监督的分类方法,即样本集预先不知所属类别或标签,需要根据样本之间的距离或相似程度自动进行分类.聚 ...

  5. 【机器学习】机器学习入门08 - 聚类与聚类算法K-Means

    时间过得很快,这篇文章已经是机器学习入门系列的最后一篇了.短短八周的时间里,虽然对机器学习并没有太多应用和熟悉的机会,但对于机器学习一些基本概念已经差不多有了一个提纲挈领的了解,如分类和回归,损失函数 ...

  6. Python机器学习笔记:K-Means算法,DBSCAN算法

    K-Means算法 K-Means 算法是无监督的聚类算法,它实现起来比较简单,聚类效果也不错,因此应用很广泛.K-Means 算法有大量的变体,本文就从最传统的K-Means算法学起,在其基础上学习 ...

  7. 【机器学习笔记之一】深入浅出学习K-Means算法

    摘要:在数据挖掘中,K-Means算法是一种 cluster analysis 的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法. 在数据挖掘中,K-Means算法是一种c ...

  8. 机器学习中的K-means算法的python实现

    <机器学习实战>kMeans算法(K均值聚类算法) 机器学习中有两类的大问题,一个是分类,一个是聚类.分类是根据一些给定的已知类别标号的样本,训练某种学习机器,使它能够对未知类别的样本进行 ...

  9. Stanford机器学习笔记-9. 聚类(K-means算法)

    9. Clustering Content 9. Clustering 9.1 Supervised Learning and Unsupervised Learning 9.2 K-means al ...

随机推荐

  1. 使用MongoDB C#官方驱动操作MongoDB

    想要在C#中使用MongoDB,首先得要有个MongoDB支持的C#版的驱动.C#版的驱动有很多种,如官方提供的,samus. 实现思路大都类似.这里我们先用官方提供的mongo-csharp-dri ...

  2. Linux 常用命令行

    Linux常用命令行 第一部分: cd命令 第二部分:文件操作 第三部分:压缩包操作

  3. Sharepoint-Hosted App in 2013资料

    一个完整的流程,可参考网址 My First Sharepoint-Hosted App in 2013 部署第一个APP会遇到各种问题,可以参考网址 App development in Share ...

  4. redis watch multi exec 关系

    EXEC 执行所有事务块内的命令. 假如某个(或某些) key 正处于 WATCH 命令的监视之下,且事务块中有和这个(或这些) key 相关的命令,那么EXEC 命令只在这个(或这些) key 没有 ...

  5. hadoop core-site.xml

    <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text ...

  6. 译文 对无障碍网页应用(ARIA)的选择

    //本文编辑格式为Markdown,译文同时发布在众成翻译 对无障碍网页应用(ARIA)的选择 让网站对每个人都能访问是一件相当艰难的工作,尤其是在我们使用自定义标记解决方案(custom marku ...

  7. Floyd判最小环算法模板

    算法思想:如果存在最小环,会在编号最大的点u更新最短路径前找到这个环,发现的方法是,更新最短路径前,遍历i,j点对,一定会发现某对i到j的最短路径长度dis[i][j]+mp[j][u]+mp[u][ ...

  8. Android开发环境搭建(转)

    转载:http://www.cnblogs.com/zoupeiyang/p/4034517.html#1 引言   在windows安装Android的开发环境不简单也说不上算复杂,本文写给第一次想 ...

  9. 测试 Mono 安装

    测试 Mono 安装 为了测试核心编译器(mcs)和运行时(mono),应该创建一个简单的程序并编译它.可以在喜欢的任何文本编辑器中创建程序.这里采用一种快速而简陋的方法创建该文件(虽然没有任何格式化 ...

  10. 【Java基础】java 获得本日,本周,本月的时间戳区间

    如果涉及到统计的话,可能会经常用到.很简单的基础知识. 1.getTimestampByOffsetDay public static long getTimestampByOffsetDay(int ...