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

聚类是一种无监督的学习,它将相似的对象归到同一个簇中。

这篇文章介绍一种称为K-均值的聚类算法,之所以称为K-均值是因为它可以发现k个不同的簇,且每个簇的中心采用簇中所含值的均值计算而成。

聚类分析视图将相似对象归入同一簇,将不相似对象归到不同簇。

下面用Python简单演示该算法实现的原理:

函数loadDataSet先将文本文件导入到一个列表中,并添加到dataSet中,返回的结果即为需加载的训练数据。

def loadDataSet(fileName):
    dataMat = []
    fr = open(fileName)
    for line in fr.readlines():
        curLine = line.strip().split(‘\t‘)
        fltLine = map(float,curLine)
        dataMat.append(list(fltLine))
    return dataMat

函数distEclud用于计算两个向量的距离:

def distEclud(vecA, vecB):
    return sqrt(sum(power(vecA - vecB, 2)))   # 计算距离

def randCent(dataSet,k):
    n = shape(dataSet)[1]   # 列数
    centroids = mat(zeros((k,n)))  # k为簇质心的数量 n为每个点对应的坐标的数量
    for j in range(n):
        minJ = min(dataSet[:,j]) # 每列的最小值
        rangeJ = float(max(dataSet[:,j]) - minJ)  # 变化区间
        centroids[:,j] = minJ + rangeJ * random.rand(k,1)  # 生成坐标
    return centroids

函数randCent有两个参数,其中k为用户指定的质心的数量(即最后分成的类的个数),该函数的作用是为给定的数据集dataSet构建一个包含k个随机质心的集合(centroids)。

上面三个为辅助函数,下面为完整的K-均值算法:

def kMeans(dataSet,k,disMeas = distEclud, createCent = randCent):
    m = shape(dataSet)[0]  # 训练数据集的数量
    clusterAssent = mat(zeros((m,2)))  # 用于保存每个点对应的质心
    centroids = createCent(dataSet,k)  #初始化质心并保存
    clusterChanged = True
    while clusterChanged:
        clusterChanged = False
        for i in range(m):   # 遍历所有数据点  计算每一个数据点到每个质心的距离
            minDist = inf
            minIndex = -1
            for j in range(k):   # 遍历所有的质心点
                distJI = disMeas(centroids[j,:], dataSet[i ,:])
                if distJI < minDist:
                    minDist = distJI
                    minIndex = j
            if clusterAssent[i,0] != minIndex:
                clusterChanged = True    # 任何一个点对应的质心发生变化需要重新遍历计算
            clusterAssent[i,:] = minIndex,minDist ** 2
        print(centroids)
        for cent in range(k):   # 更新质心的位置
            ptsInClust = dataSet[nonzero(clusterAssent[:,0].A == cent)[0]]
            centroids[cent : ] = mean(ptsInClust, axis= 0)
    return centroids,clusterAssent

思路大概为:

  • 遍历所有训练数据点(m个数据点)

    • 对所有质心(k个质心)

      • 计算该数据点与质心之间的距离,并保存该数据点最近的质心
    • 对比之前保存的该数据点的质心(即该数据点所属的簇,保存在clusterAssent中),若发生更改,则证明未收敛,结束后需要从头开始循环
  • 对于每一个簇,计算簇中所有点的均值作为质心。

K-均值算法有时候会出现聚类效果较差,收敛到了局部最小值,而非全局最小值。一种用于度量聚类效果的指标是SSE(Sum of Squared Error,误差平方和),SSE越小表示数据点越接近于它们的质心,聚类效果也越好。因此,要对聚类的结果进行改进的方法可以将具有最大SSE值的簇划分为两个簇,同时为了保持簇总数不变,可以将某两个簇进行合并。

时间: 2024-10-09 02:20:53

K-均值(K-means)聚类算法的相关文章

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

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

k均值聚类

目录 一.k均值简介 二.应用简介 三.算法 四.选择合适的K 五.具体实例 一.k均值简介 K均值聚类是一种无监督学习,对未标记的数据(即没有定义类别或组的数据)进行分类. 该算法的目标是在数据中找到由变量K标记的组.该算法迭代地工作基于所提供的特征,将每个数据点分配给K个组中的一个. 基于特征相似性对数据点进行聚类. K均值聚类算法的结果是: 1.K簇的质心,可用于标记新数据 2.训练数据的标签(每个数据点分配给一个集群) 二.应用简介 K均值聚类算法用于查找未在数据中明确标记的组.这可用于

K均值聚类--利用k-means算法分析NBA近四年球队实力

分类作为一种监督学习方法,要求必须事先明确知道各个类别的信息,并且断言所有待分类项都有一个类别与之对应.但是很多时候上述条件得不到满足,尤其是在处理海量数据的时候,如果通过预处理使得数据满足分类算法的要求,则代价非常大,这时候可以考虑使用聚类算法.聚类属于无监督学习,相比于分类,聚类不依赖预定义的类和类标号的训练实例.本文首先介绍聚类的基础--距离与相异度,然后介绍一种常见的聚类算法--k-means算法,并利用k-means算法分析NBA近四年球队实力.因为本人比较喜欢观看NBA比赛,所以用这

k-means均值聚类算法(转)

4.1.摘要 在前面的文章中,介绍了三种常见的分类算法.分类作为一种监督学习方法,要求必须事先明确知道各个类别的信息,并且断言所有待分类项都有一个类别与之对应.但是很多时候上述条件得不到满足,尤其是在处理海量数据的时候,如果通过预处理使得数据满足分类算法的要求,则代价非常大,这时候可以考虑使用聚类算法.聚类属于无监督学习,相比于分类,聚类不依赖预定义的类和类标号的训练实例.本文首先介绍聚类的基础——距离与相异度,然后介绍一种常见的聚类算法——k均值和k中心点聚类,最后会举一个实例:应用聚类方法试

机器学习六--K-means聚类算法

想想常见的分类算法有决策树.Logistic回归.SVM.贝叶斯等.分类作为一种监督学习方法,要求必须事先明确知道各个类别的信息,并且断言所有待分类项都有一个类别与之对应.但是很多时候上述条件得不到满足,尤其是在处理海量数据的时候,如果通过预处理使得数据满足分类算法的要求,则代价非常大,想想如果给你50个G这么大的文本,里面已经分好词,这时需要将其按照给定的几十个关键字进行划分归类,监督学习的方法确实有点困难,而且也不划算,前期工作做得太多了. 这时候可以考虑使用聚类算法,我们只需要知道这几十个

K-Mean聚类算法

K-Means 是发现给定数据集的 K 个簇的聚类算法, 之所以称之为 K-均值 是因为它可以发现 K 个不同的簇, 且每个簇的中心采用簇中所含值的均值计算而成. 优缺点: 优点: 属于无监督学习,无须准备训练集 原理简单,实现起来较为容易 结果可解释性较好 缺点: 需手动设置k值. 在算法开始预测之前,我们需要手动设置k值,即估计数据大概的类别个数,不合理的k值会使结果缺乏解释性 可能收敛到局部最小值, 在大规模数据集上收敛较慢 对于异常点.离群点敏感 流程伪代码: 创建 k 个点作为起始质心

机器学习--k均值聚类(k-means)算法

一.基本原理 分类是指分类器根据已标注类别的训练集,通过训练可以对未知类别的样本进行分类.分类被称为监督学习.如果训练集的样本没有标注类别,那么就需要用到聚类.聚类是把相似的样本聚成一类,这种相似性通常以距离来度量.聚类被称为无监督学习. 聚类是指根据"物以类聚"的原理,将本身没有类别的样本聚集成不同的组,这样的一组数据对象的集合叫做簇,并且对每一个这样的簇进行描述的过程.它的目的是使得属于同一个簇的样本之间应该彼此相似,而不同簇的样本应该足够不相似.与分类规则不同,进行聚类前并不知道

聚类算法:K均值、凝聚层次聚类和DBSCAN

聚类分析就仅根据在数据中发现的描述对象及其关系的信息,将数据对象分组(簇).其目标是,组内的对象相互之间是相似的,而不同组中的对象是不同的.组内相似性越大,组间差别越大,聚类就越好. 先介绍下聚类的不同类型,通常有以下几种: (1)层次的与划分的:如果允许簇具有子簇,则我们得到一个层次聚类.层次聚类是嵌套簇的集族,组织成一棵树.划分聚类简单地将数据对象划分成不重叠的子集(簇),使得每个数据对象恰在一个子集中. (2)互斥的.重叠的与模糊的:互斥的指每个对象都指派到单个簇.重叠的或是模糊聚类用来反

聚类算法: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均值聚类算法(附MATLAB版源代码)

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