pairwise_distances_chunked#

sklearn.metrics.pairwise_distances_chunked(X, Y=None, *, reduce_func=None, метрика='euclidean', n_jobs=None, working_memory=None, **kwds)[источник]#

Генерировать матрицу расстояний по частям с возможным сокращением.

В случаях, когда не вся матрица попарных расстояний должна храниться одновременно, это используется для вычисления попарных расстояний в working_memory-размерных блоков. Если reduce_func если задано, оно запускается на каждом фрагменте и его возвращаемые значения объединяются в списки, массивы или разреженные матрицы.

Параметры:
X{array-like, sparse matrix} формы (n_samples_X, n_samples_X) или (n_samples_X, n_features)

Массив попарных расстояний между образцами или массив признаков. Форма массива должна быть (n_samples_X, n_samples_X), если metric='precomputed', и (n_samples_X, n_features) в противном случае.

Y{array-like, sparse matrix} формы (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 возвращает генератор вертикальных блоков матрицы расстояний.

метрикаstr или callable, по умолчанию='euclidean'

Метрика для использования при вычислении расстояния между экземплярами в массиве признаков. Если метрика является строкой, она должна быть одной из опций, разрешенных 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, по умолчанию=None

Максимальный объем памяти, искомый для временных фрагментов матрицы расстояний. Когда None (по умолчанию), значение sklearn.get_config()['working_memory'] используется.

**kwdsопциональные параметры ключевых слов

Любые дополнительные параметры передаются напрямую в функцию расстояния. Если используется 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])]