我在 SAS IML 中有一个矩阵。对于每一对行(比如向量A
和B
),我想计算余弦相似度,
A . B / ( ||A|| x ||B|| )
.
所以结果应该是一个与初始矩阵有相同行数的方阵。
如果我将一个向量传递给 Euclid 函数,我会返回一个向量,因此该函数似乎分别作用于向量的每个元素。事实上,SAS 文档说:
如果您使用矩阵参数调用 Base SAS 函数,该函数通常会逐元素地作用于 [原文如此] 矩阵的每个元素。
这很奇怪——为什么有人要计算向量的每个元素的汇总统计?他们总是只返回元素。有没有办法获得向量的欧几里得范数?
我的代码如下。尽管有欧几里得规范,有没有更有效的方法来做到这一点?
proc iml;
use fundstr;
read all var _all_ into wgts;
nrows=nrow(wgts);
d=j(nrows,nrows,0);
do i = 1 to nrows;
do j = i to nrows;
tmp = wgts[i,]*wgts[j,]`; /** need to divide by norms each vector **/
d[i,j] = tmp;
d[j,i] = tmp;
end;
end;
quit;