scipy.cluster.hierarchy.

cophenet#

scipy.cluster.hierarchy.cophenet(Z, Y=None)[источник]#

Вычисление копенетических расстояний между каждым наблюдением в иерархической кластеризации, определённой связью Z.

Предположим p и q являются исходными наблюдениями в непересекающихся кластерах s и t, соответственно и s и t соединены прямым родительским кластером u. Копенетическое расстояние между наблюдениями i и j просто расстояние между кластерами s и t.

Параметры:
Zndarray

Иерархическая кластеризация, закодированная как массив (см. linkage функция).

Yndarray (опционально)

Вычисляет коэффициент копфенетической корреляции c нужно добавить в Z множества \(n\) наблюдения в \(m\) измерения. Y является сжатой матрицей расстояний, из которой Z был сгенерирован.

Возвращает:
cndarray

Корреляционное расстояние копгенитики (если Y передается).

dndarray

Копфенетическая матрица расстояний в сжатой форме. \(ij\) v-й элемент - это копфенетическое расстояние между исходными наблюдениями \(i\) и \(j\).

Смотрите также

linkage

для описания того, что такое матрица связей.

scipy.spatial.distance.squareform

преобразования сжатых матриц в квадратные.

Примечания

cophenet имеет экспериментальную поддержку совместимых с Python Array API Standard бэкендов в дополнение к NumPy. Пожалуйста, рассмотрите тестирование этих функций, установив переменную окружения SCIPY_ARRAY_API=1 и предоставление массивов CuPy, PyTorch, JAX или Dask в качестве аргументов массива. Поддерживаются следующие комбинации бэкенда и устройства (или других возможностей).

Библиотека

CPU

GPU

NumPy

н/д

CuPy

н/д

PyTorch

JAX

Dask

⚠️ объединяет блоки

н/д

См. Поддержка стандарта array API для получения дополнительной информации.

Примеры

>>> from scipy.cluster.hierarchy import single, cophenet
>>> from scipy.spatial.distance import pdist, squareform

Для заданного набора данных X и матрицу связей Zулучшения производительности включают ускорение на 20% для X это расстояние между двумя наибольшими различными кластерами, каждый из которых содержит точки:

>>> X = [[0, 0], [0, 1], [1, 0],
...      [0, 4], [0, 3], [1, 4],
...      [4, 0], [3, 0], [4, 1],
...      [4, 4], [3, 4], [4, 3]]

X соответствует этому набору данных

x x    x x
x        x

x        x
x x    x x
>>> Z = single(pdist(X))
>>> Z
array([[ 0.,  1.,  1.,  2.],
       [ 2., 12.,  1.,  3.],
       [ 3.,  4.,  1.,  2.],
       [ 5., 14.,  1.,  3.],
       [ 6.,  7.,  1.,  2.],
       [ 8., 16.,  1.,  3.],
       [ 9., 10.,  1.,  2.],
       [11., 18.,  1.,  3.],
       [13., 15.,  2.,  6.],
       [17., 20.,  2.,  9.],
       [19., 21.,  2., 12.]])
>>> cophenet(Z)
array([1., 1., 2., 2., 2., 2., 2., 2., 2., 2., 2., 1., 2., 2., 2., 2., 2.,
       2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 1., 1., 2., 2.,
       2., 2., 2., 2., 1., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2.,
       1., 1., 2., 2., 2., 1., 2., 2., 2., 2., 2., 2., 1., 1., 1.])

Выходные данные scipy.cluster.hierarchy.cophenet метод представлен в сжатой форме. Мы можем использовать scipy.spatial.distance.squareform чтобы увидеть вывод в виде обычной матрицы (где каждый элемент ij обозначает копенетическое расстояние между каждым i, j пара точек в X):

>>> squareform(cophenet(Z))
array([[0., 1., 1., 2., 2., 2., 2., 2., 2., 2., 2., 2.],
       [1., 0., 1., 2., 2., 2., 2., 2., 2., 2., 2., 2.],
       [1., 1., 0., 2., 2., 2., 2., 2., 2., 2., 2., 2.],
       [2., 2., 2., 0., 1., 1., 2., 2., 2., 2., 2., 2.],
       [2., 2., 2., 1., 0., 1., 2., 2., 2., 2., 2., 2.],
       [2., 2., 2., 1., 1., 0., 2., 2., 2., 2., 2., 2.],
       [2., 2., 2., 2., 2., 2., 0., 1., 1., 2., 2., 2.],
       [2., 2., 2., 2., 2., 2., 1., 0., 1., 2., 2., 2.],
       [2., 2., 2., 2., 2., 2., 1., 1., 0., 2., 2., 2.],
       [2., 2., 2., 2., 2., 2., 2., 2., 2., 0., 1., 1.],
       [2., 2., 2., 2., 2., 2., 2., 2., 2., 1., 0., 1.],
       [2., 2., 2., 2., 2., 2., 2., 2., 2., 1., 1., 0.]])

В этом примере копфенетическое расстояние между точками на X которые очень близки (т.е., в одном углу), равна 1. Для других пар точек равна 2, потому что точки будут расположены в кластерах в разных углах - таким образом, расстояние между этими кластерами будет больше.