• 基于划分的聚类分析——K-means(机器学习)


    目录

    一、实验内容

    二、实验过程

    1、算法思想

    2、算法原理

    3、算法分析

    三、源程序代码

    四、运行结果及分析

    五、实验总结 


    一、实验内容


    1. 熟知聚类分析的概念、分类方法,理解良好聚类分析的特征。
    2. 掌握聚类分析的度量指标;
    3. 掌握基于划分的聚类方法的基本概念;
    4. 利用k-means算法,实现基于划分的聚类分析。

    二、实验过程


    1、算法思想


            聚类分析是一种典型的无监督学习,用于对未知类别的样本进行划分,将它们按照一定的规则分成若干个分簇,把相似(距离相近)的样本聚在一个类簇中,把不相似的样本分为不同类簇,从而揭示样本之间内在的性质以及相互之间的联系规律。

     

    2、算法原理


            K-means聚类算法,是一种广泛使用的聚类算法,其中k是需要指定的参数,即需要创建的簇的数目,K-means算法中的k个簇的质心可以通过随机的方式获得,但是这些点需要位于数据范围内。

            在算法中,计算每个点到质心得距离,选择距离最小的质心对应的簇作为该数据点的划分,然后再基于该分配过程后更新簇的质心。重复上述过程,直至各个簇的质心不再变化为止。

    3、算法分析


    (1)(随机)选择K个聚类的初始中心。

    (2)依次遍历每n个样本点,求其到K个聚类中心的距离,将样本点归类到距离最小的中心的聚类,如此迭代n次。

    (3)每次迭代过程中,利用均值等方法更新K个聚类的中心点(质心)。

    (4)对K个聚类中心,利用2,3步迭代更新后,如果位置点变化很小(可以设置阈值),则认为达到稳定状态,迭代结束,对不同的聚类块和聚类中心可选择不同的颜色标注。

    三、源程序代码


    1. import matplotlib.pyplot as plt
    2. import numpy as np
    3. #1、先列出一列数组
    4. y=np.array([[2,3],[2,2],[3,4],[1,2],[9,8],[8,8],[8,7],[9,9],[1,5],[2,4],[7.9,7],[8.9,9],[2,1],[7,9],[9,7],[8,8],[9,7],[8,8.5]])
    5. #2,方便画图
    6. x_scatter=[data[0] for data in y]
    7. y_scatter=[data[1] for data in y]
    8. #3,分类 0类,1类
    9. k=[0,1]
    10. #3,先给出两个点
    11. y_center=np.array([[7,7],[9,9]],dtype=np.float64)
    12. y_center_new=np.copy(y_center)
    13. #4,用于判断是否退出
    14. flag = True
    15. #5,用于后者分类
    16. y_res=np.zeros(len(y))
    17. #6,用于判断是否退出
    18. tmp=0
    19. while flag and tmp<10:
    20. tmp+=1
    21. for i in range(len(y)): # y里面的点数
    22. item=y[i] # 二维数组里面的一维数组
    23. d0=(item[0]-y_center[0][0])**2+(item[1]-y_center[0][1])**2
    24. print("d0 is ",d0)
    25. d1=(item[0]-y_center[1][0])**2+(item[1]-y_center[1][1])**2
    26. print("d1 is ",d1)
    27. y_res[i]=0 if d0>d1 else 1 # 测距分类
    28. y_res_like_0=[[i,i] for i in y_res] # 二维列表,里面非0即1
    29. temp_center=y*y_res_like_0 # 乘0得0,乘1得1 ####关键,到后面中心点不会动的原因是,y中分类已经分的固定了,每次计算用都是固定的几个数
    30. y_center_new[0]=np.sum(temp_center,axis=0)/np.sum(y_res) # x坐标求和,y坐标求和,以及得到的y_res(1的求和)
    31. y_res_like_1=[[1-i,1-i] for i in y_res] # 二维列表,里面非0即1
    32. temp_center=y*y_res_like_1 # 乘0得0,乘1得1 ####关键,到后面中心点不会动的原因是,y中分类已经分的固定了,每次计算用都是固定的几个数
    33. y_center_new[1]=np.sum(temp_center,axis=0)/(len(y_res)-np.sum(y_res)) #y_res的总数减去1的总数等于0的总数
    34. if(y_center !=y_center_new).any(): # 判断前后两次中心点是否相同
    35. y_center = y_center_new
    36. else:
    37. flag = False # 相同直接退出
    38. #7画图
    39. plt.scatter(x_scatter,y_scatter,c='blue',marker='.')
    40. plt.scatter([y_center[0][0],y_center[1][0]],[y_center[0][1],y_center[1][1]],c="red",s=100,marker='*')
    41. plt.title("K-means")
    42. plt.show()

    四、运行结果及分析


     

    五、实验总结 


            聚类分析的度量指标用于对聚类结果进行评判,分为内部指标和外部指标两大类。

    外部指标指用事先指定的聚类模型作为参考来评判聚类结果的好坏;

    内部指标是指不借助任何外部参考,只用参与聚类的样本评判聚类结果的好坏。

            聚类的目标是得到较高的簇内相似度和较低的簇间相似度,使得簇间的距离尽可能大,簇内样本与簇中心的距离尽可能小。

  • 相关阅读:
    IDEA2022.1创建maven项目,规避idea2022新建maven项目卡死,无反应问题
    学习python的第7天,她不再开放她的听歌榜单
    洛谷P6672 你的生命已如风中残烛
    【C++程序员必修第一课】C++基础课程-11:C++ 内置数组
    代码质量与安全 | 实践“边写边清理”,您需要做好这两件事:质量配置文件和质量门
    mnist 0,1,2,3,4二值化三分类迭代次数分布规律实验数据总结
    解决Ubuntu 或Debian apt-get IPv6问题:如何设置仅使用IPv4
    第八天:gec6818arm开发板和Ubuntu中安装并且编译移植mysql驱动连接QT执行程序
    全栈开发对于物联网至关重要
    Java知识点--IO流(上)
  • 原文地址:https://blog.csdn.net/qq_50942093/article/details/127270797