使用numpy缩小矩阵的大小

2024-10-01 13:42:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须创建一个用户和电视节目的相邻列表,其中行是用户,电视节目是列。如果用户关注这个电视节目,那么矩阵中就会有1,否则就是0。我已经从twitter上收集到了这些信息。总共有140个电视节目和大约530000个独立用户。我使用以下代码,使用python生成矩阵:

  • NoTvShows:电视节目总数(ID)
  • 唯一用户:所有唯一用户
  • 收集的用户:这是一个列表列表。子列表对应于电视节目,并列出了关注者的ID。在
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并生成约化矩阵。在

我希望有人能在这方面指导我

谢谢你

里奇


Tags: 代码用户inid列表formain矩阵
3条回答

您可能需要使用sparse matrix来减少空间。我为scipy找到了这个:http://docs.scipy.org/doc/scipy/reference/sparse.html

我希望这就是你的意思。在

如果你感兴趣,这里有另一种方法。它假定用户是按存储顺序排列的,但可以是数字或字符串ID:

# The setup
users = ['bob', 'dave', 'steve']
users = np.array(users)
collected_users = [['bob'], ['dave'], ['steve', 'dave'], ['bob', 'steve', 'dave']]
NoTvShows = len(collected_users)

# The meat
matrix = np.zeros((NoTvShows, len(users)), 'bool')
for i, watches in enumerate(collected_users):
    index = users.searchsorted(watches)
    matrix[i, index] = 1

稀疏矩阵(如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类型的技术,一个主题模型,也许是基于聚类的东西。。。。如果你唯一担心的是构建矩阵需要很长时间,那么这一点也没有帮助(因为这些技术通常需要完整的原始矩阵,然后给你一个低维版本)。试试我的建议,如果还不够好的话,试试稀疏矩阵,然后再考虑减少数据的奇特方法(可能是通过学习数据子集的维数缩减,然后构造其余的)。在

相关问题 更多 >