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])]