查找两个多维数组之间的相似性(作为JSON文档)

时间:2013-12-03 10:30:36

标签: arrays algorithm data-mining similarity recommendation-engine

基本上我有一个文件系统,里面装满了这样的文件:

{"excellent":[1,2],"good":[1,2,3,4,5],"okay":[6],"bad":[7,8,9],"horrible":[9]}

"优良"将永远是" good,"的一部分。 "可怕"将永远是"坏的一部分,"好的,坏的,好的将永远是独一无二的。然而,每组可以任意长,从0个元素到......任意。我不能假设两套的长度相等,因此Jaccard似乎适用于各套。

我需要做的是计算:

  1. 与此最相似的前25个文件。
  2. 底部10个与此文档最不相似的文档。
  3. 此文档与集合中所有其他文档之间的值介于0-1之间。
  4. 基本上输出应该是另一个json文档,如下所示:

    {"similar":[[1,0.987],[2,0.876],[3,0.765]...],"differs":[[4,0.012],[5,0.123],[6,0.234]...],"totalSimilarity":0.456}
    

    我看过Jaccard Indices,看起来很适合一个简单的阵列。这是一组五个数组,例如,如果两个文档的优良集和优秀集之间具有相似性,那么它非常重要。

    我可以"平均"将五张Jaccard Indicies归为一个主索引号码?或者是否有太多信息?

    我是否努力了?会不会像json字符串的Minhash那样工作?我的第一个想法是它可能,但后来我担心基于字符串散列的东西会考虑" 5"在..."可怕" as"类似"到" 5"在"好"这完全倒退了。此外,我担心这会受到一些用户可能在" good"而其他人只有五个,而基于字符串的计算可能会扼杀它。

    说实话,虽然我想要上面#3的值,但我真的不知道如何计算它。我想知道文档与整个语料库的相似程度。

    是的,这与推荐系统算法类似。我已经阅读了从EasyRec到Mahout的文档,要么他们似乎没有完全按照我的需要做,要么数学开始超越我的脑袋。我是一名PHP开发人员,而不是理论物理学家。默认情况下,像EasyRec和Mahout这样的系统似乎并没有理解"事实上,这些都是五个独立的集合,所有人都需要协调才能被考虑"类似......"或者他们需要在他们的框架中进行一些严肃的编程工作,这让我有些头晕。

    然而,有趣的是(至少对我而言),大多数推荐系统都在整个数据集上工作;我特别感兴趣的是根据用户的偏好对用户进行聚类,并根据这个非常小的集合提出建议。老实说,我并不太担心说“不知道”,巴克!你太独特了#34;所以我不太关心冷启动或类似的东西。

    所以我正在寻找建议,要么是算法,要么支持普通的Jaccard工作,要么至少要阅读一些文档以便更好地掌握它。我认识到推荐系统是一些严肃的计算机科学,并且已经有可靠的系统。我的问题是,他们中的许多人似乎都在过度思考这个问题,或者要求某人拥有统计学学士学位以便能够输出合理的输出。 (这有点不公平......问题很难解决宇宙的错误。)

    最后,我更感兴趣的是找到一个使用的算法而不是库或服务器(除非真的有一个简单的下降,我根本就不理解),因为我&#39 ;我想看看各种编程语言如何在一次枪战中处理算法。

    我发现大多数推荐引擎/评级系统都失败了,因为他们的数据集过于宽泛。试图在整个宇宙中平均得分会产生平庸(参见:Metacritic,Rotten Tomatoes)。基本上我希望能够透明地对特定用户说:

    与你最相似的用户(链接,链接,链接)非常喜欢这个,而且用户类似于你(链接,链接,链接)真的很讨厌这个,所以你可能会感兴趣。

    与您最相似的用户(链接,链接,链接)同意这很好,所以您可能会感兴趣。

    与您最不相似的用户(链接,链接,链接)同意这很糟糕,所以您可能会感兴趣。

    与您最不相似的用户(链接,链接,链接)同意这很好,所以要么你讨厌它,要么我们必须回到绘图板。

    我想向用户说明这一点,我确实认为他们喜欢X,因为网站上的许多推荐都是黑盒子,而且我发现它可能非常糟糕,只有零解释。 (啤酒网站推荐三次投资促进机构之后,我一直评价我喝过的所有IPA" 1"仅仅是因为有很多IPA而且全世界似乎都喜欢IPA。)

    这也是我想要" totalSimilarity"的原因。如果您的" totalSimilarity"低,然后推荐人将挥舞着,我想以此为借口。 "你非常独特,所以这些只是愚蠢的猜测。" "你不是很不理智,这实际上很好,因为我很确定这些数据对你个人有用。"

1 个答案:

答案 0 :(得分:0)

以下是解决方案的第一个草图:

1)从您的数据中删除冗余:

  • 你说“优秀”将永远是“好”的一个子集,“可怕”将永远是“坏”的一个子集。那你的数据是多余的。从好的条目中删除优秀的条目,从错误的条目中删除可怕的条目。

2)使用数字权重而不是单词。您可能希望使用以下映射:    优秀 - > 2,好 - > 1,好的 - > 0,坏 - > -1,太可怕了 - > -2

  • 这样您最终会得到一个用户项目矩阵。每个用户一行,每行一列 项目。数字条目表示用户对给定项目的偏好。该 得到的矩阵将是稀疏的和高维的。你需要申请一个 降维机制,如主成分分析或单数 价值分解。

3)一旦减少了问题的维度,就可以在缩小的空间内使用点积来计算用户和项目之间的相似性。