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