Подтвердить что ты не робот

Проблема с иерархической кластеризацией в 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 - pearson. Есть идеи по этому поводу?

спасибо.

4b9b3361

Ответ 1

Есть несколько прекрасных проблем с плавающей точкой. Если вы посмотрите на результаты pdist, вы обнаружите, что в них очень маленькие отрицательные числа (-2.22044605e-16). По существу, они должны быть равны нулю. Вы можете использовать функцию numpy clip, чтобы справиться с ней, если хотите.

Ответ 2

Если вы получили ошибку

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