Python 树状图必须有一个 k 使得 (k \choose 2)=n)
Python dendrogram there must be a k such that (k \choose 2)=n)
我试图在 Python 中制作一个树状图,它采用一些数据的中值,然后允许我计算中值之间的欧几里得距离。
我的一些数据最终为负值,所以我必须获得绝对值并抵消所有中位数。
如果我只有 3 个值要比较,它似乎工作正常,但出于某种原因,如果我有 4 个或 5 个值,它会给我一个 "there must be a k such that (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)
我认为问题出在联动功能上。对于联动函数:"a collection of m observation vectors in n dimensions may be passed as an m by n array."
所以我通过重塑你的 df 数组创建了一个新的测试变量:
test = df.reshape(len(df),1)
然后将这个新变量传递给您的树状图函数:
dend = shc.dendrogram(shc.linkage(test, metric='euclidean'),
orientation='left', leaf_font_size=8, labels=headings)
我试图在 Python 中制作一个树状图,它采用一些数据的中值,然后允许我计算中值之间的欧几里得距离。 我的一些数据最终为负值,所以我必须获得绝对值并抵消所有中位数。
如果我只有 3 个值要比较,它似乎工作正常,但出于某种原因,如果我有 4 个或 5 个值,它会给我一个 "there must be a k such that (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)
我认为问题出在联动功能上。对于联动函数:"a collection of m observation vectors in n dimensions may be passed as an m by n array."
所以我通过重塑你的 df 数组创建了一个新的测试变量:
test = df.reshape(len(df),1)
然后将这个新变量传递给您的树状图函数:
dend = shc.dendrogram(shc.linkage(test, metric='euclidean'), orientation='left', leaf_font_size=8, labels=headings)