K-Means 算法

K-Means 算法是一种聚类算法,聚类当然是无监督了,给定初始数据集 $\left \{x_i \right\}_{i=1}^N$ ,K-Means 会把数据分成 $K$ 个簇,每个簇代表不同的类别,K-Means 算法如下:

1. 从训练集 $\left \{x_i \right\}_{i=1}^N$  中选取 K 个质心, 分别为 $\left \{\mu_k \right\}_{k=1}^K$ ;

2. 重复一下过程直到收敛 :

2.1 对于样本 $x_i$ ,得到其类别 $c_i$ :\[c_i = \arg \min_k||x_i – \mu_k||^2\].

2.2 对于每一个簇 $k$ ,重新计算质心:\[ \mu_k=\frac{\sum_{i=1}^N 1\left \{ c_i = k \right \}x_i}{\sum_{i=1}^N 1\left \{ c_i = k \right \}}\]

聚类完成后,用 $\left \{C_k \right\}_{k=1}^K$ 表示得到 $K$ 个簇,可以定义一个损失来衡量聚类的效果,该损失同时可用作为迭代的停止条件,其形式如下:

\[J = \sum_{k}\sum_{x_i\in C_k}||x_i-\mu_k||^2\]

当两次迭代的损失 $J$ 基本不发生变化,或者每个簇的样本基本不发生变化时,迭代便可停止。下图为 K-Means 的过程:

K-Means 非常简单,实际应用中有两个关键问题,分别是:K 值的选取 与 初始质心的选择,下边分别来讨论之:

K值选取:

1)Elbow Method :当选择的k值小于真正的时,k每增加1,cost值就会大幅的减小;当选择的k值大于真正的K时, k每增加1,cost值的变化就不会那么明显。这样,正确的k值就会在这个转折点,类似elbow的地方。 如下图

2)

BIC的计算公式如下:

\[BIC = –2 \ln(likelihood) +ln(N) \times K\]

?其中,N是数据集中的样本数目,k特征数目。BIC是对模型拟合程度和复杂度的一种度量方式,计算公式中的-2*ln(likehood)部分是对模型拟合度的度量,这个值越大,说明拟合程度越差。模型复杂度由ln(N)*k度量。

?似然函数一般是通过概率计算的,即L(θ)=∏p(y|x;θ),是一个介于0到1的小数值,结合ln函数的图像可知ln(likehood)是一个负数,且似然函数越小,对应的就是一个绝对值越大的负数,所以-2*ln(likehood)越大,说明模型拟合度越差。如果模型有似然函数(如GMM),用BIC、DIC等决策;即使没有似然函数,如KMean,也可以搞一个假似然出来,例如用GMM等来代替

初始质心选择:

1)K-Means++ 的方法,首先随机选择一个点作为第一个初始类簇中心点,然后选择距离该点最远的那个点作为第二个初始类簇中心点,然后再选择距离前两个点的最近距离最大的点作为第三个初始类簇的中心点,以此类推,直至选出K个初始类簇中心点。

2)k-menasII算法在每次循环中选取多个points作为准centroid(准centroid是将来有可能会成为centroid的点),循环n次之后,会选取 足够多的准centroids。准centroid的数量要远大于k,而且在每次循环中选取的准centroid数量一般也会非常多, 例如每次选1000个,这样循环的次数要比k小很多,计算效率就会高很多。最后对C中的准centroid再进行聚类(可以使用k-means++算法),将聚类结果中的k个centroid作为原数据的k个 centroid。这样不仅选centroid时的计算效率提高了,而且选出的k个centroid的位置也会比较好,因为是再聚类生成的centroid。k-means II算法相比k-means++算法更适合并行计算,因为它没有要求去严格的选取k个点作为centroids, 只是预选,这样把1-5步放到不同的机器去计算,最后把选取的所有点在reducer中聚到一起, 再聚类,结果和非并行计算也是差不多的。

如果觉的效果还不好,

参考文献

http://kunlun.info/2016/03/25/kmeans_essential/

http://www.cnblogs.com/washa/p/4027284.html K值选择

http://www.cnblogs.com/kemaswill/archive/2013/01/26/2877434.html 初始质心的选择

http://www.xuebuyuan.com/2096905.html

http://blog.jqian.net/post/k-means.html

时间: 2024-10-25 05:20:48

K-Means 算法的相关文章

K-means算法

K-means算法很简单,它属于无监督学习算法中的聚类算法中的一种方法吧,利用欧式距离进行聚合啦. 解决的问题如图所示哈:有一堆没有标签的训练样本,并且它们可以潜在地分为K类,我们怎么把它们划分呢?     那我们就用K-means算法进行划分吧. 算法很简单,这么做就可以啦: 第一步:随机初始化每种类别的中心点,u1,u2,u3,--,uk; 第二步:重复以下过程: 然后 ,就没有然后了,就这样子. 太简单, 不解释.

DM里的K均值算法

1.Preface 因为一直在做的是聚类算法的研究,算是总结了一些心得,这里总结些知识性与思路性的东西,我想在其他地方也是很容易的找到类似的内容的.毕竟,世界就是那么小. 声明:本文比较不适合没有DM基础的人来阅读.我只是胡乱的涂鸦而已 2.聚类算法 在DM里的聚类算法里,有基于划分的算法,基于层次的算法,基于密度的算法,基于网格的算法,基于约束的算法. 其中每一种基于的算法都会衍生出一至几种算法,对应的每一种算法不管在学术界还是工业界都存在着许多的改进的算法 这里想介绍的是基于基于划分的算法里

k均值算法

import matplotlib.pyplot as plt import numpy as np import time from django.template.defaultfilters import center def loadDataSet(fileName): dataMat=[] fr=open(fileName) for line in fr.readlines(): curLine=line.strip().split('\t') fltLine=map(float,cu

『cs231n』作业1问题1选讲_通过代码理解K近邻算法&交叉验证选择超参数参数

通过K近邻算法探究numpy向量运算提速 茴香豆的"茴"字有... ... 使用三种计算图片距离的方式实现K近邻算法: 1.最为基础的双循环 2.利用numpy的broadca机制实现单循环 3.利用broadcast和矩阵的数学性质实现无循环 图片被拉伸为一维数组 X_train:(train_num, 一维数组) X:(test_num, 一维数组) 方法验证 import numpy as np a = np.array([[1,1,1],[2,2,2],[3,3,3]]) b

K 近邻算法

声明: 1,本篇为个人对<2012.李航.统计学习方法.pdf>的学习总结,不得用作商用,欢迎转载,但请注明出处(即:本帖地址). 2,因为本人在学习初始时有非常多数学知识都已忘记,所以为了弄懂当中的内容查阅了非常多资料.所以里面应该会有引用其它帖子的小部分内容,假设原作者看到能够私信我,我会将您的帖子的地址付到以下. 3.假设有内容错误或不准确欢迎大家指正. 4.假设能帮到你.那真是太好了. 描写叙述 给定一个训练数据集,对新的输入实例.在训练数据集中找到与该实例最邻近的K个实例,若这K个实

从K近邻算法、距离度量谈到KD树、SIFT+BBF算法

从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 前言 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章待写:1.KD树:2.神经网络:3.编程艺术第28章.你看到,blog内的文章与你于别处所见的任何都不同.于是,等啊等,等一台电脑,只好等待..”.得益于田,借了我一台电脑(借他电脑的时候,我连表示感谢,他说“能找到工作全靠你的博客,这点儿小忙还说,不地道”,有的时候,稍许感受到受人信任也是一种压力,愿我不辜负大家对我的信任)

聚类算法:K-means 算法(k均值算法)

k-means算法:      第一步:选$K$个初始聚类中心,$z_1(1),z_2(1),\cdots,z_k(1)$,其中括号内的序号为寻找聚类中心的迭代运算的次序号. 聚类中心的向量值可任意设定,例如可选开始的$K$个模式样本的向量值作为初始聚类中心.      第二步:逐个将需分类的模式样本$\{x\}$按最小距离准则分配给$K$个聚类中心中的某一个$z_j(1)$.假设$i=j$时, \[D_j (k) = \min \{ \left\| {x - z_i (k)} \right\|

二分-k均值算法

首先我们都知道k均值算法有一个炒鸡大的bug,就是在很多情况下他只会收敛到局部最小值而不是全局最小值,为了解决这个问题,很多学者提出了很多的方法,我们在这里介绍一种叫做2分k均值的方法. 该算法首先将所有点作为一个簇,然后将该簇一分为二.之后选择其中一个簇继续进行划分,选择哪一个簇进行划分取决于哪个簇的sse是最大值.上述基于sse的划分过程不断重复,直到得到用户指定的簇数目为止. 将所有的点看成一个簇,当粗的数目小于k时,对每一个簇计算总误差,在给定的粗上进行k均值聚类(k=2),计算将该粗一

K近邻算法

1.1.什么是K近邻算法 何谓K近邻算法,即K-Nearest Neighbor algorithm,简称KNN算法,单从名字来猜想,可以简单粗暴的认为是:K个最近的邻居,当K=1时,算法便成了最近邻算法,即寻找最近的那个邻居.为何要找邻居?打个比方来说,假设你来到一个陌生的村庄,现在你要找到与你有着相似特征的人群融入他们,所谓入伙. 用官方的话来说,所谓K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居),这K个实例的多数属

K均值算法-python实现

测试数据展示: #coding:utf-8__author__ = 'similarface''''实现K均值算法 算法摘要:-----------------------------输入:所有数据点A,聚类个数k输出:k个聚类的中心点 随机选取k个初始的中心点repeat: 计算每个点和中心点的距离,将点分配给最近的中心簇中 计算Ck,更新簇的中心点until 中心点稳定 -----------------------------'''import sysimport randomimport