pairwise_distances_chunked#

sklearn.metrics.pairwise_distances_chunked(X, Y=None, *, reduce_func=None, metric='euclidean', n_jobs=None, working_memory=None, **kwds)[源码]#

逐块生成距离矩阵,并可选择进行缩减。

在不需要一次性存储所有成对距离矩阵的情况下,此函数用于以 working_memory 大小的块计算成对距离。如果给定了 reduce_func,它将对每个块运行,其返回值将连接成列表、数组或稀疏矩阵。

参数:
X{类数组, 稀疏矩阵} 形状为 (n_samples_X, n_samples_X) 或 (n_samples_X, n_features)

样本之间的成对距离数组,或特征数组。如果 metric='precomputed',数组的形状应为 (n_samples_X, n_samples_X),否则为 (n_samples_X, n_features)。

Y{类数组, 稀疏矩阵} 形状为 (n_samples_Y, n_features), 默认为 None

可选的第二个特征数组。仅当 metric != "precomputed" 时允许。

reduce_func可调用对象, 默认为 None

应用于距离矩阵的每个块的函数,将其缩减为所需的值。函数 reduce_func(D_chunk, start) 会重复调用,其中 D_chunk 是成对距离矩阵的一个连续垂直切片,从行 start 开始。它应该返回以下之一:None;一个长度为 D_chunk.shape[0] 的数组、列表或稀疏矩阵;或者一个包含此类对象的元组。返回 None 对于原地操作而非缩减非常有用。

如果为 None,pairwise_distances_chunked 将返回距离矩阵垂直块的生成器。

metricstr 或 可调用对象, 默认为 'euclidean'

计算特征数组中实例之间距离时使用的度量。如果 metric 是字符串,它必须是 scipy.spatial.distance.pdist 的 metric 参数所允许的选项之一,或 pairwise.PAIRWISE_DISTANCE_FUNCTIONS 中列出的度量之一。如果 metric 是 "precomputed",则 X 被假定为距离矩阵。另外,如果 metric 是可调用函数,它将作用于每对实例(行),并记录结果值。该可调用函数应以 X 中的两个数组作为输入,并返回一个表示它们之间距离的值。

n_jobsint, 默认为 None

用于计算的并行作业数。这通过将成对矩阵分解为 n_jobs 个均匀切片并并行计算它们来实现。

None 表示 1,除非在 joblib.parallel_backend 上下文中。-1 表示使用所有处理器。更多详情请参阅术语表

working_memoryfloat, 默认为 None

临时距离矩阵块所需的最大内存。当为 None(默认)时,使用 sklearn.get_config()['working_memory'] 的值。

**kwds可选关键词参数

任何其他参数将直接传递给距离函数。如果使用 scipy.spatial.distance 度量,参数仍然依赖于度量。有关用法示例,请参阅 scipy 文档。

生成:
D_chunk{ndarray, 稀疏矩阵}

距离矩阵的一个连续切片,可选地由 reduce_func 处理。

示例

不带 reduce_func

>>> import numpy as np
>>> from sklearn.metrics import pairwise_distances_chunked
>>> X = np.random.RandomState(0).rand(5, 3)
>>> D_chunk = next(pairwise_distances_chunked(X))
>>> D_chunk
array([[0.   , 0.295, 0.417, 0.197, 0.572],
       [0.295, 0.   , 0.576, 0.419, 0.764],
       [0.417, 0.576, 0.   , 0.449, 0.903],
       [0.197, 0.419, 0.449, 0.   , 0.512],
       [0.572, 0.764, 0.903, 0.512, 0.   ]])

检索所有邻居和半径 r 内的平均距离

>>> r = .2
>>> def reduce_func(D_chunk, start):
...     neigh = [np.flatnonzero(d < r) for d in D_chunk]
...     avg_dist = (D_chunk * (D_chunk < r)).mean(axis=1)
...     return neigh, avg_dist
>>> gen = pairwise_distances_chunked(X, reduce_func=reduce_func)
>>> neigh, avg_dist = next(gen)
>>> neigh
[array([0, 3]), array([1]), array([2]), array([0, 3]), array([4])]
>>> avg_dist
array([0.039, 0.        , 0.        , 0.039, 0.        ])

当 r 为每个样本定义时,我们需要使用 start

>>> r = [.2, .4, .4, .3, .1]
>>> def reduce_func(D_chunk, start):
...     neigh = [np.flatnonzero(d < r[i])
...              for i, d in enumerate(D_chunk, start)]
...     return neigh
>>> neigh = next(pairwise_distances_chunked(X, reduce_func=reduce_func))
>>> neigh
[array([0, 3]), array([0, 1]), array([2]), array([0, 3]), array([4])]

通过减少 working_memory 强制按行生成

>>> gen = pairwise_distances_chunked(X, reduce_func=reduce_func,
...                                  working_memory=0)
>>> next(gen)
[array([0, 3])]
>>> next(gen)
[array([0, 1])]