Проблема с иерархической кластеризацией в 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));
Другие вопросы по тегам