• 数学建模--K-means聚类的Python实现


    目录

    1.算法流程简介

    2.1.K-mean算法核心代码

    2.2.K-mean算法效果展示

    3.1.肘部法算法核心代码 

    3.2.肘部法算法效果展示 


    1.算法流程简介

    1. #k-means聚类方法
    2. """
    3. k-means聚类算法流程:
    4. 1.K-mean均值聚类的方法就是先随机选择k个对象作为初始聚类中心.
    5. 2.这个时候你去计算剩余的对象于哪一个聚类中心的距离是最小的,优先分配给最近的聚类中心.
    6. 3.分配后,原先的聚类中心和分配给它们的对象就又会被看作一个新聚类.
    7. 4.每次进行分配之后,聚类中心又会被重新计算一次
    8. 5.直到满足某些终止条件为止:1.没有聚类中心被分配 2.达到了局部的聚类均方误差最小
    9. """

    2.1.K-mean算法核心代码

    1. #%%
    2. #1.当k已知且k=4时,我们执行k-means算法
    3. import numpy as np
    4. import matplotlib.pyplot as plt
    5. from sklearn.cluster import KMeans
    6. plt.rcParams['font.family'] = ['sans-serif']
    7. plt.rcParams['font.sans-serif'] = ['SimHei'] #散点图标签可以显示中文
    8. #人为大致创建一个比较明显的聚类样本
    9. c1x=np.random.uniform(0.5,1.5,(1,200))
    10. c1y=np.random.uniform(0.5,1.5,(1,200))
    11. c2x=np.random.uniform(3.5,4.5,(1,200))
    12. c2y=np.random.uniform(3.5,4.5,(1,200))
    13. c3x=np.random.uniform(2.5,3.5,(1,200))
    14. c3y=np.random.uniform(2.5,3.5,(1,200))
    15. c4x=np.random.uniform(1.5,2.5,(1,200))
    16. c4y=np.random.uniform(1.5,2.5,(1,200))
    17. x=np.hstack((c1x,c2x,c3x,c4x))
    18. y=np.hstack((c2y,c2y,c3y,c4y))
    19. X=np.vstack((x,y)).T
    20. #n_cluster设置成4(可以修改)
    21. kemans=KMeans(n_clusters=4)
    22. result=kemans.fit_predict(X) #训练及预测
    23. for i in range(len(result)):
    24. print("第{}个点:({})的分类结果为:{}".format(i+1,X[i],result[i]))
    25. x=[i[0] for i in X]
    26. y=[i[1] for i in X]
    27. plt.scatter(x,y,c=result,marker='*',cmap='rainbow',s=9)
    28. plt.xlabel('x')
    29. plt.ylabel('y')
    30. plt.title("K-means聚类效果图",color='black')
    31. plt.savefig('C:\\Users\\Zeng Zhong Yan\\Desktop\\K-means聚类效果图.png', dpi=500, bbox_inches='tight')
    32. plt.show()

    2.2.K-mean算法效果展示

    3.1.肘部法算法核心代码 

    1. #%%
    2. #2.如果k未知的情况下,利用肘部法来求出最优的k
    3. """
    4. 肘部法也非常简答,就是假设k=1-9,分别求出k=1-9之间的平均离差.
    5. 绘图观察最陡峭/斜率变化最大的点就是最为合适的k值
    6. """
    7. import matplotlib.pyplot as plt
    8. from sklearn.cluster import KMeans
    9. from scipy.spatial.distance import cdist
    10. plt.rcParams['font.family'] = ['sans-serif']
    11. plt.rcParams['font.sans-serif'] = ['SimHei'] #使折线图显示中文
    12. K=range(1,10)
    13. meanDispersions=[]
    14. for k in K:
    15. #假设n_clusters=k,进行聚类后
    16. kemans=KMeans(n_clusters=k)
    17. kemans.fit(X)
    18. #计算平均离差
    19. m_Disp=sum(np.min(cdist(X,kemans.cluster_centers_,'euclidean'),axis=1))/X.shape[0]
    20. meanDispersions.append(m_Disp)
    21. result=[]
    22. for i in range(len(meanDispersions)-1):
    23. print("从第{}个点到第{}个点的斜率绝对值为:{}".format(i+1,i+2,abs(meanDispersions[i+1]-meanDispersions[i])))
    24. result.append(abs(meanDispersions[i+1]-meanDispersions[i]))
    25. #求解斜率最大值
    26. result_max=max(result)
    27. print("最大的斜率的绝对值为{}".format(result_max))
    28. print("综上所述最为合适的k值为{}".format(result.index(result_max)+2))
    29. plt.plot(K,meanDispersions,'bx-',label='meanDispersions',color='red')
    30. plt.xlabel('k')
    31. plt.ylabel('平均离差')
    32. plt.title('肘部法选择K值示意图')
    33. plt.legend()
    34. plt.savefig('C:\\Users\\Zeng Zhong Yan\\Desktop\\肘部法求K值.png', dpi=500, bbox_inches='tight')
    35. plt.show()

    3.2.肘部法算法效果展示 

     

  • 相关阅读:
    时序数据库选型
    Vue3使用Swiper8.x
    python-持久化存储文件操作
    阿里巴巴的“双11”高并发秒杀终极版教程(Java语言设计)
    股票如何量化选股?
    WebGPU实现Ray Packet
    Java设计模式之代理模式(静态、动态)
    03-快速上手RabbitMQ的5种消息模型
    【LeetCode】string 类的几道简单题
    Linux常用锁
  • 原文地址:https://blog.csdn.net/m0_71819746/article/details/132704989