如何在Python的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使用的是反向值,比如我用0表示A不等于C,用1表示A等于D
sqfrm = squareform(matrix)
Y = pdist(sqfrm, metric="cosine")
链接 Y
Z = linkage(Y, method="complete")
所以,矩阵Z是我需要的(如果我正确使用了hcluster的话?)
但是我遇到了以下问题:
我想使用稀疏矩阵来处理大量输入数据,因为生成输入数据非常耗时。现在,我需要从另一种语言导入数据到Python,这就是我需要读取文本文件的原因。请问,Python高手们能建议我该怎么做吗?
对于那些使用过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
的格式。