我是一个计算机科学家,正在研究一个需要一些统计指标的问题,尽管(不是很精通统计)我不太确定要使用什么样的统计指标。
概述:
我有一组问题(当然是来自stackexchange站点),利用这些数据,我正在探索能够找到与我提供的问题类似的问题的算法。是的,stackexchange站点已经执行了这个功能,其他许多问答站点也是如此。我想做的是分析人们用来完成这项任务的方法和算法,看看哪些方法表现最好。我的问题是找到合适的统计方法来定量地确定“哪些方法表现最好”。
数据:
我有一组stackexchange问题,每个问题都是这样保存的:{'questionID':"...", 'questionText':"..."}
。对于每一个问题,我都有一组其他的问题,或者与之相关,或者与之相关stackexchange网站上的问答者通常会在他们的答案中添加到其他类似帖子的链接,即“你读过某某的这篇帖子[在这里插入帖子链接]吗?”他们正在解决一个类似的问题……“我认为这些相关的问题彼此‘相似’。
更具体地说,假设我们有问题。
问题A
有一个链接的问题集合所以A
。
我的直觉告诉我,传递性在这里不适用也就是说,仅仅因为{B, C, D}
与A_linked = {B, C, D}
相似,而A
与B
相似,我无法确定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
)。然后,我们将该累加除以相似对的总数(因为我们将考虑A
和vectorize()
)。最后,我们得到这个误差的平方根。这需要一些思考,因为这些值可能需要规范化虽然
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会议中广泛使用:WWW,sigIR。NDCG对排名进行评分,对排名为“较好”的文档给予高度重视,而对排名为“较差”的文档给予较低重视另一个常见的变体是ndcg@k,其中ndcg只用于每个查询的第k个文档。
希望有此背景和建议帮助。
关于algorithm - 如何测量不同向量空间中余弦相似度评分的优劣?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22822079/