gpt4 book ai didi

algorithm - 哪种算法/实现根据用户选择的距离属性来加权用户之间的相似性?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:36:21 25 4
gpt4 key购买 nike

数据结构:

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)

示例/上下文:

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

  • Profile:Video,所以Video profile只包含Video类别的属性
  • 属性,因此视频类别中的属性可能是流派
  • 属性值,例如Comedy, Action, Thriller 都是属性值

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

问题:

给每个用户相对于其他用户的相似度评分

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

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

谢谢!

最佳答案

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

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

如果适用,可以使用属性之间的距离。尽管我很难在您的设置中举出示例。

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

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

  1. 运行 feature selection以避免嘈杂的变量。
  2. 转换您的变量,在其他一些“坐标系”中表示它们。例如,您可以使用 M 个其他变量来表示与特定社会群体的亲近度,而不是对 N 个视频类型使用 N 个变量。比如说,“喜剧”变量的 1 变成“ child ”变量的 0.8,“家庭主妇”的 0.6 和“老人”的 0.9。或其他任何东西。任何一种看起来更“正确”的翻译都是可以的。
  3. 使用权重。不是类别或配置文件的权重,而是不同属性的权重。但是不要自己设置这些权重,而是运行 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

关于algorithm - 哪种算法/实现根据用户选择的距离属性来加权用户之间的相似性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21710330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com