提交 b29b65cc 编写于 作者: W wizardforcel

3.3

上级 14daffe6
......@@ -132,7 +132,7 @@ KMeans(copy_x=True, init='k-means++', max_iter=300, n_clusters=3,
random_state=None, tol=0.0001, verbose=0)
```
首先,我们查看轮廓距离。轮廓距离是簇内不相似性、最近的簇间不相似性、以及这两个值最大值的比值。它可以看做簇间分离程度的度量。
首先,我们查看轮廓(Silhouette)距离。轮廓距离是簇内不相似性、最近的簇间不相似性、以及这两个值最大值的比值。它可以看做簇间分离程度的度量。
让我们看一看数据点到形心的距离分布,理解轮廓距离非常有用。
......@@ -170,7 +170,7 @@ array([[ 1., 0.87617292],
这十分普遍,事实上,`metrics`模块提供了一个函数来获得刚才的值。
现在,让我们拟合多个簇的模型,并看看平均得分是什么样:
现在,让我们训练多个簇的模型,并看看平均得分是什么样:
```py
# first new ground truth
......@@ -190,3 +190,131 @@ array([[ 1., 0.87617292],
![](img/3-2-2.jpg)
这个绘图表明,轮廓均值随着形心数量的变化情况。我们可以看到最优的数量是 3,根据所生成的数据。但是最优的数量看起来是 6 或者 7。这就是聚类的实际情况,十分普遍,我们不能获得正确的簇数量,我们只能估计簇数量的近似值。
## 3.3 评估聚类的正确性
我们之前讨论了不知道真实情况的条件下的聚类评估。但是,我们还没有讨论簇已知条件下的 KMeans 评估。在许多情况下,这都是不可知的,但是如果存在外部的标注,我们就会知道真实情况,或者至少是代理。
### 准备
所以,让我们假设有一个世界,其中我们有一些外部代理,向我们提供了真实情况。
我们会创建一个简单的数据集,使用多种方式评估相对于真实庆康的正确性。之后讨论它们。
### 操作步骤
在我们开始度量之前,让我们先查看数据集:
```py
>>> f, ax = plt.subplots(figsize=(7, 5))
>>> colors = ['r', 'g', 'b']
>>> for i in range(3):
p = blobs[ground_truth == i]
ax.scatter(p[:,0], p[:,1], c=colors[i],
label="Cluster {}".format(i))
>>> ax.set_title("Cluster With Ground Truth")
>>> ax.legend()
>>> f.savefig("9485OS_03-16")
```
下面是输出:
![](img/3-3-1.jpg)
既然我们已经训练了模型,让我们看看簇的形心:
```py
>>> f, ax = plt.subplots(figsize=(7, 5))
>>> colors = ['r', 'g', 'b']
>>> for i in range(3):
p = blobs[ground_truth == i]
ax.scatter(p[:,0], p[:,1], c=colors[i], label="Cluster {}".format(i))
>>> ax.scatter(kmeans.cluster_centers_[:, 0],
kmeans.cluster_centers_[:, 1], s=100,
color='black',
label='Centers')
>>> ax.set_title("Cluster With Ground Truth")
>>> ax.legend()
>>> f.savefig("9485OS_03-17")
```
下面是输出:
![](img/3-3-2.jpg)
既然我们能够将聚类表现看做分类练习,在其语境中有用的方法在这里也有用:
```py
>>> for i in range(3):
print (kmeans.labels_ == ground_truth)[ground_truth == i]
.astype(int).mean()
0.0778443113772
0.990990990991
0.0570570570571
```
很显然我们有一些错乱的簇。所以让我们将其捋直,之后我们查看准确度。
```py
>>> new_ground_truth = ground_truth.copy()
>>> new_ground_truth[ground_truth == 0] = 2
>>> new_ground_truth[ground_truth == 2] = 0
>>> for i in range(3):
print (kmeans.labels_ == new_ground_truth)[ground_truth == i]
.astype(int).mean()
0.919161676647
0.990990990991
0.90990990991
```
所以我们 90% 的情况下都是正确的。第二个相似性度量是互信息( mutual information score)得分。
```py
>>> from sklearn import metrics
>>> metrics.normalized_mutual_info_score(ground_truth, kmeans.labels_)
0.78533737204433651
```
分数靠近 0,就说明标签的分配可能不是按照相似过程生成的。但是分数靠近 1,就说明两个标签有很强的一致性。
例如,让我们看一看互信息分数自身的情况:
```
>>> metrics.normalized_mutual_info_score(ground_truth, ground_truth)
1.0
```
通过名称,我们可以分辨出可能存在未规范化的` mutual_info_score`
```py
>>> metrics.mutual_info_score(ground_truth, kmeans.labels_)
0.78945287371677486
```
这非常接近了。但是,规范化的互信息是互信息除以每个真实值和标签的熵的乘积的平方根。
### 更多
有一个度量方式我们尚未讨论,并且不依赖于真实情况,就是惯性(inertia)度量。当前,它作为一种度量并没有详细记录。但是,它是 KMeans 中最简单的度量。
惯性是每个数据点和它所分配的簇的平方差之和。我们可以稍微使用 NumPy 来计算它:
```py
>>> kmeans.inertia_
```
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册