在我目前正在工作的项目中,大约有200,000名用户。对于这些用户中的每一个,我们针对其他用户定义了相似性度量。这产生200000x200000的相似性矩阵。有点大。计算每个条目的一种天真的方法(在Ruby中)需要几天时间。
我可以采用哪些策略来计算矩阵字段的可行性?我应该把这个野兽放在什么数据存储中?
答案 0 :(得分:3)
以下是答案的一些部分,你告诉我们允许一个好的答案仍有太多的空白,但你可以自己填写。从您告诉我们的所有内容来看,我认为您的任务的主要部分不是有效地计算大的相似度矩阵,我认为主要部分是从这样的矩阵中有效地检索值并有效地更新矩阵。
我们已经确定矩阵是稀疏对称的;知道稀疏是多么有用。这大大降低了存储需求,但我们不知道多少。
您已经告诉我们一些关于用户个人资料的更新但是您的相似性矩阵是否必须经常更新?我的期望(另一个假设)是,当用户修改他/她的个人资料时,相似性度量不会快速或急剧变化。由此我假设,使用几分钟(甚至几个小时)过时的相似性度量不会造成任何严重伤害。
我认为所有这些都将我们带入数据库领域,这应该支持快速访问您指定的卷的存储相似性度量。我希望对这些措施进行批量更新,并且只针对配置文件发生变化的用户采取措施,以适应您的需求和计算机电源的可用性。
至于初始创建相似度矩阵的第一个版本,那么如果在后台花了一个星期,你只需要做一次。
答案 1 :(得分:0)
该度量可能是对称的,因此您只需将矩阵的一半存储在数据库中。但这没有多大帮助。 如果你有很多对,你也可以避免存储测量为零的所有对。
仅存储将实际显示的数据,例如每个用户的前10名最近用户。
并为所有其他用户对即时计算相似性度量。
听起来像是一场保持最新的噩梦,甚至可能不存储任何东西。
答案 2 :(得分:0)
你可能不需要所有的对,所以我会选择稀疏矩阵表示。至于计算本身,您可以使用类似K-d tree或Octree(或该系列中的任何内容)或任何其他类型的空间分区方法,具体取决于您的功能集的属性(在你计算相似度)和你的相似度量。
答案 3 :(得分:0)
存储矩阵,尤其是根据矩阵进行计算是一场噩梦。您的相似性度量可能使用浮点数(4字节)。这意味着未压缩的存储大小为200000 ** 2 * 4字节= 160 GB。
有四个概念性的解决方案。
数据压缩:
数据精简:您可以对用户进行聚类,然后为聚类建立相似度矩阵。如果每个群集的大小为200,则您将只有1000x1000矩阵,因此仅需要4MB即可存储它。可能还有其他好处,例如速度和鲁棒性。
水平缩放:使用大型计算机。 Amazon has one with 2TB memory仅需3970 USD;-)
垂直缩放:构建块矩阵,这些块矩阵是准备处理的大矩阵的块。