【发布时间】:2017-09-05 02:39:03
【问题描述】:
我有一个 TF/IDF 向量的语料库 V,所以它们非常稀疏。
这是一个大约 2,500 x 150,000 的数组。
我想计算语料库中每个文档之间的余弦相似度。
这几乎是我能想到的最天真的方法。我已经知道三四个优化,但我不想假设答案。我想知道在此计算中使用 Chapel 的计算效率最高的方法。目标是获得X 与diag(X) = 0 的对称矩阵
use Norm,
LinearAlgebra;
var ndocs = 2500,
nftrs = 150000,
docs = 1..ndocs,
ftrs = 1..nftrs,
V: [docs, ftrs] real,
X: [docs, docs] real;
for i in docs {
var n1 = norm(V[i,..]);
for j in (i+1)..ndocs {
var n2 = norm(V[j,..]);
var c = dot(V[i,..], V[j,..]) / (n1*n2);
X[i,j] = c;
X[j,i] = c;
}
}
编译使用
chpl -I/usr/local/Cellar/openblas/0.2.20/include -L/usr/local/Cellar/openblas/0.2.20/lib -lblas cosim.chpl
== 更新 ==
这实际上应该可以编译和运行。原始代码有以下@bradcray 建议的错误
【问题讨论】:
-
给定一个数学任务(函数最大化),什么是标准函数,什么是度量?缺少对此的明确声明。 (cit.)“计算效率最高的方式(在此计算中使用 Chapel)”的定量衡量标准是什么?感谢 Brian 添加了如此清晰而合理的声明,以使此类优化工作不会遇到移动的沙子。
-
@brian-dolan:上面的代码中有许多错误我试图编辑,但被拒绝说我需要将编辑传达给你。问题是 ndocs 和 nftrs 被声明为域,但随后用于声明数组(需要范围)和内部 for 循环中的边界(需要整数)。这是我建议的解决方法:使用 Norm、LinearAlgebra; var ndocs = 2500, nftrs = 150000, docs = 1..ndocs, ftrs = 1..nftrs, V: [docs, ftrs] 真实, X: [docs, docs] 真实;文档中的 i {
-
@Brad 请不要感到被拒绝!好的,我会看看,可能会寻求更多帮助。啊,很久以前,当我对编程一无所知时......
标签: sparse-matrix cosine-similarity chapel