我必须创建一个用户和电视节目的相邻列表,其中行是用户,电视节目是列。如果用户关注这个电视节目,那么矩阵中就会有1,否则就是0。我已经从twitter上收集到了这些信息。总共有140个电视节目和大约530000个独立用户。我使用以下代码,使用python生成矩阵:
for i in range(0,NoTvShows):
for every_user in unique_users:
if every_user in collected_users[i]:
matrix.append(1)
else:
matrix.append(0)
main_matrix.append(matrix)
matrix = []
the_matrix = zip(*main_matrix)
simplejson.dump(the_matrix,fwrite)
fwrite.close()
当我尝试在服务器上执行我的程序时,它会崩溃,因为它需要大量的时间和内存。我知道我可以用numpy缩小矩阵的大小,然后用它来计算用户之间的相似度。但是,我不确定如何在这段代码中编码numpy并生成约化矩阵。在
我希望有人能在这方面指导我
谢谢你
里奇
您可能需要使用sparse matrix来减少空间。我为scipy找到了这个:http://docs.scipy.org/doc/scipy/reference/sparse.html
我希望这就是你的意思。在
如果你感兴趣,这里有另一种方法。它假定用户是按存储顺序排列的,但可以是数字或字符串ID:
稀疏矩阵(如suggested by @phg)很好,因为矩阵中的大多数条目可能是0(假设大多数用户只关注少数电视节目)。在
不过,可能更重要的是,构建矩阵的方法非常低效(生成大量python列表并四处复制),而不仅仅是将它们放在一个紧凑的numy数组中。另外,您要花费大量的时间搜索列表(使用
in
语句),而这对循环来说根本不是必需的。在这段代码循环遍历跟随者列表,并在
user_ids
字典中查找每个id的用户。您可以非常简单地将其调整为稀疏矩阵类(我想只要将np.zeros
切换为scipy.sparse.coo_matrix
)。在一旦你有了矩阵,你就真的,真的不想把它保存为JSON,除非你必须这样做:对于数值矩阵来说,这是一种非常浪费的格式。^{} 如果只在numpy中再次使用数据矩阵,则最好使用它。}加上空格或换行符),我认为json至少使用三个字节(逗号、空格,每行加上一些括号)。在
numpy.savetxt
也可以工作,至少消除了方括号和逗号,并且在写入时可能会有更少的内存开销。但是当你有一个0-1矩阵并且它是布尔数据类型时,numpy.save
每个矩阵元素只需要一个位,numpy.savetxt
需要两个字节=16位(ascii'0'
或{你也可能在谈论降维技术。这也是很有可能的;有很多技术可以将你的140维向量(电视节目都是这样的)降到低维,要么是某种PCA类型的技术,一个主题模型,也许是基于聚类的东西。。。。如果你唯一担心的是构建矩阵需要很长时间,那么这一点也没有帮助(因为这些技术通常需要完整的原始矩阵,然后给你一个低维版本)。试试我的建议,如果还不够好的话,试试稀疏矩阵,然后再考虑减少数据的奇特方法(可能是通过学习数据子集的维数缩减,然后构造其余的)。在
相关问题 更多 >
编程相关推荐