Python:Scipy的Dendogram不起作用

时间:2018-01-28 12:02:35

标签: python scipy hierarchical-clustering

我想使用scipy的树形图。 我有以下数据:

我有一个有七种不同方法的清单。例如:

Y = [71.407452200146807, 0, 33.700136456196823, 1112.3757110973756, 31.594949722819372, 34.823881975554166, 28.36368420190157]

每个均值是针对不同的用户计算的。例如:

X = ["user1", "user2", "user3", "user4", "user5", "user6", "user7"]

我的目标是借助dendorgram显示上述数据。

我尝试了以下内容:

Y = [71.407452200146807, 0, 33.700136456196823, 1112.3757110973756, 31.594949722819372, 34.823881975554166, 28.36368420190157]
X = ["user1", "user2", "user3", "user4", "user5", "user6", "user7"]

# Attempt with matrix
#X = np.concatenate((X, Y),)
#Z = linkage(X)

Z = linkage(Y)
# Plot the dendogram with the results above
dendrogram(Z, leaf_rotation=45., leaf_font_size=12. , show_contracted=True)
plt.style.use("seaborn-whitegrid")
plt.title("Dendogram to find clusters")
plt.ylabel("Distance")
plt.show()

但它说:

  

ValueError:浓缩距离矩阵'y'的长度n必须是二项式系数,即必须是k,使得(k \选择2)= n)!

我已经尝试将数据转换为矩阵。用:

# Attempt with matrix
#X = np.concatenate((X, Y),)
#Z = linkage(X)

但这也行不通!

有什么建议吗?

谢谢: - )

2 个答案:

答案 0 :(得分:2)

linkage的第一个参数是n x m数组,表示m维空间中的n个点,或者是包含condensed distance matrix的一维数组。这是两个非常不同的含义!第一个是“原始数据”,即“观察”。第二种格式假设您已经计算了观察值之间的所有距离,并且您将这些距离提供给linkage,而不是原始点。

看起来你想要第一种情况(原始数据),m = 1.所以你必须重新整形输入才能有形状(n,1)。

替换它:

Z = linkage(Y)

使用:

Z = linkage(np.reshape(Y, (len(Y), 1)))

答案 1 :(得分:1)

所以你在Y len(Y)= 7中使用了7个观察值。

但根据Linkage的文档,观察次数len(Y)应该是这样的。

{n \choose 2} = len(Y)

表示

1/2 * (n -1) * n = len(Y)

所以Y的长度应该是n是有效整数。