在巨大的向量中寻找最佳的K簇



我有 569 个向量,我想用 K-Means 聚类。但首先,我需要找到最佳的 K 群集。我尝试使用YellowBrick软件包中的KElbowVizualizer函数使用弯头方法,但它无法显示K簇的确切数量。所以现在我正在寻找替代方案。

知道如何找到最佳 k 集群吗?

这是我在KElbowVisualizer一起使用的代码:

from sklearn.cluster import MiniBatchKMeans
from sklearn.feature_extraction.text import TfidfVectorizer
from yellowbrick.cluster import KElbowVisualizer
vec = TfidfVectorizer(
stop_words = 'english',
use_idf=True
)
vectors_= vec.fit_transform(df1)
model = MiniBatchKMeans()
titleKElbow = "The Optimal K-Cluster with Elbow Method"
visualizer = KElbowVisualizer(model, k=(2,30), metric='silhouette', timings=False, title = titleKElbow, size=(1080, 720))
visualizer.fit(vectors_)
visualizer.show(outpath="G:/My Drive/0. Thesis/Results/kelbow_minibatchkmeans.png")

让我解释一下我的一种方法,我知道这很耗时,但如果您需要一些简单愚蠢的东西,这里是:

当我尝试找到最佳聚类数时,我只需在 2 到 n 之间执行一个 for 循环,在每次迭代中使用不同数量的质心,拟合模型并打印轮廓分数。

如果存在与要素中的组匹配的特定数量的聚类,则选择得分最高的模型或得分最高的模型之一。

示例代码:

for i in range(2, 30):
model = MiniBatchKMeans(n_clusters=i)
model.fit(vectors_)
score = silhouette_score(vectors_, model.labels_)
print("Number clusters: {}, Silhouette score is {})".format(i, score))

它可以输出如下内容:

Number clusters: 2, Silhouette score is 0.519799469615586)
Number clusters: 3, Silhouette score is 0.6105084877652616)
Number clusters: 4, Silhouette score is 0.6177814923806652)
Number clusters: 5, Silhouette score is 0.623432421353322)
Number clusters: 6, Silhouette score is 0.6454444674454114)
Number clusters: 7, Silhouette score is 0.5614716290406436)
Number clusters: 8, Silhouette score is 0.5585556926568208)
Number clusters: 9, Silhouette score is 0.565265125745878)
......

所以我会选择 6 个集群。

最新更新