【问题标题】:k-means algorithm in PythonPython中的k-means算法
【发布时间】:2018-10-11 22:01:38
【问题描述】:

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

import numpy as np

# Load images
I = np.load("mnist_test_images.npy").astype(float) # (10000,784)
L = np.load("mnist_test_labels.npy").astype(int) # (10000,1)

# Scale
I = 2.0*(I/255.0-0.5)

images = len(I)

# Random initialization of centers for k=10 clusters
M = np.random.randn(10,28*28)

guess = np.zeros((len(I),1))
step = 0
while (True):
    # Compute distance of every image i to the center of every cluster k
    # image i belongs to cluster with smallest distance
    for i in range(images):
        d = np.sum((M-I[i])**2,axis=1)
        guess[i] = np.argmin(d)

    # Update the centers for all clusters
    # New center is the mean of all images i which belong to cluster k
    for k in range(10):
        idx, _ = np.where(guess == k)
        if len(idx) > 0:
            M[k] = np.mean(I[idx],axis=0)

    # Test how good the algorithm works
    # Very similar to first step
    if (step % 10 == 0):
        fitness = 0
        for i in range(images):
            dist = np.sum((M-I[i])**2,axis=1)
            if L[i] == np.argmin(dist):
                fitness += 1
        print("%d" % fitness, flush=True)

    step += 1

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

谢谢!

【问题讨论】:

    标签: python cluster-analysis k-means


    【解决方案1】:

    问题是您将此视为一种监督学习方法,但它是无监督的。在我看来,应该避免使用整个“无监督学习”术语,因为它可能非常具有误导性。事实上,我根本不会将大多数“无监督”方法称为“学习”。

    聚类不仅仅是“无监督分类”。这是一项非常不同且困难得多的任务。这项任务如此艰巨,以至于我们甚至还不知道如何真正评估它。

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

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

    【讨论】:

    • 感谢您的回答!但是有什么方法可以用 kmeans 算法对 MNIST 进行分类吗?什么是方法?当我不能将它用于 MNIST 时,什么数据是 kmeans 的正确选择?
    • 在 MNIST 上试验 kmeans 并没有“错误”。这很容易误导,因为数字是数字 0 到 9。当真正的类是“红色”和“蓝色”时,更容易理解为什么分类!= 聚类。
    • 但不要用于分类。
    猜你喜欢
    • 2010-12-05
    • 2013-07-03
    • 2017-04-20
    • 2013-04-22
    • 2012-06-19
    • 2011-09-15
    • 2015-08-16
    相关资源
    最近更新 更多