稀疏观测矩阵上的层次聚类

5

我正在尝试对一个大型稀疏的观测矩阵进行分层聚类。该矩阵表示一些用户对电影评分的情况。 我的目标是基于他们对电影的偏好来聚类相似的用户。但是,我需要一个树状图而不是单一的分类。为此,我尝试使用SciPy

R = dok_matrix((nrows, ncols), dtype=np.float32)

for user in ratings:
    for item in ratings[user]:
        R[item, user] = ratings[user][item]

Z = hierarchy.linkage(R.transpose().toarray(), method='ward')

对于小数据集,这个方法运行良好:

enter image description here

然而,当扩大规模时会出现内存问题。 有没有办法将 稀疏 矩阵输入算法中呢?


1
你在使用哪个包进行聚类?代码及其文档将会告诉我们它是否能够处理稀疏矩阵。一些 scikit-learn 的函数可以处理稀疏矩阵,但并非全部。 - hpaulj
你是否正在使用一维压缩距离矩阵? - rafaelvalle
不,我使用观察矩阵,而不是距离。 - Siegmeyer
我知道,但这是一种不同类型的问题。我没有距离信息,只有(样本x特征)矩阵。 - Siegmeyer
它会引发“ValueError:必须传递2维数组”,不允许我传递除ndarray之外的任何东西。 - Siegmeyer
显示剩余7条评论
1个回答

1

scipy/cluster/hierarchy.py 中的 linkage 函数将参数 y 处理为:

y = _convert_to_double(np.asarray(y, order='c'))

if y.ndim == 1:
    distance.is_valid_y(y, throw=True, name='y')
    [y] = _copy_arrays_if_base_present([y])
elif y.ndim == 2:
    if method in _EUCLIDEAN_METHODS and metric != 'euclidean':
        raise ValueError("Method '{0}' requires the distance metric "
                         "to be Euclidean".format(method))
    y = distance.pdist(y, metric)
else:
    raise ValueError("`y` must be 1 or 2 dimensional.")

当我将`asarray`应用于`dok`时,我会得到一个0d对象数组。 它只是将字典包装在数组中。
In [905]: M=sparse.dok_matrix([[1,0,0,2,3],[0,0,0,0,1]])
In [906]: M
Out[906]: 
<2x5 sparse matrix of type '<class 'numpy.int32'>'
    with 4 stored elements in Dictionary Of Keys format>
In [908]: m = np.asarray(M)
In [909]: m
Out[909]: 
array(<2x5 sparse matrix of type '<class 'numpy.int32'>'
    with 4 stored elements in Dictionary Of Keys format>, dtype=object)
In [910]: m.shape
Out[910]: ()

linkage 接受一个一维压缩风格的距离矩阵或等效的二维矩阵。

深入了解 linkage 后,我推断出 ward 使用了 nn_chain,它在编译后的 scipy/cluster/_hierarchy.cpython-35m-i386-linux-gnu.so 文件中。这使得该方法的工作部分更加难以接近普通的 Python 程序员。


好吧,太遗憾了。感谢你的帮助。我想我必须转而使用其他东西了。 - Siegmeyer
我想知道压缩稀疏图包是否有任何有用的东西,https://docs.scipy.org/doc/scipy-0.19.0/reference/sparse.csgraph.html - hpaulj
这个有进展了吗?我的当前解决方案是并行迭代单个向量。 - sdgaw erzswer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接