稀疏矩阵(如suggested by @phg)很好,因为矩阵中的大多数条目可能是0(假设大多数用户只关注少数电视节目)。在
不过,可能更重要的是,构建矩阵的方法非常低效(生成大量python列表并四处复制),而不仅仅是将它们放在一个紧凑的numy数组中。另外,您要花费大量的时间搜索列表(使用in语句),而这对循环来说根本不是必需的。在
这段代码循环遍历跟随者列表,并在user_ids字典中查找每个id的用户。您可以非常简单地将其调整为稀疏矩阵类(我想只要将np.zeros切换为scipy.sparse.coo_matrix)。在user_ids = dict((user, i) for i, user in enumerate(unique_users))
follower_matrix = np.zeros(NoTvShows, len(unique_users), dtype=bool)
for show_idx, followers in enumerate(collected_users):
for user in followers:
follower_matrix[show_idx, user_ids[user]] = 1
一旦你有了矩阵,你就真的,真的不想把它保存为JSON,除非你必须这样做:对于数值矩阵来说,这是一种非常浪费的格式。^{}如果只在numpy中再次使用数据矩阵,则最好使用它。numpy.savetxt也可以工作,至少消除了方括号和逗号,并且在写入时可能会有更少的内存开销。但是当你有一个0-1矩阵并且它是布尔数据类型时,numpy.save每个矩阵元素只需要一个位,numpy.savetxt需要两个字节=16位(ascii '0'或{}加上空格或换行符),我认为json至少使用三个字节(逗号、空格,每行加上一些括号)。在
你也可能在谈论降维技术。这也是很有可能的;有很多技术可以将你的140维向量(电视节目都是这样的)降到低维,要么是某种PCA类型的技术,一个主题模型,也许是基于聚类的东西。。。。如果你唯一担心的是构建矩阵需要很长时间,那么这一点也没有帮助(因为这些技术通常需要完整的原始矩阵,然后给你一个低维版本)。试试我的建议,如果还不够好的话,试试稀疏矩阵,然后再考虑减少数据的奇特方法(可能是通过学习数据子集的维数缩减,然后构造其余的)。在