用户之间通过选择的远程属性加权相似性的算法/实现方法是什么?

Str*_*ire 7 algorithm similarity match weighted cosine-similarity

数据结构:

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)
Run Code Online (Sandbox Code Playgroud)

实施例/上下文:

我相信通过堆栈交换,您可以为一个用户提供许多配置文件,因为它们因交换站点不同而不同?在这个问题:

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

配置文件和属性只是在两个级别上对属性值进行分组的方法.如果没有分组(在2.之后加权需要),关系就是User hasMany Attribute Values.

问题:

为每个用户提供其他用户相似的评级.

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

花哨的代码和有用的功能很棒,但我真的希望完全理解如何实现这些任务,所以我认为通用伪代码是最好的.

谢谢!

ffr*_*end 8

首先,你应该记住,一切都应尽可能简单,但并不简单.此规则适用于许多领域,但在语义,相似性和机器学习等方面,它是必不可少的.使用几个抽象层(属性 - >类别 - >个人资料 - >用户)使您的模型更难理解和推理,所以我会尝试尽可能地省略它.这意味着保持用户和属性之间的直接关系是非常可取的.因此,基本上您的用户应该表示为向量,其中每个变量(向量元素)表示单个属性.

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

在适用的情况下,可以使用属性之间的距离.虽然我很难在你的设置中提出例子.

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

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

  1. 运行特征选择以避免噪声变量.
  2. 转换变量,在其他"坐标系"中表示它们.例如,您可以使用M个其他变量来表示与特定社交群组的亲密度,而不是对N个视频流派使用N个变量.比如说,"喜剧"变量1为"儿童"变量变为0.8,"家庭主妇"变为0.6,"old_people"变为0.9.或其他任何东西.任何看起来更"正确"的翻译都可以.
  3. 使用重量.不是类别或配置文件的权重,而是不同属性的权重.但是不要自己设置这些权重,而是运行线性回归来找出它们.

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

cos(x, y) = x[0]*y[0] + x[1]*y[1] + ... + x[n]*y[n]
Run Code Online (Sandbox Code Playgroud)

你可以使用加权版:

cos(x, y) = w[0]*x[0]*y[0] + w[1]*x[1]*y[1] + ... + w[2]*x[2]*y[2]
Run Code Online (Sandbox Code Playgroud)

找到这种权重的标准方法是使用某种回归(线性的一种是最受欢迎的).通常情况下,您收集的数据集是一个矩阵,(X, y)其中X包含行上的数据向量(例如房屋出售的详细信息),并且y是某种"正确答案"(例如房屋出售的实际价格).但是,在您的情况下,用户向量没有正确的答案.实际上,您只能定义其相似性的正确答案.那为什么不呢?只需使每一行X成为两个用户向量的组合,以及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
Run Code Online (Sandbox Code Playgroud)

HTH