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{array-like, 稀疏矩陣},形狀為 (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, 稀疏矩陣},形狀為 (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 會回傳距離矩陣垂直區塊的產生器。

metric字串或可調用物件,預設值為 'euclidean'

用於計算特徵陣列中實例之間距離的度量。如果 metric 是字串,則必須是 scipy.spatial.distance.pdist 的 metric 參數允許的選項之一,或是 pairwise.PAIRWISE_DISTANCE_FUNCTIONS 中列出的度量。如果 metric 為 "precomputed",則假設 X 為距離矩陣。或者,如果 metric 是可調用函式,則會針對每對實例(列)呼叫,並記錄結果值。該可調用函式應將 X 中的兩個陣列作為輸入,並回傳一個指示它們之間距離的值。

n_jobs整數,預設值為 None

用於計算的作業數量。這是透過將成對矩陣分解為 n_jobs 個均勻切片並行計算來實現的。

None 表示 1,除非在 joblib.parallel_backend 環境中。-1 表示使用所有處理器。有關更多詳細資訊,請參閱詞彙表

working_memory浮點數,預設值為 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])]