余弦相似度下多文档聚类的数学方法

时间:2012-12-19 15:26:52

标签: machine-learning cluster-computing information-retrieval document-classification cosine-similarity

余弦相似度:  通常在将两个文档相互比较时使用。它测量两个矢量之间的角度。如果该值为零,则两个矢量之间的角度为90度,并且它们不共享项。如果值为1,则除幅度外,两个矢量相同。当数据稀疏,不对称并且存在缺乏特征的相似性时,使用余弦。

当我将余弦用于两个向量(文档)时 我将根据下表得出结果

id        Doc1(TF)  Doc2 (TF)
London        5        3
Is            2        2
Nice         10        3
City          0        1

然后将其标准化到最后。 然后,我会得到余弦 Cos(v1,v2)= 90%

但是,如果我有10个文件意味着我已经

Cos(v1,v2)= ? 
Cos(v1,v3)= ?
Cos(v1,v5)= ?
Cos(v1,v6)= ?
Cos(v1,v7)= ?
Cos(v1,v8)= ?
Cos(v1,v9)= ?
Cos(v2,v3)= ? 
Cos(v2,v4)= ?
Cos(v2,v5)= ?

And so o n 

Until 

Cos(v9,v10)= ?

然后我必须比较结果。

是快速的方法吗?如何将cos到10个或更多文档。

我知道如何获得两份文件的余弦但我怎样才能获得更多文件? 我想要数学方法。

2 个答案:

答案 0 :(得分:1)

有一个很容易被忽视的非常棘手的优化。

大多数情况下,您的矢量将稀疏。如果查看余弦相似度的公式,请注意向量长度不会改变。所以你可以预先计算它们。

对于点积,请注意,如果向量在10%的维度中不为零,则两者在仅1%的维度中将为非零。因此,您只想以非零的尺寸计算产品!在您的示例中,您希望跳过单词City,例如。

如果然后将数据转换为基于列的布局并将零放在那里,则可以非常快速地以分布式方式计算。例如,v1列中的文档City 缺少。然后计算每列中的成对产品,并将它们输出到相应的文档对。最后,使用总向量长度对这些总和进行标准化。 Mahout 应该已经这样做了,所以你应该在关于Mahout的好书中找到关于这种方法的细节(对不起,我没有好的指示)。

处理大量文本的关键思路是利用稀疏性。尽量避免任何计算值为0的计算。

答案 1 :(得分:0)

以下是一些优化。由于成对距离的矩阵关于诊断是对称的,因此仅计算矩阵的上三角形。此外,要进行实际聚类,假设您具有成对距离矩阵,则可以在n-1次迭代中执行此操作。计算成对距离矩阵的快速方法是使用并行编程(比如GPU)。结果表明,计算GPU上的成对距离比CPU快64倍。但是,对于像单链路层次聚类这样的聚类算法,实际的聚类必须在CPU上完成