Как создать график KNN для изображений в Python (с определенной пользователем метрикой расстояния)? - PullRequest
0 голосов
/ 16 мая 2019

Я хотел бы создать граф k-ближайших соседей для изображений в наборе цифр MNIST, с определяемой пользователем метрикой расстояния - для простоты, норма Фробениуса A - B.

sklearn.neighbors.kneighbors_graph предоставляет хороший интерфейс, но не допускает матричные данные - например, когда я пытаюсь сделать график следующим образом:

from torchvision.datasets import MNIST
import sklearn

# Define distance metric for matrices
metric_func = lambda X, Y: norm(X - Y, ord='fro')

data = MNIST('sample_data', train=True, transform=None, target_transform=None, download=True)        

adj_matrix = sklearn.neighbors.kneighbors_graph(
        data.data, 
        n_neighbors=5, 
        mode='connectivity',
        metric=metric_func, 
        p=2, 
        metric_params=None, 
        include_self=False, 
        n_jobs=None
    )

я получаюошибка:

ValueError: Found array with dim 3. Estimator expected <= 2.

Я мог бы написать собственный метод 'kneighbors_graph () `, но он, вероятно, включал бы удвоение для циклов и большую неэффективность.Есть ли эффективный способ создать этот граф в Python?

Ответы [ 2 ]

0 голосов
/ 16 мая 2019

Сглаживание изображений

from sklearn import datasets
from sklearn.neighbors import kneighbors_graph

digits = datasets.load_digits()
images = digits.data.reshape(-1, 8, 8)

distances = kneighbors_graph(images.reshape(-1, 64), 5, mode='distance', include_self=True, metric='euclidean')
distances =  distances.todense()

# Test
i = 11
print ("Actual Image: {0}, Nearest 5 Images: {1}".format(
    digits.target[i], digits.target[distances[i].nonzero()[1]]))

Вывод: Actual Image: 1, Nearest 5 Images: [1 1 1 1]

0 голосов
/ 16 мая 2019

Это довольно просто, он ожидает 2D (2-мерный) массив в качестве ввода для X:

* ** 1003 тысяча два *https://scikit -learn.org / стабильный / модули / полученный / sklearn.neighbors.kneighbors_graph.html

Вы предоставили это? Проверьте, что data.data.shape возвращает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...