我为这个模棱两可的标题道歉,但我不完全确定如何表达这个标题。所以请耐心等待。
我有一个数据矩阵。每一列和每一行代表一个向量(第1列=第1行,第2列=第2行等),每个单元格值是对应向量之间的余弦相似度。所以矩阵中的每个值都是余弦。
我想做几件事。首先,我想创建一个显示其上所有向量的图形。我知道每个向量之间的角度的余弦,并且我知道每个向量的大小,但这是我拥有的唯一信息 - 是否有一些我可以实现的算法将贯穿所有不同的成对角度并显示它以图形方式显示?也就是说,我不知道所有向量之间的关系在哪里,并且有太多数据点无法手动执行此操作(例如,如果我只有三个向量,并且它们之间的角度都是 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]);