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;