我現在正在做python集羣使用from scipy.cluster.hierarchy import linkage
從手冊我知道,它給這種形式的結果 - > [A,B,長度,#] 其中A和B是要去的元素的索引在這個階段(?)中合併,但是我可以獲得關於已經合併但不參與此階段的集羣的任何信息嗎?如何在使用單個連接算法時列出當前所有的羣集?
例如,我的數據集是
A=[[1,1],[1,2],[1,3],[1,4],[1,5], [10,1],[10,2],[10,3],[10,4],[10,5], [15,1],[15,2],[15,3],[15,4],[15,5], [30,1],[30,2],[30,3],[30,4],[30,5]]
,並在其上
Z = linkage(A, 'single')
Z=[[ 0. 4. 1. 2.]
[ 1. 20. 1. 3.]
[ 2. 21. 1. 4.]
[ 3. 22. 1. 5.]
[ 17. 19. 1. 2.]
[ 5. 9. 1. 2.]
[ 6. 25. 1. 3.]
[ 7. 26. 1. 4.]
[ 8. 27. 1. 5.]
[ 18. 24. 1. 3.]
[ 10. 14. 1. 2.]
[ 11. 30. 1. 3.]
[ 12. 31. 1. 4.]
[ 13. 32. 1. 5.]
[ 16. 29. 1. 4.]
[ 15. 34. 1. 5.]
[ 28. 33. 5. 10.]
[ 23. 36. 9. 15.]
[ 35. 37. 15. 20.]]
這裏我選擇5是在集羣的距離限制申請單鏈接算法,所以我得到
[ 28. 33. 5. 10.]
然後我追查28和33返回到原始索引
cut = 5
temp1 = []
temp2 = []
for i in range(len(Z)):
if Z[i][2] >= cut:
temp1.append(Z[i])
for i in range(2):
temp2[i].append(int(temp1[0][i]))
for j in range(0, len(temp2)):
try:
g = max(temp2[j])
except:
continue
G = int(g - len(A))
while g >= len(A):
ind = temp2[j].index(g)
temp2[j].append(int(Z[G][0]))
temp2[j].append(int(Z[G][1]))
del temp2[j][ind]
g = max(temp2[j])
G = int(g - len(A))
,發現
temp2 = [[8, 7, 6, 5, 9], [13, 12, 11, 10, 14]]
這意味着「28」代表點[10,1],[10,2],[10,3],[10,4],[10,5]
和「33」代表點[15,1],[15,2],[15,3],[15,4],[15,5]
,這顯然意味着該集羣由[10,x]組成,並且由[15,x]組成的集羣將在此階段合併。
但顯然[1,1],[1,2],[1,3],[1,4],[1,5]
和[30,1],[30,2],[30,3],[30,4],[30,5]
必須在早期階段,已經形成了另外兩個集羣,所以此刻的前[10,X]和[15,X]合併,目前有4類
所以結果我想要就像
temp2 = [[8, 7, 6, 5, 9], [13, 12, 11, 10, 14], [0, 1, 2, 3, 4], [15, 16, 17, 18, 19]]
我應該怎麼做才能得到後面的兩個簇T^T? 感謝高級QQ
非常感謝!!!!!!這就是我正在尋找T^T 順便說一句,這不是一個問題,只是我很好奇,你最後輸出的那些L是什麼?我在結果中沒有得到這些L(但這很好) – Chu
@Xiadan:那些表示「長整數」。當我將numpy數組轉換爲列表時,這只是一些垃圾信息。如果您使用的是Python 3,它可能不會顯示,也可能不會顯示,具體取決於其他平臺的詳細信息(如64位與32位)。但是,正如你發現的那樣,它對結果沒有影響;它看起來很奇怪。 – BrenBarn
也感謝np.where部分T^T我知道必須有一種更聰明的方式將其轉換回索引列表。 – Chu