Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何读取scipy层次结构集群的内容_Python_Scipy_Hierarchical Clustering - Fatal编程技术网

Python 如何读取scipy层次结构集群的内容

Python 如何读取scipy层次结构集群的内容,python,scipy,hierarchical-clustering,Python,Scipy,Hierarchical Clustering,我有下面的代码,我用它进行分层聚类。我的数据对象是我先前计算的相似距离数组。我认为我正确地执行了集群。我以为我可以得到集群的叶子,但当我将其与原始输入进行比较时,我得到了一个不匹配的结果 我这里有两个问题: 为什么集群的叶子和实际输入数据不匹配 如何通过链接矩阵或clusternodes从簇中提取原始数据 import numpy as np import pandas import scipy.cluster.hierarchy as sch def list_difference(list

我有下面的代码,我用它进行分层聚类。我的数据对象是我先前计算的相似距离数组。我认为我正确地执行了集群。我以为我可以得到集群的叶子,但当我将其与原始输入进行比较时,我得到了一个不匹配的结果

我这里有两个问题:

为什么集群的叶子和实际输入数据不匹配

如何通过链接矩阵或clusternodes从簇中提取原始数据

import numpy as np
import pandas
import scipy.cluster.hierarchy as sch

def list_difference(list1, list2):
    return [value for value in list1 if value not in list2]


if __name__ == '__main__':

    # example data for this questions purpose.
    data = [10, 11, 29, 288, 16]

    X = np.array([[i] for i in data])
    linkage_matrix = sch.average(X)
    rootnode, nodelist = sch.to_tree(linkage_matrix, rd=True)

    leaves = sch.leaves_list(linkage_matrix)
    print(list_difference(leaves, data))
我要检索每个群集的原始数据点。

给定您的数据

data = [10, 11, 29, 288, 16]
结果与树状图一致

sch.dendrogram(linkage_matrix);

通过分析链接矩阵,我们可以确认

print(linkage_matrix)

array([[  0.        ,   1.        ,   1.        ,   2.        ],
       [  4.        ,   5.        ,   5.5       ,   3.        ],
       [  2.        ,   6.        ,  16.66666667,   4.        ],
       [  3.        ,   7.        , 271.5       ,   5.        ]])
一排一排地

  • 元素0和元素1,在具有2个元素的簇中距离为1(该簇将称为5)
  • 元素4和聚集元素5(上一个),距离为5.5和3个元素(此群集称为6)
  • 元素2和聚集元素6(上一个),距离为16.667和4个元素(此群集称为7)
  • 元素3与群集元素7(上一个),距离271.5和5个元素

请修复您的代码我更新了代码。谢谢您的回答!现在这很有意义!!那么,您如何推断第一个簇将被称为5,并且只有链接矩阵作为输入数据?YVW。第一个集群将被称为5(在本例中),因为您有5个元素{0,1,2,3,4}。所以“下一个可用名称”是5。第二个集群将被称为6,依此类推,直到第pth集群。假设有n个元素,pth簇称为(n-1)+p,p=[1,2,…]。仅使用链接矩阵,您可以看到5是一个集群名称(即使您不知道元素的数量),因为它包含两个以上的元素。对不起,我的意思是“因为它所聚集的集群包含两个以上的元素”