4

タイトルがあいまいなことをお詫びしますが、これをどのように表現するか完全にはわかりません。だから私に耐えなさい。

データのマトリックスがあります。各列と行は特定のベクトル(列1 =行1、列2 =行2など)を表し、すべてのセル値は対応するベクトル間の余弦の類似性です。したがって、行列のすべての値はコサインです。

これでやりたいことがいくつかあります。まず、その上のすべてのベクトルを示す図を作成したいと思います。私はすべてのベクトル間の角度の正弦を知っており、各ベクトルの大きさを知っていますが、それが私が持っている唯一の情報です-さまざまなペアワイズ角度のすべてを実行して表示する実装できるアルゴリズムがありますグラフィカルに?つまり、すべてのベクトルが相互に関連している場所がわかりません。また、データポイントが多すぎて、手作業でこれを行うことはできません(たとえば、ベクトルが3つしかなく、それらの間の角度がすべて45、12だった場合)。 、および72度それは些細なことです)。では、どうすればこれを実行できますか?これを行うためにどのような数学関数が必要になるのか、私には少しもわかりません。(私は83個のベクトルを持っているので、それは何千もの正弦値です)。

私がやりたいもう一つのことはもっと簡単ですが、私はそれを理解するのに苦労しています。正弦値をデカルト座標に変換して、散布図に表示できます。散布図の各点をプロット上の(0,0)に接続する方法はありますか?

最後に、上記のいくつかを自分で行う方法を理解しようとすると、いくつかの矛盾に遭遇しました。83個のベクトルのそれぞれの平均角度とデカルト座標を計算しました。このための計算は簡単で、私はそれをチェックして再チェックしました。しかし、私がそれをプロットしようとすると、異なるプロット方法は私に根本的に異なるものを与えます。したがって、デカルト座標を散布図としてプロットすると、次のようになります。

ここに画像の説明を入力してください

コンパスプロットで平均角度をプロットすると、次のようになります。

ここに画像の説明を入力してください

そして、矢筒プロットを使用すると、次のようになります(原点を上下にシフトして、見やすくするために、これを少し変換しました):

ここに画像の説明を入力してください

私は何か間違ったことをしていますか、それとも私が使用しているプロット関数を誤解していますか?これらの結果はすべてかなり一貫性がないように見えるためです。コンパスプロットの平均角度はすべて<30度程度ですが、矢筒プロットでは90度を超えるものもあり、散布図では30度を超えています。何が起きてる?

(これが私のコードです:)

cosine = load('LSA.txt');


[rows,columns]=size(cosine);
p = cosine.^2;
pp = bsxfun(@minus, 1, p);
sine = sqrt(pp);
tangent = sine./cosine;


Xx = zeros(rows,1);
Yy = zeros(rows,1);
for i = 1:columns
    x = cosine(:,i);
    y = sine(:,i);
    Xx(i,1) = sum(x) * (1/columns);
    Yy(i,1) = sum(y) * (1/columns);
end

scatter(Xx,Yy);

Rr = zeros(rows,1);
Uu = zeros(rows,1);
for j = 1:rows
    Rr(j,1) = sqrt(Xx(j,1).^2 + Yy(j,1).^2);
    Uu(j,1) = atan2(Xx(j,1),Yy(j,2));
end


%COMPASS PLOT
[theta,rho] = pol2cart(Uu,1);
compass(theta,rho);


%QUIVER PLOT

r = 7;
sx = ones(size(cosine))*2; sy = ones(size(cosine))*2;
pu = r * cosine; 
pv = r * sine;
h = quiver(sx,sy,pu,pv);
set(gca, 'XLim', [1 10], 'YLim', [1 10]);
4

2 に答える 2

1

矢筒プロットでは、すべてのデータをコサイン行列とサイン行列にプロットしています。他のプロットでは、平均をプロットしているだけです。最初の2つのプロットは一致しているように見えるので、問題はありません。

他のいくつかのこと。私はに気づきます

Uu(j,1) = atan2(Xx(j,1),Yy(j,2));

Yy(j,2)は実際には定義されていないため、このコードは失敗するはずです。

さらに、YyとXxを次のように定義できます。

Xx = mean(cosine,2);
Yy = mean(sine,2);

また、他のforループを削除します。

Rr = sqrt(Xx.^2 + Yy.^2)
Uu = atan2(Xx,Yy)

最初の質問についてはまだ考えなければなりませんが、これがお役に立てば幸いです。

于 2012-08-29T21:13:44.270 に答える
1

この問題は正確に解決できます。内積は正弦を計算します。これは、行列が実際にあることを意味しますM=V'*V 。これは固有値を介して解けるはずです。そして、あなたはあなたにも長さがあると言いました。

あなたの唯一の問題-あなたの元の行列として、ベクトルは83次元になります。2次元または3次元でプロットするのは簡単ではありません。平均角度を使用するだけで単純化しすぎていると思います。次元削減と呼ばれるいくつかの手法があります-これがツールボックスです。このようなプロットのベクトルを計算するために、(これは単位球上の点の距離になるため)にサモン投影を提案します。1-cosine

于 2012-08-30T05:25:07.513 に答える