pairwise_distances_chunked#
- sklearn.metrics.pairwise_distances_chunked(X, Y=None, *, reduce_func=None, metric='euclidean', n_jobs=None, working_memory=None, **kwds)[source]#
按块生成距离矩阵,并带有可选的缩减。
在不需要同时存储整个成对距离矩阵的情况下,该函数用于以
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{array-like, sparse matrix} of shape (n_samples_Y, n_features), default=None
可选的第二个特征数组。仅在 metric != “precomputed” 时允许使用。
- reduce_funccallable, default=None
应用于距离矩阵每个块的函数,用于将其简化为所需的值。该函数会重复调用
reduce_func(D_chunk, start),其中D_chunk是成对距离矩阵的连续垂直切片,从第start行开始。它应返回以下之一:None;长度为D_chunk.shape[0]的数组、列表或稀疏矩阵;或者此类对象的元组。返回 None 对于原地操作而不是归约操作非常有用。如果为 None,pairwise_distances_chunked 将返回距离矩阵垂直分块的生成器。
- metricstr or callable, default=’euclidean’
在特征数组中计算实例间距离时使用的度量。如果 metric 是字符串,它必须是
scipy.spatial.distance.pdist的 metric 参数允许的选项之一,或者是 pairwise.PAIRWISE_DISTANCE_FUNCTIONS 中列出的度量。如果 metric 是 “precomputed”,则假定 X 是距离矩阵。另外,如果 metric 是可调用函数,它将被用于每对实例(行)并记录结果值。该可调用对象应接收来自 X 的两个数组作为输入,并返回表示它们之间距离的值。- n_jobsint, default=None
用于计算的作业数量。其工作原理是将成对矩阵分解为 n_jobs 个等分切片并并行计算它们。
None表示 1,除非在joblib.parallel_backend上下文中。-1表示使用所有处理器。有关更多详细信息,请参阅词汇表。- working_memoryfloat, default=None
临时距离矩阵块所预期的最大内存。当为 None(默认值)时,将使用
sklearn.get_config()['working_memory']的值。- **kwdsoptional keyword parameters
任何其他参数都将直接传递给距离函数。如果使用
scipy.spatial.distance度量,参数仍依赖于具体度量。请参阅 scipy 文档以获取使用示例。
- 生成:
- D_chunk{ndarray, 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.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])]