斯坦福机器学习实现与分析之八(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 ...
随机推荐
- 华硕飞行堡垒zx50安装Ubunutu折腾记
今年8月入手了华硕zx50,配置不错,作为一个合格的Linux爱好者,没买来一台电脑肯定得装上Linux编个程序什么的吧,,可恶的是,笔记本安装Linux系统往往比较麻烦,必须折腾很久才安装上,我手上 ...
- Xamarin.Android splash页面瞬间响应_避免APP启动闪白屏
Application和Activity中的onCreate都进行了优化,基本没有耗时操作,但是启动应用之后还是会闪现一下白色背景,然后才进入Splash页面,对比了一下QQ.微信.微博等客户端,点击 ...
- 嵌入式Linux应用程序开发详解------(创建守护进程)
嵌入式Linux应用程序开发详解 华清远见 本文只是阅读文摘. 创建一个守护进程的步骤: 1.创建一个子进程,然后退出父进程: 2.在子进程中使用创建新会话---setsid(): 3.改变当前工作目 ...
- 浅谈export 以及环境变量
简要说一下env,set,export的区别:env命令显示环境变量,set和export显示环境变量和自定变量. export:可以讲自定变量转化为环境变量之前有一个疑惑,我们定义环境变量PATH时 ...
- 我的第一篇博客--SQL小语句
开通了博客,拥有了属于自己的小小天地.先写一篇今儿刚学到的 1 remove mirroring relationship alter database datab_name set partner ...
- 程序4-6 utime函数实例
//http://blog.chinaunix.net/uid-24549279-id-71355.html /* ========================================== ...
- 对访问修饰关键字public, protected, internal and private的说明
对访问修饰关键字public, protected, internal and private的说明1.msdn: Internal types or members are accessible o ...
- Wordpress 3.5.1的debug流水账
一个合作网站是基于Wordpress做的, 不能正常使用FeedWordPress这个插件, 对方没有开发者, 只有一个类似于美工和编辑的人, 因为我在本地使用同样的版本(Wordpress 3.5. ...
- Wireshark命令行工具tshark
Wireshark命令行工具tshark 1.目的 写这篇博客的目的主要是为了方便查阅,使用wireshark可以分析数据包,可以通过编辑过滤表达式来达到对数据的分析:但我的需求是,怎么样把Data部 ...
- C语言 文件操作9--fgetc()和fputc()
//fgetc()和fputc() #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> # ...