图像数据的 KMeans 聚类

数据挖掘 Python k-均值 聚类
2022-03-03 06:23:32

我正在尝试使用 K-Means 聚类对 Imagenet 数据集的样本进行聚类。

在这种方法中,我使用了以下 2 种方法来获得最佳集群数量。

  1. 肘部方法
    在此处输入图像描述从图中看来,最好的聚类数是 6 到 10。

  2. 剪影得分

Cluster : 2 | Silhouette score : 0.036273542791604996
Cluster : 3 | Silhouette score : -0.00300691369920969
Cluster : 4 | Silhouette score : 0.0025101888459175825
Cluster : 5 | Silhouette score : -0.005924953147768974
Cluster : 6 | Silhouette score : -0.00808520708233118
Cluster : 7 | Silhouette score : -0.006091121584177017
Cluster : 8 | Silhouette score : -0.00549863139167428
Cluster : 9 | Silhouette score : -0.014739749021828175
Cluster : 10 | Silhouette score : -0.021131910383701324
Cluster : 11 | Silhouette score : -0.04057755321264267
Cluster : 12 | Silhouette score : -0.012825582176446915
Cluster : 13 | Silhouette score : -0.012340431101620197
Cluster : 14 | Silhouette score : -0.032936643809080124
Cluster : 15 | Silhouette score : -0.04154697805643082
Cluster : 16 | Silhouette score : -0.04323640838265419

在剪影分析中,它看起来只有集群 4 才显示出更好的价值。其余的集群似乎被错误地分配给了错误的集群。

在这种情况下,需要考虑哪个指标?

更新:
我使用 PCA 减少了特征的维度。以下是肘部和轮廓分析的更新图表。但是,我没有看到集群有任何改进。根据剪影,样本没有被分配到最近的集群。

弯头
在此处输入图像描述

轮廓
在此处输入图像描述

用最新的图更新问题,VGGNet 已被 Resnet50 取代

在此处输入图像描述

代码片段:

        for i in range(lower_range, upper_range):
            # For Elbow curve
            kmeans_cluster = KMeans(n_clusters = i)
            kmeans_cluster_fit = kmeans_cluster.fit(features_list_np)
            loss = kmeans_cluster_fit.inertia_
            error.append(kmeans_cluster_fit.inertia_)

            # For Silhoutte analysis
            preds = kmeans_cluster.fit_predict(features_list_np)
            score = silhouette_score(features_list_np, preds)
            score_list.append(score)

            sample_score = silhouette_samples(features_list_np, preds)
            sample_score_list.append(sample_score)

            print("Cluster : {} | Loss : {} | Silhoutte Score : {}".format(i, loss, score))

            zero_samples = 0
            positive_samples = 0
            negative_samples = 0

            for each_sample in sample_score:
                if each_sample == 0:
                    zero_samples += 1
                if each_sample > 0:
                    positive_samples += 1
                if each_sample < 0:
                    negative_samples += 1

            print("Cluster : {} | Silhouette sample distribution - Zero : {} | Positive : {} | Negative : {}".format(i, zero_samples, positive_samples, negative_samples))

            zero_list.append(zero_samples)
            pos_list.append(positive_samples)
            neg_list.append(negative_samples)

也应该重视剪影分数或剪影样本。因为在某些情况下,剪影分数较少,但具有正值的样本数量较多。

谢谢你,
KK

2个回答

也没有,数据中没有足够的歧视性信息(还)

不要挤压数据,直到它告诉你真相。您可以更改度量标准(例如 malahobian 距离)和算法,但您不能指望它会显示奇迹。

使用肘法,当你增加集群的数量时,它总是会变得更加同质。您没有指示最佳聚类数的“扭结”。

并且使用 Silhouete(注意那些是每个集群的平均 Silhoue 分数,换句话说,对于 k=4,你有 4 个分数表明点是否位于平均的内部/边界/应该是其他集群)你得到所有这些点(平均而言)位于集群的边界上,没有明确区分集群(这就是 0 的含义)。

建议找到更好的数据量化表示、新功能、降低噪音等...

接近 0 的轮廓分数表示聚类不可靠。

肘部方法是废话在随机数据上,曲线将大致下降 1/(k-1);所以在很大程度上不确定它们何时是肘部,何时不是。在你的情况下,最让我烦恼的是,这些值似乎停滞在比零大得多的蛋糕上。也许您的集群代码中有错误?你的结果在我看来是随机的。