K-means聚类方法

二分K-means聚类这个方法新吗,有没有比较新的K值的确定方法

什么叫做”新"?k-means这个算法在我上小学的时候我就知道了。(虽然我当时不懂这是什么鬼)

不知道你这个问题是否已经解决, 如果还没有解决的话:

  • 以下回答来自chatgpt:

    根据参考资料中的代码和描述,K-means聚类方法的最新进展主要包括以下内容:

    1. 确定K值的新方法:在传统的K-means聚类中,K值是由用户手动设定的,但是现在有一些自动确定K值的方法,如基于Silhouette系数进行评估,找到最佳的K值。Silhouette系数是一种聚类效果评估指标,它结合了类内样本的紧密度和类间样本的分离度,值越接近于1表示聚类效果越好。可以通过在不同的K值下计算Silhouette系数来选择最佳的K值。

    2. 二分K-means聚类方法的解释和优点:二分K-means聚类方法是在传统的K-means聚类方法基础上的改进,它的核心思想是将一个聚类进行二分,形成两个新的聚类,然后对这两个新的聚类进行进一步的二分,直到达到预设的K值。相比传统的K-means聚类方法,二分K-means聚类方法具有以下优点:

    3. 能够避免陷入局部最优解:由于二分K-means聚类方法是通过逐步二分聚类进行优化的,所以相比传统K-means聚类方法更不容易陷入局部最优解。
    4. 能够更好地处理不均衡的聚类:传统K-means聚类方法对于不均衡的聚类数据表现不佳,而二分K-means聚类方法通过二分聚类可以更好地处理不均衡的聚类情况。
    5. 能够更好地利用计算资源:由于二分K-means聚类方法是通过逐步二分聚类进行优化的,所以在计算资源有限的情况下,可以更好地利用计算资源。
    6. 结果更稳定可靠:相比传统K-means聚类方法,二分K-means聚类方法的结果更加稳定可靠。

    下面是关于K-means聚类方法最新进展的代码示例(Python):

    import numpy as np
    from sklearn.metrics import silhouette_score
    from sklearn.cluster import KMeans
    
    # 获取数据
    def getData():
        data = np.array([[1, 1], [1, 2], [2, 1], [4, 3], [5, 4], [5, 6]])
        return data
    
    # 自动确定K值
    def autoDetermineK(data):
        best_k = 0
        best_score = -1
        for k in range(2, len(data)):
            kmeans = KMeans(n_clusters=k)
            kmeans.fit(data)
            score = silhouette_score(data, kmeans.labels_)
            if score > best_score:
                best_score = score
                best_k = k
        return best_k
    
    # 二分K-means聚类
    def binaryKMeans(data, k):
        kmeans = KMeans(n_clusters=2)
        kmeans.fit(data)
        while kmeans.n_clusters < k:
            labels = kmeans.labels_
            clusters = np.unique(labels)
            best_score = -1
            best_new_cluster = 0
            for cluster in clusters:
                cluster_data = data[labels == cluster]
                new_kmeans = KMeans(n_clusters=2)
                new_kmeans.fit(cluster_data)
                score = silhouette_score(cluster_data, new_kmeans.labels_)
                if score > best_score:
                    best_score = score
                    best_new_cluster = cluster
            # 将最佳划分的聚类分为两个子聚类
            labels[labels == best_new_cluster] = kmeans.n_clusters
            kmeans.n_clusters += 1
            kmeans.labels_ = labels
        return kmeans
    
    # 测试代码
    data = getData()
    k = autoDetermineK(data)
    result = binaryKMeans(data, k)
    
    print("最佳的K值为:", k)
    print("最终聚类结果:", result.labels_)
    

    以上代码通过自动确定K值的方法找到了最佳的K值,并使用二分K-means聚类方法进行聚类。结果将显示最佳的K值和最终的聚类结果。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^