scipy 如何根据坐标信息创建稀疏矩阵?

ar5n3qh5  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(102)

首先,我想总结一下我是如何得出这个问题的。我想使用协同过滤方法创建一个歌曲推荐器。但问题是,我手头有一个非常大的数据集,1 m行x 2.2m列。如果我的理解是正确的,我需要创建一个稀疏矩阵,以便推进我的想法。因为我不知道有什么东西可以容纳大小为1 m x 2.2m的矩阵。* 因此,稀疏矩阵。
现在,由于这个矩阵的单元格中只包含1或0,我已经以某种方式绘制出了哪些单元格应该包含1,如果我要创建一个假设的怪物矩阵的话。
| 列|位置|
| - -|- -|
| 行1|【56110,78999,1508886,2090010】|
| 行2|【1123,976554】|
| 一个人。|一个人。|
| 行1000000|【334555,2200100】|
问题是,我不知道如何利用这些信息创建稀疏矩阵。我查了很多资料,但没有找到任何可行的解决方案。如果你能帮助我,我将非常感谢。另外,如果你有任何关于利用稀疏矩阵的协同过滤方法的说明,我也将非常感谢。

sigwle7e

sigwle7e1#

有几种方法可以做到这一点。这里有一个创建csr_matrix的方法,因为您显示的数据接近于此格式。(该文档字符串对csr_matrix属性data进行了简要说明,indicesindptr。)这是否是最佳方法(对于“最佳”的某些定义)取决于数据的实际“原始”形式(以及其他因素)。
我假设您可以将locations列中显示的数据放入一个名为locations的列表中。即使列表为空,locations中的 * 每行 * 都有一个条目,这一点很重要。我还假设locations中给出的值是从0开始的索引,对应于矩阵的列。下面是一个示例:形成具有形状(5,8)阵列。

In [23]: locations = [[2, 3], [], [1, 3, 5], [0, 1, 7], [7]]

为了形成indptr,我们计算列表的长度的累积和,并且预先挂起0:

In [28]: lengths = np.array([len(t) for t in locations])

In [29]: lengths
Out[29]: array([2, 0, 3, 3, 1])

In [30]: indptr = np.concatenate(([0], lengths.cumsum()))

In [31]: indptr
Out[31]: array([0, 2, 2, 5, 8, 9])

indices只是locations的扁平化版本。请注意,下面的sum()是Python内置的sum()函数,而不是np.sum。该函数调用连接了locations中的所有列表。

In [32]: indices = sum(locations, start=[])

In [33]: indices
Out[33]: [2, 3, 1, 3, 5, 0, 1, 7, 7]

数组的数据是一个长度与索引相同的1数组:

In [38]: data = np.ones_like(indices)

现在我们已经有了创建SciPy csr_matrix所需的所有部分:

In [39]: from scipy.sparse import csr_matrix

In [40]: A = csr_matrix((data, indices, indptr))

In [41]: A
Out[41]: 
<5x8 sparse matrix of type '<class 'numpy.int64'>'
    with 9 stored elements in Compressed Sparse Row format>

In [42]: A.toarray()
Out[42]: 
array([[0, 0, 1, 1, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0],
       [0, 1, 0, 1, 0, 1, 0, 0],
       [1, 1, 0, 0, 0, 0, 0, 1],
       [0, 0, 0, 0, 0, 0, 0, 1]])

相关问题