sklearn.metrics.pairwise_distances_chunked¶
sklearn.metrics.pairwise_distances_chunked(X, Y=None, *, reduce_func=None, metric='euclidean', n_jobs=None, working_memory=None, **kwds)
通过可选缩减逐块生成距离矩阵块
在并非所有成对距离矩阵都需要一次存储的情况下,这用于计算work_memory大小的块中的成对距离。 如果给出了reduce_func,它将在每个块上运行,并将其返回值连接到列表,数组或稀疏矩阵中。
参数 | 说明 |
---|---|
X | array [n_samples_a, n_samples_a] if metric == “precomputed”, or, [n_samples_a, n_features],否则为样本间成对距离的数组,或为特征数组。 |
Y | array [n_samples_b, n_features], optional 可选的第二要素数组。仅当metric != “precomputed”时才允许。 |
reduce_func | callable, optional 应用于距离矩阵的每个块的函数,将其减小为所需的值。 reduce_func(D_chunk,start)被重复调用,其中D_chunk是成对距离矩阵的连续垂直切片,从行start处开始。应返回以下结果之一:None;数组、列表、长度为D_chunk.shape [0]的稀疏矩阵或此类对象的元组。不返回任何值对于就地操作很有用,而不是缩减。 如果为None,则pairwise_distances_chunked返回距离矩阵的垂直块的生成器。 |
metric | string, or callable 计算特征数组中实例之间的距离时使用的度量。如果metric是字符串,则它必须是scipy.spatial.distance.pdist为其metric参数允许的选项之一,或者是pairwise.PAIRWISE_DISTANCE_ FUNCTIONS中列出的度量。如果度量是“precomputed”,则假定X为距离矩阵。 或者,如果metric是可调用的函数,则在每对实例(行)上调用metric,并记录结果值。可调用对象应将X的两个数组作为输入,并返回一个指示它们之间距离的值。 |
n_jobs | int or None, optional (default=None) 用于计算的作业数。通过将成对矩阵分解为n_jobs个偶数切片并并行计算它们,可以工作。 除非在 joblib.parallel_backend 上下文中,否则None表示1。-1表示使用所有处理器。有关更多详细信息,请参见词汇表。 |
working_memory | int, optional 临时距离矩阵块所需的最大内存。如果为None(默认),则使用sklearn.get_config()['working_memory']的值。 |
**kwds |
optional keyword parameters 任何其他参数都直接传递给距离函数。如果使用scipy.spatial.distance度量,则参数仍取决于度量。有关用法示例,请参见scipy文档。 |
输出 | 说明 |
---|---|
D_chunk | array or sparse matrix 距离矩阵的连续切片,可以选择由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.29..., 0.41..., 0.19..., 0.57...],
[0.29..., 0. ..., 0.57..., 0.41..., 0.76...],
[0.41..., 0.57..., 0. ..., 0.44..., 0.90...],
[0.19..., 0.41..., 0.44..., 0. ..., 0.51...],
[0.57..., 0.76..., 0.90..., 0.51..., 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])]