Python树状图必须有一个k使得(k \ choose 2)= n)

时间:2019-02-28 06:29:36

标签: python dendrogram

我试图用Python制作树状图,以获取某些数据的中值,然后允许我计算中值之间的欧几里得距离。 我的某些数据最终变为负值,因此我必须获取绝对值并抵消所有中位数。

如果我只有3个值进行比较,这似乎很好用,但是由于某种原因,如果我有4个或5个值,它给我一个错误:“必须是ak使得(k \ choose 2)= n) “但是,如果我有6个值,则仅给出最后4个值的树状图。

我正在使用Python 3.7.1,有人知道是否存在某种错误吗?原因我无法理解我的代码适用于3个值,不适用于4或5个值,并且如果我有6个值,则给出最后4个值的树状图。

import numpy as np
import matplotlib.pyplot as plt
import scipy.cluster.hierarchy as shc

#Calculate the median values of each group & make an array
a=10
b=-2
c=5
d=2.1
data = np.array([a,b,c,d])

#Find the lowest value because you can't make a dendrogram with a negative number
low = np.min(data)

#Offset data by the absolute of the lowest value +1, cause a 0 value won't work on a dendrogram
offset = abs(low) + 1
offset_array = []

# v = value, add offset to all values & save as an array
for v in data:
    offset_array.append(v+offset)

#Make an array of the offset values to calculate distances
cluster = np.array(offset_array)

# Labels for each value
#headings = ['a', 'b', 'c', 'd']

df = np.array(cluster)

#Size of figure (x, y)
plt.figure(figsize=(5, 5))
ax = plt.subplot()
#Change x axis range as required
dt = 0.01
ax.semilogx(dt, np.exp(dt))
plt.title('Gram positive distance')
plt.xlabel('Euclidean distance')

dend = shc.dendrogram(shc.linkage(df, metric='euclidean'),
                      orientation='left', leaf_font_size=8, labels=headings)

1 个答案:

答案 0 :(得分:0)

我认为问题在于链接功能。对于链接功能:“可以将n个维度上的m个观察向量的集合作为m x n数组传递。”

因此,我通过重塑df数组来制作了一个新的测试变量:

  

test = df.reshape(len(df),1)

然后将这个新变量传递给树状图函数:

  

dend = shc.dendrogram(shc.linkage(test,metric ='euclidean'),                         direction ='left',leaf_font_size = 8,labels =标题)