如何在python hcluster中使用稀疏矩阵?

时间:2010-12-05 19:53:13

标签: python sparse-matrix linkage hcluster

我正在尝试在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 guru的建议如何 做到了吗?

  2. 给使用python的人 hcluster,我需要处理巨大的 数据量,数百行, 在hcluster中可以做到吗? 该算法真正产生正确的 HAC?

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

1 个答案:

答案 0 :(得分:2)

将每个输入表示为字典,从要素名称到值。字典中没有零。

自己计算Y矩阵,而不是使用hcluster.pdist。以下代码执行稀疏平方误差。平方误差等于余弦距离 IF ,你可以对所有特征向量进行标准化。

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的表单。