我正在研究通过观察文档的结构来对文档进行聚类。
我在下面的代码中提取了BERT嵌入变量X的结构。
我正在尝试什么。
for num_clusters in np.arange(2,200):
model = KMeans(n_clusters=num_clusters)
model.fit(X)
pred = model.predict(X)
centers = model.cluster_centers_
cluster_sum = 0
for i , c in enumerate(centers):
use = []
for j , p in enumerate(pred):
if p == i:
use.append(X[j])
score = 0
for m in range(len(use)):
for n in range(len(use)):
score+=cos_similarity(use[m],use[n])
score = score/(len(use)*len(use))
cluster_sum += score
cluster_sum=cluster_sum/num_clusters
我写了这段代码来寻找聚类的相似度分数(结合所有聚类的相似度分数).我面临的问题:随着聚类数量的增加,分数也在增加。
这个图是@Cyrus在回答中提到的Knee算法的图。我不知道应该在哪里画线。
有不少主题可以给你指出正确的方向。你可以看看一些像:
希望能帮到你!
我的回答更多的是针对你问题的数学方面。
落实... sklearn
's KMeans
使用欧氏距离来衡量输入数据中数据点之间的相似性。然而,您似乎是在尝试用余弦相似度来评估聚类质量--这是一种不同的距离测量方法,聚类结果已被优化。这可以解释随着聚类数量的增加,聚类得分的增加。
您是否注意到 KMeans
有 inertia_
属性,该属性对应于样本到其最接近的聚类中心的平方距离之和;这可以被认为是一个有效的聚类得分。KMeans
使用欧氏距离。
如果对你有帮助,我很高兴