如何评估 K-Modes 集群?

数据挖掘 Python 聚类 k-均值 距离
2021-09-18 22:52:13

K-modes 算法可在此处获得

我想对我的二进制数据集进行聚类。我需要指定我需要的集群数量作为输出:

KModes (n_clusters, init, n_init, verbose)

我的数据集包含 1000 行和 1000 行,我想计算我的集群之间的距离,以便知道我需要选择的集群的确切数量。我不知道如何比较它们。可能我想使用汉明距离,因为它是最适合在二进制数据之间进行比较的距离。

欢迎您提出任何建议。

2个回答

下面是一些选择集群数量的技术K

最常见的是肘部方法轮廓方法。

肘法

在这种方法中,您可以计算具有不同值的分数函数K您可以使用您建议的汉明距离或其他分数,例如色散。

然后,绘制它们,并在函数创建“肘部”的位置为 选择值K

在此处输入图像描述

剪影法

该方法测量一个簇中的点到其他簇的距离。然后在视觉上你有让你选择的剪影图K

观察:

K=2,相似高度但大小不同的轮廓。所以,潜在的候选人。 在此处输入图像描述

K=3,不同高度的剪影。所以,糟糕的候选人。 在此处输入图像描述

K=4,相似高度和大小的剪影。最佳人选。 在此处输入图像描述

KMeans 算法非常漂亮,但与其他算法相比,它有点原始。如果您有兴趣让聚类算法自动为您计算出聚类的数量,因此您不必这样做,您可以使用Affinity Propagation.

from sklearn.cluster import AffinityPropagation
from sklearn import metrics
from sklearn.datasets import make_blobs

# #############################################################################
# Generate sample data
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
#%matplotlib inline
from sklearn import datasets#Iris Dataset
iris = datasets.load_iris()
X = iris.data

# #############################################################################
# Compute Affinity Propagation
af = AffinityPropagation(preference=-50).fit(X)
cluster_centers_indices = af.cluster_centers_indices_
labels = af.labels_

n_clusters_ = len(cluster_centers_indices)

print('Estimated number of clusters: %d' % n_clusters_)


# #############################################################################
# Plot result
import matplotlib.pyplot as plt
from itertools import cycle

plt.close('all')
plt.figure(1)
plt.clf()

colors = cycle('bgrcmykbgrcmykbgrcmykbgrcmyk')
for k, col in zip(range(n_clusters_), colors):
    class_members = labels == k
    cluster_center = X[cluster_centers_indices[k]]
    plt.plot(X[class_members, 0], X[class_members, 1], col + '.')
    plt.plot(cluster_center[0], cluster_center[1], 'o', markerfacecolor=col,
             markeredgecolor='k', markersize=14)
    for x in X[class_members]:
        plt.plot([cluster_center[0], x[0]], [cluster_center[1], x[1]], col)

plt.title('Estimated number of clusters: %d' % n_clusters_)
plt.show()

输出:Estimated number of clusters: 3

在此处输入图像描述

https://scikit-learn.org/stable/auto_examples/cluster/plot_affinity_propagation.html#sphx-glr-auto-examples-cluster-plot-affinity-propagation-py

https://scikit-learn.org/stable/modules/clustering.html