美文网首页机器学习
肘方法确定KMeans聚类的最佳K值

肘方法确定KMeans聚类的最佳K值

作者: 大愚若智_大拙若巧 | 来源:发表于2018-08-28 23:20 被阅读192次

    当Kmeans聚类的K没有指定时,可以通过肘部法来估计聚类数量
    K_means参数的最优解是以成本函数最小化为目标,成本函数为各个类畸变程度之和,
    每个类的畸变程度等于该类重心与其内部成员位置距离的平方和
    但是平均畸变程度会随着K的增大先减小后增大,所以可以求出最小的平均畸变程度

    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.font_manager import FontProperties
    from sklearn.cluster import KMeans
    from scipy.spatial.distance import cdist
    # 1 数据可视化
    cluster1 = np.random.uniform(0.5, 1.5, (2, 10))
    cluster2 = np.random.uniform(3.5, 4.5, (2, 10))
    X = np.hstack((cluster1, cluster2)).T
    plt.figure()
    plt.axis([0, 5, 0, 5])
    plt.grid(True)
    plt.plot(X[:, 0], X[:, 1], 'k.')
    plt.show()
    
    # 2 肘部法求最佳K值
    K = range(1, 10)
    mean_distortions = []
    for k in K:
        kmeans = KMeans(n_clusters=k)
        kmeans.fit(X)
        mean_distortions.append(
            sum(
                np.min(
                    cdist(X, kmeans.cluster_centers_, metric='euclidean'), axis=1))
            / X.shape[0])
    plt.plot(K, mean_distortions, 'bx-')
    plt.xlabel('k')
    font = FontProperties(fname=r'c:\windows\fonts\msyh.ttc', size=20)
    plt.ylabel(u'平均畸变程度', fontproperties=font)
    plt.title(u'用肘部法确定最佳的K值', fontproperties=font)
    plt.show()
    
    2.png

    从图中可以看出图片像一只手肘,肘处的K即为最佳K值:K=2

    相关文章

      网友评论

        本文标题:肘方法确定KMeans聚类的最佳K值

        本文链接:https://www.haomeiwen.com/subject/qupcwftx.html