我使用书中的以下代码对数字数据集进行聚类。由于 K means 算法能够找到聚类,但不知道哪个聚类对应于例如“0”或“9”,我们必须将每个学习到的聚类标签与它们中发现的真实标签匹配。
digits=load_digits()X=digits.datay=digits.target#实例化 k_means 估计器并设置超参数model=KMeans(n_clusters=10,random_state=0)model.fit(X)y_pred=model.predict(X)#将每个学习到的聚类标签与其中发现的真实标签匹配from scipy.stats import modelabels=np.zeros_like(y_pred)for i in range(10): mask=(y_pred==i) labels[mask]=mode(digits.target[mask])[0]conf=confusion_matrix(y,labels)
我理解所有的代码,除了以下部分:
labels[mask]=mode(digits.target[mask])[0]
有人能解释一下吗?
回答:
在统计学中,mode()
表示在集合中出现最频繁的值。因此,与聚类mask
匹配的“真实”数字是属于聚类mask
的所有数字中出现频率最高的数字。
所以,
digits.target[mask] # 聚类 `mask` 的所有真实标签集合
取mode
:
mode(digits.target[mask]) # 查找此聚类中最频繁的数字
将其赋值给labels[mask]
,从而匹配 K-means 聚类和集合中的真实数字:
labels[mask]=mode(digits.target[mask])[0]