3

我正在尝试在 python 中使用 hcluster 库。我没有足够的 Python 知识在 hcluster 中使用稀疏矩阵。请任何人帮助我。所以,我在做什么:

import os.path
import numpy
import scipy
import scipy.io 
from hcluster import squareform, pdist, linkage, complete 
from hcluster.hierarchy import linkage, from_mlab_linkage 
from numpy import savetxt 
from StringIO import StringIO 

data.dmp 包含的矩阵如下:

  A B C D
A 0 1 0 1 
B 1 0 0 1 
C 0 0 0 0 
D 1 1 0 0 

并且只包含矩阵的右上部分。我不知道如何正确拼写英文:) 所以,所有数字都高于主对角线所以 data.dmp 包含: 1 0 1, 0 1 , 0

f = file('data.dmp','r')  
s = StringIO(f.readline()).getvalue()
f.close()

matrix = numpy.asarray(eval("["+s+"]"))

由于我未知的原因,hcluster 使用反转值,例如如果 A!=C 我使用 0,如果 A == D 使用 1

sqfrm = squareform(matrix)
Y = pdist(sqfrm, metric="cosine")

连锁Y

Z = linkage(Y, method="complete")

所以,矩阵 Z 是我需要的(如果我正确使用了 hcluster?)

但我有下一个问题:

  1. 我想对大量输入数据使用稀疏矩阵,因为像现在这样生成输入数据很耗时,我需要从另一种语言将数据导入 python,这就是我需要读取文本文件的原因。请好心,python大师的建议如何制作?

  2. 对于使用 python hcluster 的人,我需要处理大量数据,数百行,可以在 hcluster 中完成吗?这个算法真的能产生正确的HAC吗?

感谢您的阅读,感谢您的帮助!

4

1 回答 1

2

将每个输入表示为字典,从特征名称到值。字典中不存在零。

自己计算 Y 矩阵,而不是使用hcluster.pdist. 以下代码执行稀疏平方误差。如果您对所有特征向量进行 l2 归一化,则平方误差等效于余弦距离。

def sqrerr(repr1, repr2):
    """
    Compute the sqrerr between two reprs.
    The reprs are each a dict from feature to feature value.
    """
    keys = frozenset(repr1.keys() + repr2.keys())
    sqrerr = 0.
    for k in keys:
        diff = repr1.get(k, 0.) - repr2.get(k, 0.)
        sqrerr += diff * diff
    return sqrerr

您应该为要计算的每个 Y[i,j] 元素调用 sqrerr。

将 Y 设为方阵,并确保 Y[i,j] == Y[j,i]。使用方法hcluster.squareform将 Y 转换为适合hcluster.linkage.

于 2011-01-17T19:27:05.923 回答