在之前写的一篇关于聚类分析的文章中,介绍了两种用于评价聚类模型好坏的标准,分别是elbow method和silhouette score。现在使用另外一种评分方式。
davies_bouldin_score, sklearn中有这个包, 但介绍不是很多。大概意思就是这个分数越低,模型越好,最小值是0。
直接用代码可视化分析一下:
首先还是生成数据:
from sklearn.datasets import make_moons
X, y = make_moons(200, noise=.05, random_state=0)
plt.scatter(X[:, 0], X[:, 1],s=50)
plt.show()
依旧是月牙图形
然后先解释一下这个davies_bouldins_score的参数,需要传入数据X,和对应已经训练好的labels,即每个数据点的分类,它就会返回一个分数。
这里测试了三种不同的距离方式 :
euclidean欧式距离,
manhattan曼哈顿距离,
cosine余弦距离,
同时还要比较不同的k以及不同的linkage方式,分别有
single,average,complete。
这里不是很懂的可以去看本文开始链接中的文章。
代码如下
from sklearn.cluster import AgglomerativeClustering as AC
from sklearn.metrics import davies_bouldin_score as dbs
def hierarchical(X, similarity):
scores1=[]
for k in range(2,10):
labels =AC(n_clusters=k,affinity=similarity,linkage="complete").fit_predict(X)
scores1.append(dbs(X, labels))
plt.plot(range(2,10), scores1,c='red',label='complete')
scores2=[]
for k in range(2,10):
labels =AC(n_clusters=k,affinity=similarity,linkage="single").fit_predict(X)
scores2.append(dbs(X, labels))
plt.plot(range(2,10), scores2,c='blue',label="single")
scores3=[]
for k in range(2,10):
labels =AC(n_clusters=k,affinity=similarity,linkage="average").fit_predict(X)
scores3.append(dbs(X, labels))
plt.plot(range(2,10), scores3,c='green',label="average")
plt.ylabel("davies_bouldin_score")
plt.xlabel("$k/n clusters$")
plt.title(similarity)
plt.legend(loc=0)
plt.show()
hierarchical(X,"euclidean")
hierarchical(X, "cosine")
hierarchical(X,"manhattan")
图像如下:
可以发现average在大部分情况下都表现得很好,因为他的值很低。虽然在cosine中single表现得好一些,但由于hierarchial clustering默认的k是2,在k/n_clusters=2的情况下,average都是最好的,所以最终还是选择average。
并且在average,k=2的情况下,模型最好。