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



余弦相似性:在比较两个文档时经常使用。它测量两个矢量之间的角度。如果该值为零,则两个矢量之间的角度为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个或更多文档。

我知道如何获得两个文档的余弦,但如何获得更多文档?我想要数学方法。

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

大多数时候,您的向量将是稀疏。如果你看余弦相似性的公式,注意向量长度不会改变。所以你可以预先计算它们。

对于点积,请注意,如果向量在10%的维度中为非零,则两个在1%的维度中都将为非零。所以你只想计算非零维度的乘积!例如,在您的示例中,您希望跳过单词City

如果您随后将数据转换到基于列的布局中,并将零放在那里,那么您可以非常快速地以分布式方式进行计算。例如,文档v1City列中将缺少。然后计算每列中的成对乘积,并将它们输出到相应的文档对。最后,用总向量长度对这些和进行归一化Mahout应该已经这样做了,所以你应该在一本关于Mahout的好书中找到关于这种方法的详细信息(对不起,我没有好的指针)。

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

以下是一些优化。由于成对距离的矩阵是关于对角线对称的,因此只计算矩阵的上三角。此外,为了进行实际的聚类,假设你有成对距离的矩阵,你可以在n-1次迭代中进行。计算成对距离矩阵的一种快速方法是使用并行编程(比如GPU)。结果表明,在GPU上计算成对距离比CPU快64。然而,对于类似单链分层聚类的聚类算法,实际的聚类必须在CPU 上完成

最新更新