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

3 投票
1 回答
1182 浏览
提问于 2025-04-16 08:05

我正在尝试在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使用的是反向值,比如我用0表示A不等于C,用1表示A等于D

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

链接 Y

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

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

但是我遇到了以下问题:

  1. 我想使用稀疏矩阵来处理大量输入数据,因为生成输入数据非常耗时。现在,我需要从另一种语言导入数据到Python,这就是我需要读取文本文件的原因。请问,Python高手们能建议我该怎么做吗?

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

谢谢你的阅读,我非常感谢任何帮助!

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的格式。

撰写回答