如何为 Python 中的图像创建 KNN 图(使用用户定义的距离度量)?
How do I create KNN graph for images in Python (with user-defined distance metric)?
我想为 MNIST 数字数据集中的图像创建一个 k 最近邻图,使用用户定义的距离度量 - 为简单起见,A - B 的 Frobenius 范数。
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 中是否有创建此图的有效方法?
这很简单,它需要一个 2D(二维)数组作为 X 的输入:
https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.kneighbors_graph.html
你提供了吗?检查一下,data.data.shape
return是什么?
拼合图像
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]
我想为 MNIST 数字数据集中的图像创建一个 k 最近邻图,使用用户定义的距离度量 - 为简单起见,A - B 的 Frobenius 范数。
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 中是否有创建此图的有效方法?
这很简单,它需要一个 2D(二维)数组作为 X 的输入:
https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.kneighbors_graph.html
你提供了吗?检查一下,data.data.shape
return是什么?
拼合图像
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]