分块成对距离#
- 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形状为 (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.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])] 
