k-means算法总结

1.原理

  聚类是一种无监督学习的方法,其实质是依据某种距离度量,使得同一聚簇之间的相似性最大化,不同聚簇之间的相似性最小化,即把相似的对象放入同一聚簇中,把不相似的对象放到不同的聚簇中。聚类与分类不同,聚类的输入对象不需要带有类别标签,最后组成的分类是由使用的算法决定的。

在聚类中,k-means由于其简单、易实现的优点,被广泛使用。

  假设集合是d维向量空间中的集合,其中表示集合中的第i个对象(或称为"数据点"),设矩阵表示k个聚簇中心的集合,其中,表示第j个聚簇标识,向量用于表示每个数据点所属的聚簇。

  k-means算法是一种迭代的贪婪下降求解算法,其目标函数是非凸的,这也是造成只能得到局部最优解的原因,目标函数表达式如下:

  算法的流程主要包括,首先我们随机选择集合中的k个点作为初始的聚簇中心,接着根据将集合中的每个点分配到距离它最近的聚簇中,最后根据每个聚簇中的数据点更新聚簇中心,如此反复地执行后两个步骤直到算法收敛。k-means算法就是通过迭代的方式,将集合中的数据点聚成k个类,其核心步骤主要有:

  1)将数据点分配到距离它最近的聚簇中心

  2)更新聚簇中心(取聚簇中每个数据点坐标的均值)

  算法的详细步骤如表1所示,

表1 k-means算法的具体步骤

 2.缺陷

  k-means算法存在不少的缺陷,表2列出了k-means算法常见的缺陷以及解决的方法。

表2 k-means算法缺陷

3.扩展

3.1核方法

  为了能处理形状复杂的聚簇,我们可以通过核方法提高k-means算法对于复杂数据的处理能力。我们知道聚簇边界在原空间中是非线性的,但是,如果是在核函数所隐含的高维空间中却可以线性的。

3.2加速的k-means

  k-means算法在处理超大数据时,存在时间过长的缺陷,所以针对这个缺点,提出了不少的改进算法。例如可以通过使用kd-树或者利用三角不等式,减少在重新划分聚簇这个步骤的计算量。

3.3柔性k-means

  柔性k-means是与刚性k-means相对的,刚性的k-means即基本的k-means算法,将每个数据点划分到唯一一个聚簇中。而在柔性的k-means算法中,将每个数据点依据概率赋给每个聚簇,即柔性k-means中,每个数据点都有一个权重(概率)向量,用来描述每个数据点属于每个聚簇的可能性。

 4.小结

  k-means算法使用简单的迭代将数据集聚成k个类,迭代的核心步骤有:(1)更新聚簇中心;(2)更新聚簇标识。尽管它有不少缺陷,但是其实现简单、移动、伸缩性良好等优点使得它成为聚类中最常用的算法之一。

参考文献

[1]Xindong Wu,Vipin Kumar.数据挖掘十大算法[M].北京:清华大学出版社.2014:19-30.

时间: 2024-10-03 22:29:42

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