algorithm - 如何测量不同向量空间中余弦相似度评分的优劣?

标签 algorithm statistics measurement cosine-similarity

我是一个计算机科学家,正在研究一个需要一些统计指标的问题,尽管(不是很精通统计)我不太确定要使用什么样的统计指标。
概述:
我有一组问题(当然是来自stackexchange站点),利用这些数据,我正在探索能够找到与我提供的问题类似的问题的算法。是的,stackexchange站点已经执行了这个功能,其他许多问答站点也是如此。我想做的是分析人们用来完成这项任务的方法和算法,看看哪些方法表现最好。我的问题是找到合适的统计方法来定量地确定“哪些方法表现最好”。
数据:
我有一组stackexchange问题,每个问题都是这样保存的:{'questionID':"...", 'questionText':"..."}。对于每一个问题,我都有一组其他的问题,或者与之相关,或者与之相关stackexchange网站上的问答者通常会在他们的答案中添加到其他类似帖子的链接,即“你读过某某的这篇帖子[在这里插入帖子链接]吗?”他们正在解决一个类似的问题……“我认为这些相关的问题彼此‘相似’。
更具体地说,假设我们有问题。
问题A有一个链接的问题集合所以A
我的直觉告诉我,传递性在这里不适用也就是说,仅仅因为{B, C, D}A_linked = {B, C, D}相似,而AB相似,我无法确定A是否与C相似。(或者我可以吗?)
然而,我可以自信地说,如果B类似于C,那么A类似于B
因此,为了简化这些关系,我将创建一组类似的对:B
这对将成为某种基本真理。我们知道这些问题彼此相似,所以它们的相似性置信值等于1。所以A
需要注意的是,对于数据集中的每个问题,我们只知道几个类似的问题我们不知道的是,其他一些问题是否也类似于{A, B}, {A, C}, {A, D}。可能很相似,可能不相似,我们不知道。所以我们的“基本真相”其实只是一些真相。
算法:
算法的简化伪代码版本如下:

for q in questions: #remember q = {'questionID':"...", 'questionText':"..."}
    similarities = {} # will hold a mapping from questionID to similarity to q
    q_Vector = vectorize(q) # create a vector from question text (each word is a dimension, value is unimportant)
    for o in questions: #such that q!=o
        o_Vector = vectorize(o)
        similarities[o['questionID']] = cosineSimilarity(q_Vector,o_Vector) # values will be in the range of 1.0=identical to 0.0=not similar at all
    #now what???

所以现在我有了一个完整的映射余弦相似度得分之间的Q和其他问题在我的数据集。我的最终目标是对similarityConfidence({A,B}) = 1函数的许多变体运行此代码(每个变体将返回一个稍微不同的向量),并确定哪个变体在余弦分数方面表现最好。
问题是:
所以我的问题就在这里。现在怎么办如何定量地衡量这些余弦分数有多好?
这些是我头脑风暴过的一些测量方法(尽管我觉得它们是未经改进的、不完整的):
一种类似于均方根误差(rmse)的误差函数。因此,对于基本事实相似性列表中的每个文档,累积平方误差(误差大致定义为E)。然后,我们将该累加除以相似对的总数(因为我们将考虑Avectorize())。最后,我们得到这个误差的平方根。
这需要一些思考,因为这些值可能需要规范化虽然1-similarities[questionID]的所有变化都会产生0到1范围内的余弦分数,但两个*2函数的余弦分数可能无法相互比较。a->b通常每个问题的余弦分数都很高,所以0.5分可能是非常低的分数。或者,b->a可能每个问题的余弦分数都很低,所以0.5可能是很高的分数我需要解释一下这种变化。
此外,我还提出了一个误差函数vectorize()我选择1是因为我们知道这两个问题是相似的,所以我们的相似性置信度是1。然而,余弦相似性得分为1意味着这两个问题是相同的。我们并不是说我们的“关联”问题是相同的,只是说它们是相似的。这是个问题吗?
_
我们可以找到召回(返回的相似文档的数量/相似文档的数量),只要我们设置一个阈值,我们返回的问题是“相似的”,而我们没有。
尽管出于上述原因,这不应该是像vectorize()这样的预定义阈值,因为每个vectorize_1()函数可能返回不同的值。
_
我们可以找到recall@k,在这里我们只分析前k个帖子。
不过,这可能有问题,因为我们没有全面的事实。如果我们设置了vectorize_2(),并且我们知道相关的3个文档(1-similarities[questionID])中只有1个文档(similarity[documentID]>7)位于前5位,那么我们不知道其他4个顶级文档是否与我们知道的3个文档实际上相同或更相似,但没有人将它们链接起来。
你还有别的想法吗我怎样才能定量地衡量哪个功能表现最好?

最佳答案

首先要注意,这个问题与相似性和近重复检测的Information Retrieval问题高度相关。
在我看来,你的问题可以分为两个问题:
确定基本真理:在许多“竞赛”中,在基本真理不清楚的情况下,
要确定哪些是相关的文档,需要获取文档
得到了X%的候选人的支持。
选择最佳候选:首先要注意,通常比较两种不同算法的得分是不相关的。天平可能完全不同,而且通常毫无意义。为了比较两种算法,您应该使用每个算法的排名-每个算法如何对文档进行排名,以及它离实际情况有多远。
一个简单的方法就是使用precision and recall-你可以将它们与f-measure进行比较。问题是,排名第十的文档和排名第一的文档一样重要。
一个更好的方法是NDCG-这是我所遇到的大多数文章中比较算法的最常用方法,在主要的ir会议中广泛使用:WWWsigIR。NDCG对排名进行评分,对排名为“较好”的文档给予高度重视,而对排名为“较差”的文档给予较低重视另一个常见的变体是ndcg@k,其中ndcg只用于每个查询的第k个文档。
希望有此背景和建议帮助。

关于algorithm - 如何测量不同向量空间中余弦相似度评分的优劣?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22822079/

相关文章:

r - R 中 xtable 的变量概述

Python 或 R! - 为指定的光栅文件绘制直方图

c++ - 测量计算几何算法的运行时间

python - 很难理解 Bellman Ford 的迭代

algorithm - 缓冲/流式在线视频背后的算法是什么?

c++ - 是否有任何 O(n^2) 算法来生成数组的所有子序列?

C 如何正确测量时间?

python - 为什么平分比排序慢

r - 层次聚类中的聚类可以重叠吗?

algorithm - 获取算法在特定时间跨度内可以处理的最大数据