У меня есть матрица в SAS IML. Для каждой пары строк (скажем, векторы A
и B
), я хочу, чтобы вычислить cosine similarity,Вычислить сходство косинусов в SAS/IML
A . B/(||A|| x ||B||)
.
Таким образом, результат должен быть квадратной матрицей с таким же количеством строк, что и исходная матрица.
Если я передаю вектор функции Евклида, я возвращаю вектор, поэтому функция действует отдельно для каждого элемента вектора. Действительно, документация SAS says:
При вызове функции Base SAS с матрицей аргумента, функция, как правило, действуют поэлементно на каждом элементе Teh [так] матрицы.
Это странно - зачем кому-то рассчитывать сводную статистику для каждого элемента вектора? Они всегда будут просто возвращать элементы. Есть ли способ получить евклидову норму для вектора?
Мой код ниже. Независимо от евклидовой нормы, существует ли более эффективный способ сделать это?
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;