K-Mean聚类算法

K-Means 是发现给定数据集的 K 个簇的聚类算法, 之所以称之为 K-均值 是因为它可以发现 K 个不同的簇, 且每个簇的中心采用簇中所含值的均值计算而成.

优缺点:

优点:
属于无监督学习,无须准备训练集
原理简单,实现起来较为容易
结果可解释性较好

缺点:
需手动设置k值。 在算法开始预测之前,我们需要手动设置k值,即估计数据大概的类别个数,不合理的k值会使结果缺乏解释性
可能收敛到局部最小值, 在大规模数据集上收敛较慢
对于异常点、离群点敏感

流程伪代码:

创建 k 个点作为起始质心(通常是随机选择)
当任意一个点的簇分配结果发生改变时(不改变时算法结束)
    对数据集中的每个数据点
      对每个质心
        计算质心与数据点之间的距离
        将数据点分配到距其最近的簇
    对每一个簇, 计算簇中所有点的均值并将均值作为质心            

二分K-Mean聚类算法流程:

将所有点看成一个簇
当簇数目小于 k 时
    对于每一个簇
        计算总误差
        在给定的簇上面进行 KMeans 聚类(k=2)
        计算将该簇一分为二之后的总误差
    选择使得误差最小的那个簇进行划分操作            

核心代码:

 1 def kMeans(dataMat, k, distMeas=distEclud, createCent=randCent):
 2     ‘‘‘
 3     创建K个质心,然后将每个店分配到最近的质心,再重新计算质心。
 4     这个过程重复数次,直到数据点的簇分配结果不再改变为止
 5     :param dataMat: 数据集
 6     :param k: 簇的数目
 7     :param distMeans: 计算距离
 8     :param createCent: 创建初始质心
 9     :return:
10     ‘‘‘
11     # 获取样本数和特征数
12     m, n = shape(dataMat)
13     # 初始化一个矩阵来存储每个点的簇分配结果
14     # clusterAssment包含两个列:一列记录簇索引值,第二列存储误差(误差是指当前点到簇质心的距离,后面会使用该误差来评价聚类的效果)
15     clusterAssment = mat(zeros((m, 2)))
16     # 创建质心,随机K个质心
17     centroids = createCent(dataMat, k)
18     # 初始化标志变量,用于判断迭代是否继续,如果True,则继续迭代
19     clusterChanged = True
20     while clusterChanged:
21         clusterChanged = False
22         # 遍历所有数据找到距离每个点最近的质心,
23         # 可以通过对每个点遍历所有质心并计算点到每个质心的距离来完成
24         for i in range(m):
25             minDist = inf
26             minIndex = -1
27             for j in range(k):
28                 # 计算数据点到质心的距离
29                 # 计算距离是使用distMeas参数给出的距离公式,默认距离函数是distEclud
30                 distJI = distMeas(centroids[j, :], dataMat[i, :])
31                 # 如果距离比minDist(最小距离)还小,更新minDist(最小距离)和最小质心的index(索引)
32                 if distJI < minDist:
33                     minDist = distJI
34                     minIndex = j
35             # 如果任一点的簇分配结果发生改变,则更新clusterChanged标志
36             if clusterAssment[i, 0] != minIndex: clusterChanged = True
37             # 更新簇分配结果为最小质心的index(索引),minDist(最小距离)的平方
38             clusterAssment[i, :] = minIndex, minDist ** 2
39         # print(centroids)
40         # 遍历所有质心并更新它们的取值
41         for cent in range(k):
42             # 通过数据过滤来获得给定簇的所有点
43             ptsInClust = dataMat[nonzero(clusterAssment[:, 0].A == cent)[0]]
44             # 计算所有点的均值,axis=0表示沿矩阵的列方向进行均值计算
45             centroids[cent, :] = mean(ptsInClust, axis=0)
46     # 返回所有的类质心与点分配结果
47     return centroids, clusterAssment

原文地址:https://www.cnblogs.com/eastblue/p/11634369.html

时间: 2024-08-01 15:52:34

K-Mean聚类算法的相关文章

k-均值聚类算法;二分k均值聚类算法

根据<机器学习实战>一书第十章学习k均值聚类算法和二分k均值聚类算法,自己把代码边敲边理解了一下,修正了一些原书中代码的细微差错.目前代码有时会出现如下4种报错信息,这有待继续探究和完善. 报错信息: Warning (from warnings module): File "F:\Python2.7.6\lib\site-packages\numpy\core\_methods.py", line 55 warnings.warn("Mean of empty

机器学习实战笔记-利用K均值聚类算法对未标注数据分组

聚类是一种无监督的学习,它将相似的对象归到同一个簇中.它有点像全自动分类.聚类方法几乎可以应用于所有对象,簇内的对象越相似,聚类的效果越好 簇识别给出聚类结果的含义.假定有一些数据,现在将相似数据归到一起,簇识别会告诉我们这些簇到底都是些什么.聚类与分类的最大不同在于,分类的目标事先巳知,而聚类则不一样.因为其产生的结果与分类相同,而只是类别没有预先定义,聚类有时也被称为无监督分类(unsupervised classification ). 聚类分析试图将相似对象归人同一簇,将不相似对象归到不

K均值聚类算法

k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心.聚类中心以及分配给它们的对象就代表一个聚类.每分配一个样本,聚类的聚类中心会根据聚类中现有的对象被重新计算.这个过程将不断重复直到满足某个终止条件.终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小.

基于改进人工蜂群算法的K均值聚类算法(附MATLAB版源代码)

其实一直以来也没有准备在园子里发这样的文章,相对来说,算法改进放在园子里还是会稍稍显得格格不入.但是最近邮箱收到的几封邮件让我觉得有必要通过我的博客把过去做过的东西分享出去更给更多需要的人.从论文刊登后,陆陆续续收到本科生.研究生还有博士生的来信和短信微信等,表示了对论文的兴趣以及寻求算法的效果和实现细节,所以,我也就通过邮件或者短信微信来回信,但是有时候也会忘记回复. 另外一个原因也是时间久了,我对于论文以及改进的算法的记忆也越来越模糊,或者那天无意间把代码遗失在哪个角落,真的很难想象我还会全

K均值聚类算法的MATLAB实现

1.K-均值聚类法的概述 之前在参加数学建模的过程中用到过这种聚类方法,但是当时只是简单知道了在matlab中如何调用工具箱进行聚类,并不是特别清楚它的原理.最近因为在学模式识别,又重新接触了这种聚类算法,所以便仔细地研究了一下它的原理.弄懂了之后就自己手工用matlab编程实现了,最后的结果还不错,嘿嘿~~~ 简单来说,K-均值聚类就是在给定了一组样本(x1, x2, ...xn) (xi, i = 1, 2, ... n均是向量) 之后,假设要将其聚为 m(<n) 类,可以按照如下的步骤实现

聚类之K均值聚类和EM算法

这篇博客整理K均值聚类的内容,包括: 1.K均值聚类的原理: 2.初始类中心的选择和类别数K的确定: 3.K均值聚类和EM算法.高斯混合模型的关系. 一.K均值聚类的原理 K均值聚类(K-means)是一种基于中心的聚类算法,通过迭代,将样本分到K个类中,使得每个样本与其所属类的中心或均值的距离之和最小. 1.定义损失函数 假设我们有一个数据集{x1, x2,..., xN},每个样本的特征维度是m维,我们的目标是将数据集划分为K个类别.假定K的值已经给定,那么第k个类别的中心定义为μk,k=1

《机器学习实战》之K-均值聚类算法的python实现

<机器学习实战>之K-均值聚类算法的python实现 最近的项目是关于"基于数据挖掘的电路故障分析",项目基本上都是师兄们在做,我只是在研究关于项目中用到的如下几种算法:二分均值聚类.最近邻分类.基于规则的分类器以及支持向量机.基于项目的保密性(其实也没有什么保密的,但是怕以后老板看到我写的这篇博文,所以,你懂的),这里就不介绍"基于数据挖掘的电路故障分析"的思路了. 废话不多说了,开始正题哈. 基本K-均值聚类算法 基本K均值算法的基本思路为:首先选择

机器学习实战5:k-means聚类:二分k均值聚类+地理位置聚簇实例

k-均值聚类是非监督学习的一种,输入必须指定聚簇中心个数k.k均值是基于相似度的聚类,为没有标签的一簇实例分为一类. 一 经典的k-均值聚类 思路: 1 随机创建k个质心(k必须指定,二维的很容易确定,可视化数据分布,直观确定即可): 2 遍历数据集的每个实例,计算其到每个质心的相似度,这里也就是欧氏距离:把每个实例都分配到距离最近的质心的那一类,用一个二维数组数据结构保存,第一列是最近质心序号,第二列是距离: 3 根据二维数组保存的数据,重新计算每个聚簇新的质心: 4 迭代2 和 3,直到收敛

FCM聚类算法介绍

FCM算法是一种基于划分的聚类算法,它的思想就是使得被划分到同一簇的对象之间相似度最大,而不同簇之间的相似度最小.模糊C均值算法是普通C均值算法的改进,普通C均值算法对于数据的划分是硬性的,而FCM则是一种柔性的模糊划分.在介绍FCM具体算法之前我们先介绍一些模糊集合的基本知识. 1 模糊集基本知识 首先说明隶属度函数的概念.隶属度函数是表示一个对象x隶属于集合A的程度的函数,通常记做μA(x),其自变量范围是所有可能属于集合A的对象(即集合A所在空间中的所有点),取值范围是[0,1],即0<=

scikit-learn学习之K-means聚类算法与 Mini Batch K-Means算法

====================================================================== 本系列博客主要参考 Scikit-Learn 官方网站上的每一个算法进行,并进行部分翻译,如有错误,请大家指正 转载请注明出处 ====================================================================== K-means算法分析与Python代码实现请参考之前的两篇博客: <机器学习实战>k