【问题标题】:MATLAB vectors, angles, plotsMATLAB 向量、角度、绘图
【发布时间】:2012-08-24 08:00:19
【问题描述】:

我为这个模棱两可的标题道歉,但我不完全确定如何表达这个标题。所以请耐心等待。

我有一个数据矩阵。每一列每一行代表一个向量(第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]);

【问题讨论】:

  • 好问题!我希望今晚能找到时间来回答它。顺便说一句:这些图看起来和我非常相似(注意轴上的值!)
  • 只是为了澄清 - 向量有多少维?

标签: matlab vector plot angle


【解决方案1】:

你完全可以解决这个问题。 dot product 计算余弦。这意味着您的矩阵实际上是M=V'*V 这应该可以通过特征值来解决。你说你也有长度。

您唯一的问题 - 作为您的原始矩阵,向量将是 83 维。不容易绘制 2 或 3 维。我认为您仅使用平均角度就过度简化了。有一些技术称为降维 - 这是toolbox。我建议在1-cosine 上使用sammon projection(因为这将是单位球上点的距离)来计算此类图的向量。

【讨论】:

  • 谢谢!我会调查一下。只是出于好奇,我如何通过特征值解决任何问题? (我可以查找它的数学和代码,但我对特征值知之甚少......它们实际上代表什么?我想我可以去阅读维基百科,呵呵)
  • 查看命令eig。基本上,如果您在特征向量的基础上转移 M - 它只是对角线。然后 V 的解决方案变得简单(平方根)。解然后只需要转换为原来的基础。
【解决方案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)

我仍然需要考虑您的第一个问题,但我希望这会有所帮助。

【讨论】:

  • 糟糕,这只是一个错字。应该是 Yy(j,1)。
  • 我看到了我对 quiver 情节做了什么,但我仍然看不出前两个情节如何匹配。我只是看错了吗?另外,我没有将 Xx 和 Yy 定义为平均值的原因是因为我正在处理角度值,而不是线性的。但是,在我看来,余弦/正弦可能不需要 atan2 转换,我需要查一下。
  • 仅通过检查,顶部图中的角度范围约为 0 到 0.25 弧度。 0.25 弧度大约是 15 度。罗盘图显示的矢量范围从大约零到大约 15 度,因此它们看起来是一致的。此外,无论如何,您只是取 Xx 和 Yy 的平均值。使用 mean 只会做你已经在做的事情。
  • 哈,是的,我现在明白了。我不知道为什么我以前没有,我想我只是厌倦了这么长时间的工作,呵呵。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-20
  • 2013-07-23
  • 1970-01-01
  • 2014-11-29
  • 1970-01-01
相关资源
最近更新 更多