Алгоритм K-средних в Python

Я попытался реализовать алгоритм k-средних для набора данных MNIST. Но поскольку результат далек от хорошего, может быть ошибка (или несколько), которых я не вижу в данный момент. Код действительно прост. Вот что я сделал до сих пор:

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 есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
300
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что вы относитесь к этому как к подходу к обучению с учителем, но без него. На мой взгляд, следует избегать всей терминологии «обучение без учителя», потому что она может вводить в заблуждение. Фактически, я бы вообще не назвал большинство «неконтролируемых» методов «обучением».

Кластеризация - это не просто «неконтролируемая классификация». Это совсем другая и гораздо более сложная задача. Задача настолько сложная, что мы даже еще не знаем, как ее реально оценить.

Я в вашем случае есть несколько проблем:

  1. Вы предполагаете, что kmeans найдет цифры от 0 до 9. Поскольку он не контролируется, он, скорее всего, будет нет. Вместо этого он может обнаружить, что есть наклонные цифры, разная ширина линий, разные типы и т. д.
  2. Вы оцениваете это, предполагая, что кластер 0 соответствует цифре 0. Это не так. Метки кластера бессмысленны. MNIST - очень плохой выбор здесь, потому что по совпадению его классы также являются цифрами. Но kmeans всегда будет использовать метки от 0 до k-1, даже для яблок и бананов.
  3. Вы предполагаете, что оценка должна улучшаться с каждой итерацией. Но это без присмотра!
  4. Класс может содержать несколько кластеров
  5. Классы могут быть неразделимы без меток, и это образует кластер один
  6. Такие методы, как kmeans, чувствительны к выбросам. У вас, вероятно, есть очень крошечные кластеры, которые просто моделируют несколько неверных точек данных.

Спасибо за ответ! Но есть ли способ классифицировать MNIST с помощью алгоритма kmeans? Какой был бы подход? Когда я не могу использовать его для MNIST, для каких данных k означает правильный выбор?

Samuel 02.05.2018 15:02

Нет ничего плохого в том, чтобы экспериментировать с kmeans на MNIST. это просто вводит в заблуждение, потому что цифры - это числа от 0 до 9. Легче понять, почему классификация! = кластеризация, когда истинными классами являются «красный» и «синий».

Has QUIT--Anony-Mousse 02.05.2018 20:16

Но не используйте это для классификации.

Has QUIT--Anony-Mousse 02.05.2018 20:16

Другие вопросы по теме