繁体   English   中英

有效地计算大的相似度矩阵

[英]Efficiently calculate large similarity matrix

在我目前正在工作的项目中,大约有200,000名用户。 对于这些用户中的每一个,我们针对其他用户定义了相似性度量。 这产生200000x200000的相似性矩阵。 有点大。 计算每个条目的天真方法(在Ruby中)需要数天。

我可以采用哪些策略来计算矩阵字段的可行性? 我应该把这个野兽放在什么数据存储中?

以下是答案的一些部分,你告诉我们允许一个好的答案仍有太多的空白,但你可以填写自己的。 从您告诉我们的所有内容来看,我认为您的任务的主要部分不是有效地计算大的相似度矩阵,我认为主要部分是从这样的矩阵中有效地检索值并有效地更新矩阵。

正如我们已经确定的那样,矩阵是稀疏对称的; 知道稀疏是多么有用。 这大大降低了存储需求,但我们不知道多少。

您已经告诉我们一些关于用户配置文件的更新,但您的相似性矩阵是否必须经常更新? 我的期望(另一个假设)是,当用户修改他/她的个人资料时,相似性度量不会快速或急剧变化。 由此我假设,使用几分钟(甚至几个小时)过时的相似性测量不会造成任何严重伤害。

我认为所有这些都将我们带入数据库领域,这应该支持快速访问您指定的卷的存储相似性度量。 我希望对这些措施进行批量更新,并且只针对其配置文件已发生变化的用户采取措施,以适应您的需求和计算机电源的可用性。

至于初始创建相似度矩阵的第一个版本,那么如果在后台花了一个星期,那么你只需要做一次。

度量可能是对称的,因此您只需要将数据的一半存储在数据库中。 但这没有多大帮助。 如果你有很多对,你也可以避免存储测量为零的所有对。

仅存储将实际显示的数据,例如每个用户的前10个最近用户。

并为所有其他用户对即时计算相似性度量。

仍然听起来像是一个保持最新的噩梦,甚至可能不存储任何东西。

你可能不需要所有的对,所以我会选择稀疏矩阵表示。 至于计算本身,您可以使用类似Kd树八叉树 (或该系列中的任何东西)或任何其他类型的空间分区方法,具体取决于您的功能集的属性(您计算相似性)和您的相似性度量。

存储矩阵,特别是基于它计算任何东西是一场噩梦。 可能,您的相似性度量使用浮点数(4个字节)。 这意味着未压缩的存储大小为200000 ** 2 * 4字节= 160 GB。

这个问题有四种概念解决方案。

数据压缩

  • 最简单:使用char作为数据类型(信息丢失,缩小尺寸4倍 - 不要忘记将数据扩展到新范围!)
  • 使用对称性:仅存储矩阵的一半。 但随后对它进行操作变成了一场噩梦
  • 使用压缩算法 专业:可以随时应用。 Con:会使任何操作变慢。

数据缩减 :您可以对用户进行聚类,然后为群集构建相似性矩阵。 如果您的群集大小为200,那么您只需要1000x1000矩阵,因此只需要4MB即可存储它。 可能还有其他好处,如速度和稳健性。

水平缩放 :使用大型机器。 亚马逊有一个2TB内存 ,只需3970美元;-)

垂直缩放 :构建块矩阵,它是大矩阵的块,可以处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM