哪种算法/实现通过用户选择的距离属性来加权相似度?

Posted

技术标签:

【中文标题】哪种算法/实现通过用户选择的距离属性来加权相似度?【英文标题】:Which algorithm/implementation for weighted similarity between users by their selected, distanced attributes? 【发布时间】:2014-03-09 17:44:51 【问题描述】:

数据结构:

User has many Profiles
    (Limit - no more than one of each profile type per user, no duplicates)
Profiles has many Attribute Values
    (A user can have as many or few attribute values as they like)
Attributes belong to a category
    (No overlap. This controls which attribute values a profile can have)

示例/上下文:

我相信通过堆栈交换,您可以为一个用户拥有多个配置文件,因为每个交换站点的配置文件都不同?在这个问题中:

配置文件:视频,因此视频配置文件仅包含视频类别的属性 属性,因此视频类别中的属性可能是流派 属性值,例如喜剧、动作、惊悚都是属性值

配置文件和属性只是在两个级别上对属性值进行分组的方式。 没有分组(这是从 2. 开始的加权所需要的),关系只是 User hasMany Attribute Values。

问题:

给每个用户一个相似度评分与其他用户。

    基于与用户关联的所有属性值的相似性。 平/一级 两个用户之间的属性值数量不等 每个用户只能选择一次属性值,所以不能重复 因此,具有余弦相似度的二进制字符串/布尔数组? 1 + 重量 配置文件 给每个配置文件一个权重(总共 1 个?) 计算出轮廓相似度,然后乘以权重并求和? 1 + 权重属性类别配置文件 由于属性属于类别,类别可以加权 每个类别的相似度,加权总和,然后按配置文件相同? 或合并个人资料和类别权重 3 + 距离每个属性值 每个可能值与值的相似性距离表 而不是值的相似度 === 值 “接近”属性有助于整体相似性。 不知道怎么做这个

花哨的代码和有用的功能很棒,但我真的很想完全了解如何完成这些任务,所以我认为通用伪代码是最好的。

谢谢!

【问题讨论】:

您是否需要完成所有这些任务,或者您只是将这些方法视为一个主要目标的可能解决方案(找到用户之间的相似性)?你能给我们一些背景吗? 这些是我考虑过的方法,1 是最简单的,4 是最复杂的。我想了解如何做每一个,所以是的,我需要所有这些,但是由于 1 会影响理解 2 等等,它们基本上都是一个解决方案的一部分。我愿意接受有关如何完成这些任务的任何建议,但我认为它们是我比较用户的最佳方式。 什么是属性和类别?你能提供一些例子吗?更一般地说,这些档案在现实生活中是什么?比如说,他们是来自 Fb、LinkedIn 等的个人资料还是什么?此外,您对权重的直觉是什么(对于个人资料和类别)。很抱歉问了这么多问题,但寻找相似之处总是取决于具体的设置和任务细节。 已添加到问题中。这有意义吗? 【参考方案1】:

首先,您应该记住everything should be made as simple as possible, but not simpler。这条规则适用于许多领域,但在语义、相似性和机器学习等方面,它是必不可少的。使用多层抽象(属性 -> 类别 -> 配置文件 -> 用户)会使您的模型更难理解和推理,因此我会尽量省略它。这意味着最好在用户和属性之间保持直接关系。因此,基本上您的用户应该表示为向量,其中每个变量(向量元素)代表单个属性。

如果您选择此类表示,请确保所有属性都有意义并且在此上下文中具有适当的类型。例如,您可以将 5 种视频类型表示为 5 个不同的变量,但不能表示为 1 到 5 的数字,因为余弦相似度(以及大多数其他算法)会错误地处理它们(例如,将惊悚片相乘,表示为 2,喜剧,表示为5,这实际上没有意义)。

可以在适用时使用属性之间的距离。虽然我很难在你的设置中举出例子。

此时您应该停止阅读并尝试一下:将用户简单表示为属性向量和余弦相似度。如果它运作良好,请保持原样 - 过度复杂的模型永远不会好。

如果模型表现不佳,请尝试了解原因。你有足够的相关属性吗?还是有太多嘈杂的变量只会让情况变得更糟?还是某些属性真的应该比其他属性更重要?根据这些问题,您可能希望:

    运行feature selection 以避免嘈杂的变量。 转换您的变量,在其他“坐标系”中表示它们。例如,您可以使用 M 个其他变量来表示与特定社会群体的接近程度,而不是使用 N 个变量来表示 N 个视频流派。比如说,“喜剧”变量的 1 变成“儿童”变量的 0.8,“家庭主妇”的 0.6 和“老人”的 0.9。或者别的什么。任何看起来更“正确”的翻译都可以。 使用权重。不是类别或配置文件的权重,而是不同属性的权重。但是不要自己设置这些权重,而是运行linear regression 来找出它们。

让我更详细地描述最后一点。而不是简单的余弦相似度,看起来像这样:

cos(x, y) = x[0]*y[0] + x[1]*y[1] + ... + x[n]*y[n]

你可以使用加权版本:

cos(x, y) = w[0]*x[0]*y[0] + w[1]*x[1]*y[1] + ... + w[2]*x[2]*y[2]

找到此类权重的标准方法是使用某种回归(线性回归是最流行的)。通常,您收集数据集(X, y),其中X 是一个矩阵,其中您的数据向量位于行上(例如出售房屋的详细信息),y 是某种“正确答案”(例如房屋出售的实际价格)为了)。但是,在您的情况下,用户向量没有正确答案。实际上,您只能对它们的相似性定义正确的答案。那为什么不呢?只需让X 的每一行成为 2 个用户向量和y 的对应元素的组合 - 它们之间的相似性(您应该自己为训练数据集分配它)。例如:

X[k] = [ user_i[0]*user_j[0], user_i[1]*user_j[1], ..., user_i[n]*user_j[n] ]
y[k] = .75  // or whatever you assign to it

HTH

【讨论】:

第一段,好点。我将根据组来操纵计算的权重,而不是运行多个相似性计算。其次,每个属性都有一个值“重要性”。机器学习是我的长期目标。我想使用您描述为 2 的手动权重,并实施一些学习以根据用户指标修改这些数字。你所描述的就是我所说的“距离”。所以你仍然会使用一个计算,但是根据它与集合中已经存在的属性值的关系为每个变量添加一个修改后的值? “重要性”和“权重”有什么区别?至于计算,是的,我更喜欢单一的公式。有几种模型可以将属性和权重分成几个部分(例如神经网络中的层),但一般来说,组件(和抽象级别)越多,推理、找到它的系数等就越困难。 好的。重要的是,比如说,一个分数?还是值得?有些人比其他人更重要,所以我希望他们更多地计算,最初。这将与使用次数成反比。然后权重用于根据初始重要性修改价值。我猜它们就像重量 嗯,这对于一些优化方法来说是有意义的,比如随机梯度下降(这很常见),但要做好准备,其他算法可能会大幅改变你的初始重要性系数,甚至完全忽略它们。 那么,如果加权余弦相似度不是最好的方法,您会总体推荐什么?

以上是关于哪种算法/实现通过用户选择的距离属性来加权相似度?的主要内容,如果未能解决你的问题,请参考以下文章

协同过滤推荐算法

文本去重算法——simhash简介

ML之CB:基于自定义电影数据集利用CB基于内容推荐算法(多个指标基于同种相似度加权得分)实现电影Top5推荐案例

图片相似度判断

机器学习之推荐算法

海量数据相似度计算之simhash和海明距离