我正在尝试使用K-means方法进行聚类,但我想测量聚类的性能。 我不是专家,但我渴望了解有关聚类的更多信息。
这是我的代码:
import pandas as pd
from sklearn import datasets
#loading the dataset
iris = datasets.load_iris()
df = pd.DataFrame(iris.data)
#K-Means
from sklearn import cluster
k_means = cluster.KMeans(n_clusters=3)
k_means.fit(df) #K-means training
y_pred = k_means.predict(df)
#We store the K-means results in a dataframe
pred = pd.DataFrame(y_pred)
pred.columns = ['Species']
#we merge this dataframe with df
prediction = pd.concat([df,pred], axis = 1)
#We store the clusters
clus0 = prediction.loc[prediction.Species == 0]
clus1 = prediction.loc[prediction.Species == 1]
clus2 = prediction.loc[prediction.Species == 2]
k_list = [clus0.values, clus1.values,clus2.values]
现在我已经存储了我的KMeans和我的三个集群,我正在尝试使用Dunn Index来衡量我的集群的性能(我们寻求更大的索引) 为此,我导入 jqm_cvi包(可用here)
from jqmcvi import base
base.dunn(k_list)
我的问题是:Scikit Learn中是否已存在任何群集内部评估(除了来自silhouette_score)?还是在另一个着名的图书馆?
感谢您的时间
答案 0 :(得分:1)
通常,聚类被视为无监督方法,因此难以建立良好的性能指标(如前面的评论中所述)。
然而,可以从这些算法(例如k均值)推断出许多有用的信息。问题是如何为每个集群分配语义,从而衡量算法的“性能”。在许多情况下,一个好的方法是通过可视化您的集群。显然,如果您的数据具有高维特征,就像在许多情况下发生的那样,可视化并不那么容易。让我建议两种方法,使用k-means和另一种聚类算法。
答案 1 :(得分:0)
答案 2 :(得分:0)
除“轮廓分数”外,“肘部标准”还可用于评估K均值聚类。在Scikit-Learn中不能作为功能/方法使用。我们需要计算SSE,以使用“肘准则”评估K-Means聚类。
“肘标准”方法的想法是选择SSE突然减小的k
(簇数)。 SSE定义为簇的每个成员与其质心之间的平方距离的总和。
计算k
的每个值的平方误差总和(SSE),其中k
是no. of cluster
并绘制折线图。随着我们增加k(SSE = 0,当k等于数据集中的数据点数时,SSE趋于朝0减小,因为每个数据点都是自己的簇,并且它与中心之间没有误差。的集群)。
因此,目标是选择一个较小的k
且仍具有low SSE
的值,而弯头通常表示,我们通过增加k开始获得递减的收益。
虹膜数据集示例
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
iris = load_iris()
X = pd.DataFrame(iris.data, columns=iris['feature_names'])
#print(X)
data = X[['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)']]
sse = {}
for k in range(1, 10):
kmeans = KMeans(n_clusters=k, max_iter=1000).fit(data)
data["clusters"] = kmeans.labels_
#print(data["clusters"])
sse[k] = kmeans.inertia_ # Inertia: Sum of distances of samples to their closest cluster center
plt.figure()
plt.plot(list(sse.keys()), list(sse.values()))
plt.xlabel("Number of cluster")
plt.ylabel("SSE")
plt.show()
如果折线图看起来像一条手臂-折线图上方的红色圆圈(如角度),则该手臂上的“肘部”值为optimal k
(簇数)的值。根据上述折线图中的弯头,最佳聚类数为3。
注意:弯头准则本质上是启发式的,可能不适用于您的数据集。根据数据集和您要解决的问题遵循直觉。
希望对您有帮助!