K-Means聚类算法及其python实现(已附上代码至本博客)

这篇具有很好参考价值的文章主要介绍了K-Means聚类算法及其python实现(已附上代码至本博客)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


觉得有用的,一腚要先点赞后收藏!!!气死人了,40多个收藏0点赞!!

一、算法公式讲解

对于kmeans聚类算法python代码,机器学习,聚类,算法,kmeans
n代表了x有n维,x上标j表示第j维的特征,下标i表示该向量是第i个样本
kmeans聚类算法python代码,机器学习,聚类,算法,kmeans
簇中心坐标为:(当然,这也是重新计算簇中心坐标的方法!!)
向量 u i = ( u i ( 1 ) , u i ( 2 ) , ⋅ ⋅ ⋅ , u i ( j ) , ⋅ ⋅ ⋅ , u i ( n ) ) u_i=(u_i^{(1)} ,u_i^{(2)}, ···, u_i^{(j)},···,u_i^{(n)}) ui=(ui(1),ui(2),⋅⋅⋅,ui(j),⋅⋅⋅,ui(n)),然后标量
kmeans聚类算法python代码,机器学习,聚类,算法,kmeans
其中一个维度,这里比如说是第2个样本的第1维特征 u 2 1 u_{2}^{1} u21,我就到这个第二个簇里面把这个簇所有点第一特征求和得到sum,然后把总和sum除以这个簇的大小| C 2 C_2{} C2|(这个簇里面点的个数),然后就得到第2簇的簇中心的第1维的特征(坐标)
比如第一簇的簇中心坐标:

u 1 = ( u 1 ( 1 ) , u 1 ( 2 ) , u 1 ( 3 ) ) u_1=(u_1^{(1)} ,u_1^{(2)},u_1^{(3)}) u1=(u1(1),u1(2),u1(3))

属于第一簇的坐标有
x 2 = ( 1 , 2 , 3 ) x_2=(1 ,2,3) x2=(1,2,3)

x 3 = ( 4 , 5 , 6 ) x_3=(4 ,5,6) x3=(4,5,6)

x 4 = ( 7 , 8 , 9 ) x_4=(7 ,8,9) x4=(7,8,9)

u 1 = ( 1 + 4 + 7 3 , 2 + 5 + 8 3 , 3 + 6 + 9 3 ) = ( 4 , 5 , 6 ) u_1=(\frac{1+4+7}{3} ,\frac{2+5+8}{3},\frac{3+6+9}{3} )=(4,5,6) u1=(31+4+7,32+5+8,33+6+9)=(4,5,6)

kmeans聚类算法python代码,机器学习,聚类,算法,kmeans

二、算法流程

kmeans聚类算法python代码,机器学习,聚类,算法,kmeans
K-means算法首先随机分布簇中心,然后计算簇中心并重新分簇为一个周期进行迭代,直到簇稳定为止,

三、算法实现代码

有Kmeans.py和kmeansSamples.txt两个文件,kmeansSamples.txt记录的是所有点的坐标,Kmeans.py描述算法实现
Kmeans.py文件如下

# -*- coding: utf-8 -*-


import numpy as np
import matplotlib.pyplot as plt

def L2(vecXi, vecXj):
    '''
    计算欧氏距离
    para vecXi:点坐标,向量
    para vecXj:点坐标,向量
    retrurn: 两点之间的欧氏距离
    '''
    return np.sqrt(np.sum(np.power(vecXi - vecXj, 2)))

def kMeans(S, k, distMeas=L2):
    '''
    K均值聚类
    para S:样本集,多维数组
    para k:簇个数
    para distMeas:距离度量函数,默认为欧氏距离计算函数
    return sampleTag:一维数组,存储样本对应的簇标记
    return clusterCents:一维数组,各簇中心
    retrun SSE:误差平方和
    '''
    print('k = ' , k)
    m = np.shape(S)[0] # 样本总数
    sampleTag = np.zeros(m)
    print('sampleTag.shape=',sampleTag)
    # 随机产生k个初始簇中心
    n = np.shape(S)[1] # 样本向量的特征数
    print('n = ' , n)
    clusterCents = np.mat([[-1.93964824,2.33260803],[7.79822795,6.72621783],[10.64183154,0.20088133]])
    #clusterCents = np.mat(np.zeros((k,n)))
    #for j in range(n):
    #    minJ = min(S[:,j]) 
    #    rangeJ = float(max(S[:,j]) - minJ)
    #    clusterCents[:,j] = np.mat(minJ + rangeJ * np.random.rand(k,1))
        
    sampleTagChanged = True
    SSE = 0.0
    while sampleTagChanged: # 如果没有点发生分配结果改变,则结束
        sampleTagChanged = False
        SSE = 0.0
        
        # 计算每个样本点到各簇中心的距离
        # m是样本总数
        for i in range(m):
            minD = np.inf
            minIndex = -1
            # k是簇中心个数
            for j in range(k):
                # S样本集,clusterCents样本中心点
                d = distMeas(clusterCents[j,:],S[i,:])
                if d < minD:
                    minD = d
                    minIndex = j
            if sampleTag[i] != minIndex: 
                sampleTagChanged = True
            sampleTag[i] = minIndex
            SSE += minD**2
        print(clusterCents)
        plt.scatter(clusterCents[:,0].tolist(),clusterCents[:,1].tolist(),c='r',marker='^',linewidths=7)
        plt.scatter(S[:,0],S[:,1],c=sampleTag,linewidths=np.power(sampleTag+0.5, 2))
        plt.show()
        print(SSE)
        
        # 重新计算簇中心
        for i in range(k):
            ClustI = S[np.nonzero(sampleTag[:]==i)[0]]
            clusterCents[i,:] = np.mean(ClustI, axis=0)
    return clusterCents, sampleTag, SSE

if __name__=='__main__':
    samples = np.loadtxt("kmeansSamples.txt")
    clusterCents, sampleTag, SSE = kMeans(samples, 3)
    #plt.scatter(clusterCents[:,0].tolist(),clusterCents[:,1].tolist(),c='r',marker='^')
    #plt.scatter(samples[:,0],samples[:,1],c=sampleTag,linewidths=np.power(sampleTag+0.5, 2))
    plt.show()
    print(clusterCents)
    print(SSE)

kmeansSamples.txt文件如下

8.764743691132109049e+00 1.497536962729086341e+01
4.545778445909218313e+00 7.394332431706460262e+00
5.661841772908352333e+00 1.045327224311696668e+01
6.020055532521467967e+00 1.860759073162559929e+01
1.256729723000295529e+01 5.506569916803323750e+00
4.186942275051188211e+00 1.402615035721461290e+01
5.726706075832996845e+00 8.375613974148174989e+00
4.099899279500291094e+00 1.444273323355928795e+01
2.257178930021525254e+00 1.977895587652345855e+00
4.669135451288612515e+00 7.717803834787531070e-01
8.121947597697801058e+00 7.976212807755792555e-01
7.972277764807800260e-02 -1.938666197338206221e+00
8.370047062442882435e+00 1.077781799178707622e+01
6.680973199869320922e+00 1.553118858170866545e+01
5.991946943553537963e+00 1.657732863976965021e+01
5.641990155271871643e+00 1.554671013661827672e+01
-2.925147643580102041e+00 1.108844569740028163e+01
4.996949605297930752e+00 1.986732057663068707e+00
3.866584099986317025e+00 -1.752825909916766900e+00
2.626427441224858939e+00 2.208897582166075324e+01
5.656225833870900388e+00 1.477736974879376675e+01
-3.388227926726261607e-01 5.569311423852095544e+00
1.093574481611491223e+01 1.124487205516641275e+01
4.650235760178413003e+00 1.278869502885029341e+01
8.498485127403823114e+00 9.787697108749913610e+00
7.530467091751554598e+00 8.502325665434069535e+00
6.171183705302398792e+00 2.174394049079376856e+01
-9.333949569013078040e-01 1.594142490265068712e+00
-6.377004909329702542e+00 3.463894089865578341e+00
7.135980906743346175e+00 1.417794597480970609e+01

四、代码结果分析

第一次迭代,簇中心分布不太合理(红色三角形代表簇中心)
kmeans聚类算法python代码,机器学习,聚类,算法,kmeans
第二次迭代,簇中心重新计算,因此簇中心分布比第一次更合理
kmeans聚类算法python代码,机器学习,聚类,算法,kmeans
第3次迭代
kmeans聚类算法python代码,机器学习,聚类,算法,kmeans
第四次迭代
kmeans聚类算法python代码,机器学习,聚类,算法,kmeans

五、K-Means库函数

KMeans(n_clusters=8, *, init=‘k-means++’, n_init=‘k-means++’, n_init=10,max_iter=300, tol=0.0001, verbose=0, random_state=None, copy_x=True, algorithm=‘auto’)
链接🔗:👉Sklearn关于K-Means的API介绍
相关输人参数和返回值,在网站上有详细介绍,建议 直接看原版文档,这里仅介绍几个重要参数,其他内容不再赘述。

  • init 参数提供了三种产生筷中心的方法:“K-means++”指定产生较大间距的筷中心(2.1.4节);“random”指定随机产生簇中心;由用户通过一个ndarrav 数组指定初始筷中心。
  • n_init 参数指定了算法运行次数,它在不指定初始筷中心时,通过多次运行算法,最终选择最好的结果作为输出。
  • max iter 参数指定了一次运行中的最大迭代次数。在大规模数据集中,算法往往要耗费大量的时间,可通过指定迭代次数来折中耗时和效果。
  • tol 参数指定了算法收敛的國值。在大规模数据集中,算法往往难以完全收敛,即达到连续两次相同的分筷需要耗费很长时间,可通过指定國值来折中耗时和最优目标。
  • algorithm 参数指定了是否采用elkan k-means 算法来简化距离计算。该算法比经典的k-means 算法在迭代速度方面有很大的提高。但该算法不适用于稀疏的样本数据。值“full”指定采用经典k-means 算法。值“ellkan”指定采用 elkan k-means 算法。值“auto”自动选择,在稠密数据时采用 elkan k-means 算法,在稀疏数据时采用经典k-means 算法。

六、K-Means算法时间复杂度

设样本总数为 m,分簇数为k。一次迭代过程中,以样本与簇中心的距离计算为基本运算,需要 m × k m \times k m×k。如果迭代次数为t(,则算法的时间复杂度是 O( m × k × t m \times k \times t m×k×t)。
算法运行不需要增长额外辅助空问,以样本和簇中心存储空间为基本空间,空间复杂度是0( m + k m+k m+k)。
由于m,k,t可认为是常量,因此算法的时间复杂度和空间复杂度都可认为是线性的 O ( N ) O(N) O(N) .文章来源地址https://www.toymoban.com/news/detail-719139.html

到了这里,关于K-Means聚类算法及其python实现(已附上代码至本博客)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (python实现)一篇文章教会你k-means聚类算法(包括最优聚类数目k的确定)

    Kmeans算法中,K值所决定的是在该聚类算法中,所要分配聚类的簇的多少。Kmeans算法对初始值是⽐较敏感的,对于同样的k值,选取的点不同,会影响算法的聚类效果和迭代的次数。本文通过计算原始数据中的:手肘法、轮廓系数、CH值和DB值,四种指标来衡量K-means的最佳聚类数

    2024年02月05日
    浏览(48)
  • 【聚类算法】带你轻松搞懂K-means聚类(含代码以及详细解释)

    聚类是一个将数据集中 在某些方面相似的数据成员 进行分类组织的过程,聚类就是一种发现这种内在结构的技术,聚类技术经常被称为 无监督学习 。 k均值聚类是最著名的划分聚类算法,由于简洁和效率使得他成为所有聚类算法中最广泛使用的。给定一个数据点集合和需要

    2024年02月01日
    浏览(25)
  • K-means聚类算法原理及实现

    1.1概念 聚类分析,也称为分割分析或分类分析,可将样本数据分成一个个组(即簇)。同一簇中的对象是相似的,不同簇中的对象则明显不同。 Statistics and Machine Learning Toolbox™ 提供了几种聚类方法和相似性度量(也称为距离度量)来创建簇。此外,簇计算可以按照不同的计

    2024年03月18日
    浏览(33)
  • K-means++聚类算法(matlab实现)

    K-means++算法:K-means++算法是K-means算法的改进版,其在选择初始质心时采用了一种更加聪明的方法,能够有效地避免局部最优解。具体来说,K-means++算法的初始质心是根据距离数据点最远的原则来选择的,这样可以保证初始质心的分布更加广泛,从而使得算法更容易找到全局最

    2024年02月07日
    浏览(84)
  • Python实现简单k-means聚类

    目录 1.导入原始数据集  2.首次计算中心点 3.进行迭代循环,不断优化样本中心点和聚类结果 4.聚类可视化 通过手动书写k-means聚类算法的逻辑实现聚类(而非使用python内置的sklearn) 不了解k-means聚类算法的话可以先去了解以下这种算法的原理,下面就直接进入正题啦~ 首先我

    2024年02月03日
    浏览(31)
  • K-means聚类算法原理、步骤、评价指标和实现

    1、聚类 聚类与分类不同,聚类分析分通过分析大量含有一定规律但杂乱数据,得到数据间内在的逻辑,将杂乱的数据按照所得的数据规律划分成不同的种类。K-measn、DBSCAN和层次是当前广泛使用的三种聚类方法。以下对三种方法进行分析,选择适合的聚类方法。 方法 K-means

    2024年02月07日
    浏览(45)
  • 计算机视觉:聚类算法(K-Means)实现图像分割

    什么是K-means聚类? K-means聚类是一种无监督学习算法,用于将一组数据划分为K个不同的类别或簇。它基于数据点之间的相似性度量,将数据点分配到最接近的聚类中心。K-means算法的目标是最小化数据点与其所属聚类中心之间的平方距离和。 K-means聚类在图像分割中的应用 在

    2024年02月02日
    浏览(26)
  • python k-means聚类算法 物流分配预测实战(超详细,附源码)

    数据集和地图可以点赞关注收藏后评论区留下QQ邮箱或者私信博主要 聚类是一类机器学习基础算法的总称。 聚类的核心计算过程是将数据对象集合按相似程度划分成多个类,划分得到的每个类称为聚类的簇 聚类不等于分类,其主要区别在于聚类所面对的目标类别是未知的

    2024年02月02日
    浏览(53)
  • 数学建模--K-means聚类的Python实现

    目录 1.算法流程简介 2.1.K-mean算法核心代码 2.2.K-mean算法效果展示 3.1.肘部法算法核心代码  3.2.肘部法算法效果展示   

    2024年02月09日
    浏览(26)
  • Python | 实现 K-means 聚类——多维数据聚类散点图绘制

    客观吐槽:CSDN的富文本编辑器真是超级无敌难用 。首先要吐槽一下CSDN的富文本编辑器,好难用,好难用,好难用,好难用好难用,好难用,好难用,好难用!!!!!!!!!!!!!!!!!!前边的开头文字编辑了三四次,每次都是不小心按了ctrl+z,就完全消失了。

    2024年02月03日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包