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.
为每个用户提供与其他用户相似的评级.
花哨的代码和有用的功能很棒,但我真的希望完全理解如何实现这些任务,所以我认为通用伪代码是最好的.
谢谢!
首先,你应该记住,一切都应尽可能简单,但并不简单.此规则适用于许多领域,但在语义,相似性和机器学习等方面,它是必不可少的.使用几个抽象层(属性 - >类别 - >个人资料 - >用户)使您的模型更难理解和推理,所以我会尝试尽可能地省略它.这意味着保持用户和属性之间的直接关系是非常可取的.因此,基本上您的用户应该表示为向量,其中每个变量(向量元素)表示单个属性.
如果选择此类表示,请确保所有属性都有意义并且在此上下文中具有适当的类型.例如,你可以将5个视频类型表示为5个不同的变量,但不能代表1到5的数字,因为余弦相似性(以及大多数其他算法)会错误地对待它们(例如乘以惊悚片,表示为2,用喜剧,表示为5,实际上没有意义).
在适用的情况下,可以使用属性之间的距离.虽然我很难在你的设置中提出例子.
此时你应该停止阅读并尝试一下:将用户简单表示为属性向量和余弦相似度.如果它运作良好,保持原样 - 过度复杂的模型永远不会好.
如果模型表现不佳,请尝试理解原因.你有足够的相关属性吗?或者有太多的嘈杂变量只会让它变得更糟?或者某些属性应该比其他属性更重要?根据这些问题,您可能希望:
让我更详细地描述最后一点.而不是简单的余弦相似性,它看起来像这样:
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