Проблема с иерархической кластеризацией в Python
Я делаю иерархическую кластеризацию 2-мерной матрицы по метрике корреляционного расстояния (т.е. 1 - корреляция Пирсона). Мой код следующий (данные находятся в переменной с именем "данные"):
from hcluster import *
Y = pdist(data, 'correlation')
cluster_type = 'average'
Z = linkage(Y, cluster_type)
dendrogram(Z)
Я получаю ошибку:
ValueError: Linkage 'Z' contains negative distances.
Что вызывает эту ошибку? Матрица "данные", которую я использую, просто:
[[ 156.651968 2345.168618]
[ 158.089968 2032.840106]
[ 207.996413 2786.779081]
[ 151.885804 2286.70533 ]
[ 154.33665 1967.74431 ]
[ 150.060182 1931.991169]
[ 133.800787 1978.539644]
[ 112.743217 1478.903191]
[ 125.388905 1422.3247 ]]
Я не понимаю, как pdist мог выдавать отрицательные числа, когда брал 1 - корреляцию Пирсона. Есть идеи по этому поводу?
благодарю вас.
1 ответ
Есть некоторые прекрасные проблемы с плавающей точкой. Если вы посмотрите на результаты pdist, то обнаружите, что в них есть очень маленькие отрицательные числа (-2.22044605e-16). По сути, они должны быть нулевыми. Вы можете использовать функцию клипов Numpy, чтобы справиться с ней, если хотите.
Если вы получали ошибку
KeyError: -428
и ваш код был в строках
import matplotlib.pyplot as plt
import matplotlib as mpl
%matplotlib inline
from scipy.cluster.hierarchy import ward, dendrogram
linkage_matrix = ward(dist) #define the linkage_matrix using ward clustering pre-computed distances
fig, ax = plt.subplots(figsize=(35, 20),dpi=400) # set size
ax = dendrogram(linkage_matrix, orientation="right",labels=queries);
`Это связано с несовпадением индексов запросов.
Возможно, вы захотите обновить до
ax = dendrogram(linkage_matrix, orientation="right",labels=list(queries));