如何计算特征列表之间的相似度?
我有一些用户和资源。每个资源都有一组特征,而每个用户与不同的资源相关。在我的例子里,这些资源是网页,特征包括访问的地点、时间、访问次数等,这些信息都是和特定用户相关的。
我想要根据这些特征来衡量用户之间的相似性,但我找不到合适的方法来把资源的特征合并在一起。我之前用文本特征做过类似的事情,可以把文档合并后提取特征(比如说TF-IDF),但在这种情况下我不知道该怎么做。
为了让事情更清楚,这里是我目前的情况:
>>> len(user_features)
13 # that's my number of users
>>> user_features[0].shape
(2374, 17) # 2374 documents for this user, and 17 features
我能够使用欧几里得距离来得到一个文档的相似性矩阵:
>>> euclidean_distance(user_features[0], user_features[0])
但我不知道怎么把用户之间进行比较。我应该以某种方式把特征合并在一起,最终得到一个 N_Users X N_Features
的矩阵,但我不知道该怎么做。
有没有什么建议可以帮助我?
关于我使用的特征,还有一些额外的信息:
我这里的特征并不是完全固定的。目前我有13个不同的特征,这些特征是从“浏览”中汇总而来的。我有每个浏览的标准差、均值等数据,目的是让这些数据变得“平坦”,方便比较。其中一个特征是:自上次浏览以来,位置是否发生了变化?那一个小时前呢?两小时前呢?
3 个回答
我会考虑创建多个维度的文档,也就是说,把那些在特定时间段被访问的文档分成早上和晚上的类别,然后可以把用户分成夜猫子和早起鸟。
通过设置不同的维度,你可以创建一个用户的矩阵,并利用用户之间的距离来帮助分析。
你可以用每个用户资源的特征平均值来简单地总结一下这个用户。这听起来很自然。你可以使用 numpy.mean
函数,并设置合适的 axis
参数来计算平均值。然后,就像之前计算文档向量之间的距离一样,计算这些“用户向量”(长度为特征数量)之间的欧几里得距离。
如果每个用户都用一组与文档互动的向量来表示,那么你可以通过比较这两组向量的相似度来定义两个用户之间的相似性。
你提到可以得到一个文档的相似度矩阵。假设用户 U1 访问了文档 D1、D2 和 D3,而用户 U2 访问了文档 D1、D3 和 D4。这样,你就会有两个向量集合:用户 U1 的集合 S1 = {U1(D1), U1(D2), U1(D3)},和用户 U2 的集合 S2 = {U2(D1), U2(D3), U2(D4)}。需要注意的是,因为每个用户与文档的互动方式不同,所以它们被表示成这样。如果我理解得没错,这些集合中的元素应该对应于每个用户在相似度矩阵中的相应行。
这两个集合之间的相似性可以用很多不同的方法来计算。其中一种方法是计算平均的成对相似性:你遍历每个集合中的元素对,计算这对文档的相似度,然后对所有的对进行平均。