首先,我想总结一下我是如何得出这个问题的。我想使用协同过滤方法创建一个歌曲推荐器。但问题是,我手头有一个非常大的数据集,1 m行x 2.2m列。如果我的理解是正确的,我需要创建一个稀疏矩阵,以便推进我的想法。因为我不知道有什么东西可以容纳大小为1 m x 2.2m的矩阵。* 因此,稀疏矩阵。
现在,由于这个矩阵的单元格中只包含1或0,我已经以某种方式绘制出了哪些单元格应该包含1,如果我要创建一个假设的怪物矩阵的话。
| 列|位置|
| - -|- -|
| 行1|【56110,78999,1508886,2090010】|
| 行2|【1123,976554】|
| 一个人。|一个人。|
| 行1000000|【334555,2200100】|
问题是,我不知道如何利用这些信息创建稀疏矩阵。我查了很多资料,但没有找到任何可行的解决方案。如果你能帮助我,我将非常感谢。另外,如果你有任何关于利用稀疏矩阵的协同过滤方法的说明,我也将非常感谢。
1条答案
按热度按时间sigwle7e1#
有几种方法可以做到这一点。这里有一个创建
csr_matrix
的方法,因为您显示的数据接近于此格式。(该文档字符串对csr_matrix
属性data
进行了简要说明,indices
和indptr
。)这是否是最佳方法(对于“最佳”的某些定义)取决于数据的实际“原始”形式(以及其他因素)。我假设您可以将
locations
列中显示的数据放入一个名为locations
的列表中。即使列表为空,locations
中的 * 每行 * 都有一个条目,这一点很重要。我还假设locations
中给出的值是从0开始的索引,对应于矩阵的列。下面是一个示例:形成具有形状(5,8)阵列。为了形成
indptr
,我们计算列表的长度的累积和,并且预先挂起0:indices
只是locations
的扁平化版本。请注意,下面的sum()
是Python内置的sum()
函数,而不是np.sum
。该函数调用连接了locations
中的所有列表。数组的数据是一个长度与索引相同的1数组:
现在我们已经有了创建SciPy
csr_matrix
所需的所有部分: