Python中的k-means算法

时间:2018-05-01 20:55:06

标签: python cluster-analysis k-means

我试图为MNIST数据集实现k-means算法。但由于结果远远不够好,可能会有一个我现在看不到的错误(或几个)。代码非常简单。这是我到目前为止所做的:

fgets(str, 3, stdin); 

代码看起来很简单。但某处可能存在错误。当我测试它时,准确度从大约10-20%下降到5-10%或几乎立即收敛不超过30%。我无法识别任何学习。群集中心的随机初始化是否会导致此行为?

谢谢!

1 个答案:

答案 0 :(得分:4)

问题在于,您将此视为有监督的学习方法,但无人监督。在我看来,应避免使用整个“无监督学习”术语,因为它可能会产生误导。事实上,我不会把大多数“无人监督”的方法称为“学习”。

群集不仅仅是“无监督分类”。这是一项非常不同且艰巨的任务。这项任务非常艰巨,我们甚至还不知道如何真正评估它。

我是你的情况,有几个问题:

  1. 您认为kmeans会找到0到9的数字。由于它是无人监管的,因此很可能。相反,它可能会发现有倾斜的数字,不同的线宽,不同种类的等等。
  2. 您评估它假设群集0对应于数字0.它没有。群集标签毫无意义。 MNIST在这里是一个非常糟糕的选择,因为巧合的是它的类也是数字。但是kmeans总是会使用0到k-1的标签,即使对于苹果和香蕉也是如此。
  3. 您认为每次迭代时评估必须变得更好。但这是无人监管的!
  4. 一个类可能包含多个集群
  5. 如果没有标签,类可能是不可分割的,而这种形式一个集群
  6. 像kmeans这样的方法对异常值很敏感。你可能有一些非常小的集群,只是模拟了不良的数据点。