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. linux 下安装nodejs,CentOS 6.5 系统

    本文采用nodejs 通过源码编译安装方式 编译需要gcc-c++编译器和openssl-devel库的支持,如果没有需要先安装. 在centos下可以先执行:yum install gcc-c++ ...

  2. TFS 2015 Update 2功能探索

    微软刚刚发布了TFS 2015 update 2的测试包,https://blogs.msdn.microsoft.com/bharry/2016/02/10/team-foundation-serv ...

  3. pyhon之Tkinter实例化学习

    Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的接口,位Python的内置模块,直接import tkinter即可使用. 作为实践, 用Tkinter ...

  4. Java 如何有效地避免OOM:善于利用软引用和弱引用

    Java 如何有效地避免OOM:善于利用软引用和弱引用 想必很多朋友对OOM(OutOfMemory)这个错误不会陌生,而当遇到这种错误如何有效地解决这个问题呢?今天我们就来说一下如何利用软引用和弱引 ...

  5. 《TCP/IP详解 卷一》读书笔记-----广播&多播&IGMP

    1.广播和多播都只适用于UDP,因为TCP是面向连接的,需要将两台主机的两个进程绑定在一起,即IP地址和端口对 2.通常,网卡能看到网络中的每一个数据帧,但是往往它只接受目的地址与自己MAC地址相同的 ...

  6. Debian下安装deb格式安装包

    dpkg -i 软件包名称 就好啦 下面是相应链接: http://blog.csdn.net/lhf_tiger/article/details/7493400

  7. MySQL数据库学习笔记(二)----MySQL数据类型

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  8. Vector3.Dot 判断方位

    判断方位 假设空间中有这几个坐标,判断一个物体在另一个物体的左边还是右边,前后还是后面 物体空间图 假如以C为中心,判断L是在它的左边还是右边 判断方法 using UnityEngine; usin ...

  9. phpmyadmin后台拿shell方法总结

    方法一: CREATE TABLE `mysql`.`xiaoma` (`xiaoma1` TEXT NOT NULL ); INSERT INTO `mysql`.`xiaoma` (`xiaoma ...

  10. nginx反向代理+缓存开启+url重写+负载均衡(带健康探测)的部署记录

    在日常运维工作中,运维人员会时常使用到nginx的反向代理,负载均衡以及缓存等功能来优化web服务性能. 废话不多说,下面对测试环境下的nginx反向代理+缓存开启+url重写+负载均衡(带健康探测) ...