Я попытался реализовать алгоритм 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%. Я не могу распознать учение. Может ли случайная инициализация центров кластера вызвать такое поведение?
Спасибо!
Проблема в том, что вы относитесь к этому как к подходу к обучению с учителем, но без него. На мой взгляд, следует избегать всей терминологии «обучение без учителя», потому что она может вводить в заблуждение. Фактически, я бы вообще не назвал большинство «неконтролируемых» методов «обучением».
Кластеризация - это не просто «неконтролируемая классификация». Это совсем другая и гораздо более сложная задача. Задача настолько сложная, что мы даже еще не знаем, как ее реально оценить.
Я в вашем случае есть несколько проблем:
Нет ничего плохого в том, чтобы экспериментировать с kmeans на MNIST. это просто вводит в заблуждение, потому что цифры - это числа от 0 до 9. Легче понять, почему классификация! = кластеризация, когда истинными классами являются «красный» и «синий».
Но не используйте это для классификации.
Спасибо за ответ! Но есть ли способ классифицировать MNIST с помощью алгоритма kmeans? Какой был бы подход? Когда я не могу использовать его для MNIST, для каких данных k означает правильный выбор?