斯坦福机器学习实现与分析之八(kmeans算法)
Kmeans算法简介
作为无监督学习领域的一种简单的算法,Kmeans在实际应用中却是相当广泛的。其过程是通过不断交替迭代求得最优的类中心以及每个样本所属类别,具体步骤如下:
- 确定类别个数k
- 随机初始化k个类的中心,分别为(\mu_1, \mu_2, …, \mu_k )
- 确定每个样本类别,原则为样本与类中心距离最小,即
\begin{aligned} c^{(i)}=\underset{j}{arg min}Dist(x^{(i)}, \mu_j) \end{aligned}- 更新每个类的中心
\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个类的中心。



算法分析
- 关于算法的收敛性。算法的代价函数为每个样本距离其所属类别的中心距离和,即
\begin{aligned} J=\sum_{i=1}mD(x{(i)}, \mu_{c(i)}) \end{aligned}
可以比较容易分析出,每一次迭代,此函数J是在递减的。根据课件中所讲,该函数为非凸函数,迭代可能陷入局部最优解,因此可以多次随机初始化类中心来比较结果(这一点我暂时还没法从理论上证明)。
然而某些特殊情况又可能导致不同的初始化类心会计算出不同的结果,比如3个样本点,两两距离相等(即等边三角形的3个顶点)的情况。 - 算法需要输入类别数k,这一点在很多实际问题中是比较困难的。当然目前有一些文章给出了自动确定k的方法,我还未详细了解,后续找时间补上。但基本的思想是通过检验不同k的条件下分类结果的聚合性来选择最优k。
- kmeans中使用的距离度量可以有很多种,如欧式距离,街区距离,余弦距离等等,具体使用哪种需要根据实际情况来定。上面代码中使用的是欧式距离。
- kmeans算法不是万能的,它只能出来类别呈中心聚集的情况。比如下面左图的情况kmeans的处理结果就很差。但是通过极坐标变换后(见右图),两类点就都分布呈中心聚集的状态,再使用kmeans就OK了。

斯坦福机器学习实现与分析之八(kmeans算法)的更多相关文章
- 吴恩达机器学习笔记(七) —— K-means算法
主要内容: 一.K-means算法简介 二.算法过程 三.随机初始化 四.二分K-means 四.K的选择 一.K-means算法简介 1.K-means算法是一种无监督学习算法.所谓无监督式学习,就 ...
- 机器学习(十四)— kMeans算法
参考文献:https://www.jianshu.com/p/5314834f9f8e # -*- coding: utf-8 -*- """ Created on Mo ...
- K-means算法(理论+opencv实现)
写在前面:之前想分类图像的时候有看过k-means算法,当时一知半解的去使用,不懂原理不懂使用规则...显然最后失败了,然后看了<机器学习>这本书对k-means算法有了理论的认识,现在通 ...
- 视觉机器学习------K-means算法
K-means(K均值)是基于数据划分的无监督聚类算法. 一.基本原理 聚类算法可以理解为无监督的分类方法,即样本集预先不知所属类别或标签,需要根据样本之间的距离或相似程度自动进行分类.聚 ...
- 【机器学习】机器学习入门08 - 聚类与聚类算法K-Means
时间过得很快,这篇文章已经是机器学习入门系列的最后一篇了.短短八周的时间里,虽然对机器学习并没有太多应用和熟悉的机会,但对于机器学习一些基本概念已经差不多有了一个提纲挈领的了解,如分类和回归,损失函数 ...
- Python机器学习笔记:K-Means算法,DBSCAN算法
K-Means算法 K-Means 算法是无监督的聚类算法,它实现起来比较简单,聚类效果也不错,因此应用很广泛.K-Means 算法有大量的变体,本文就从最传统的K-Means算法学起,在其基础上学习 ...
- 【机器学习笔记之一】深入浅出学习K-Means算法
摘要:在数据挖掘中,K-Means算法是一种 cluster analysis 的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法. 在数据挖掘中,K-Means算法是一种c ...
- 机器学习中的K-means算法的python实现
<机器学习实战>kMeans算法(K均值聚类算法) 机器学习中有两类的大问题,一个是分类,一个是聚类.分类是根据一些给定的已知类别标号的样本,训练某种学习机器,使它能够对未知类别的样本进行 ...
- Stanford机器学习笔记-9. 聚类(K-means算法)
9. Clustering Content 9. Clustering 9.1 Supervised Learning and Unsupervised Learning 9.2 K-means al ...
随机推荐
- c#注册表对象映射
用于快捷保存与读取注册表,为对应的对象 示例 [RegistryRoot(Name = "superAcxxxxx")] public class Abc : IRegistry ...
- Log4j配置与使用
log4j是Java社区事实上的日志标准解决方案.使用起来比较简单. 一. 简单使用 1.下载jar包放到lib文件夹,并加入到build path中: 2.编写log4j.properties文件, ...
- 关于Math类的round、floor、ceil三个方法
一.Math类这三个方法的简介 1.round():取最接近的值. 对于这个方法,查看源代码,其实现如下: public static long round(double a) { if (a != ...
- cocos2d-x之json文件读取初试
rapidjson::Document d; d.Parse<0>(FileUtils::getInstance()->getStringFromFile("data_2. ...
- hdu String Problem(最小表示法入门题)
hdu 3374 String Problem 最小表示法 view code#include <iostream> #include <cstdio> #include &l ...
- Linux 系统常用命令汇总(六) 文件打包与压缩
文件打包与压缩 命令 选项 注解 示例 compress 文件名 压缩指定的文件,压缩后的格式为*.z compress install.log -d 解压被压缩的文件 .z为后缀的文件:compr ...
- ZBrush中的纹理-水手该怎样进行绘制
如下是一张使用ZBrush3D图形绘制软件绘制的栩栩如生的水手图片,那么有人要问了,如何创建水手渲染的皮肤纹理呢?接下来,小编将教大家学习如何创建皮肤颜色,顺便说一下,这里所选取的颜色仅仅是在ZBru ...
- JAVASE笔记回顾
第一部分,JAVA基础和面向对象 part01 入门与开发环境搭建 1: 计算机基础知识(了解)(1)计算机(2)计算机硬件(3)计算机软件系统软件:windows,linux,mac应用软件:QQ, ...
- nginx 与 tomcat 集群 一二事 (0) - 简单介绍
最近看了nginx以及tomcat的集群,通俗的做一下简单总结吧 nginx 是一个http服务器,是由俄罗斯人发明的,目前主流的服务器,作为负载均衡服务器,性能非常好,最高支持5万个并发连接数,在淘 ...
- Linux安装、卸载软件
在linux环境中,尤其是cenos中安装过一些软件,一般是二进制安装与源码安装,现小结一下linux中的安装与卸载. 一.通常Linux应用软件的安装包有三种: 1) tar包,如software- ...