【问题标题】:Draw the vector w as well as the projection of another vector onto w绘制向量 w 以及另一个向量在 w 上的投影
【发布时间】:2016-03-31 00:26:15
【问题描述】:

如何绘制矢量 w 以及投影到该矢量上的数据? 这是代码 - 以及我使用 y1y2 绘制权重向量的试验。

x1=[1 2;2 3;3 3;4 5;5 5]  % the first class 5 observations
x2=[1 0;2 1;3 1;3 2;5 3;6 5]
m1 = mean(x1); 
m2 = mean(x2); 
m = m1 + m2; 
d1=x1-repmat(m1,5,1);
d2=x2-repmat(m2,6,1);
c = 0.5.*m; 
Sw1 = d1'*d1;
Sw2 = d2'*d2;
Sw = Sw1 + Sw2; 
invSw = inv(Sw);
w= invSw*(m1-m2)' %this is my vector projected
scatter(x1(:,1), x1(:,2), 10, 'ro');
hold on;
scatter(x2(:,1), x2(:,2), 10,'bo');
%this is how i plot the decision boundary, but it doesn't seems correct. 
quiver(c(1,1), c(1,2), 1, -w(1,1)/w(2,1));
quiver(c(1,1), c(1,2), -1, w(1,1)/w(2,1));

auxw= w/norm(w);
plot([0 auxw(1)], [0 auxw(2)]) 
hold off;
figure; 
y1 = x1*w; 
y2 = x2*w; 
hist([y1' y2'])

【问题讨论】:

    标签: matlab vector linear-algebra matlab-figure projection


    【解决方案1】:

    你很亲密。您只计算(或尝试计算)标量投影或应用于每个向量的比例量,以便将 x1x2 中的每个向量投影到 w 上,尽管您所拥有的并不完整。如果从线性代数中回忆,要确定两个向量ab 之间的标量投影,或者ba 的标量投影,公式为:

    Source: Oregon State Mathematics: Calculus for Undergraduates

    在我们的例子中,a 将是 wb 将是在 x1x2 中看到的每个向量。我假设这些矩阵的每一行都是一个向量。在y1y2 中可以看到标量投影。您需要计算 vector 投影,其定义为取标量投影并乘以a 的单位向量,或者简单地说:

    Source: Oregon State Mathematics: Calculus for Undergraduates

    因此,y1y2 中标量投影的计算不正确。您必须乘以 normalized 向量 w,然后当您找到这些标量投影值时,将这些标量值中的每一个与相应的 normalized 向量 w 相乘.但是,将所有这些同时绘制在图表上会令人困惑。您将有许多行将与原始向量 w 重叠,所以我所做的是循环绘制 wx1x2 中的向量以及相应的投影向量。每次循环时,我们都会暂停并显示数据,然后清除图形并重新开始。

    因此,我在您的代码中添加并更改了以下内容。

    %// Your data
    w = [-0.7936; 0.8899];
    x1 = [1 2; 2 3; 3 3; 4 5; 5 5];
    x2 = [1 0; 2 1; 3 1; 3 2; 5 3; 6 5];
    
    %// Compute scalar projection
    auxw = w/norm(w);
    s1 = x1*auxw;
    s2 = x2*auxw; %// Change for correctness
    
    %// Compute the vector projection
    y1 = bsxfun(@times, s1, auxw.');
    y2 = bsxfun(@times, s2, auxw.');
    
    %// Place the original vectors and corresponding projections
    %// in one matrix
    y = [y1; y2];
    x = [x1; x2];
    
    %// Loop through and plot w, a point in either x1 or x2
    %// and the corresponding projection
    for ii = 1 : size(y,1)
        plot([0 w(1)], [0 w(2)]);
        hold on;
        plot([0 y(ii,1)], [0 y(ii,2)], 'r');
        plot([0 x(ii,1)], [0 x(ii,2)], 'g');
        pause(0.5);
        clf;
    end
    

    函数bsxfun 允许我们将x1x2 中的每个向量乘以它们对应的标量值。具体来说,它将采用向量s1s2,当我们将auxw 转置为1 x 2 向量时,我们将创建新矩阵y1y2,其中任一行都将计算向量x1x2 的投影,并将它们放入 y1y2 的行中。

    最后的循环循环通过wx1x2 中的一个向量以及相应的投影向量,每次一个,我们每次暂停 0.5 秒以查看结果的样子。矢量w 为蓝色,投影矢量为绿色,来自x1x2 的原始矢量为红色。

    我们得到这些系列的数字:

    我们可以看到红线,它是从x1x2w 的投影向量。绿线是来自x1x2 的原始向量。

    【讨论】:

    • 。 "您将有许多行将重叠到原始"
    • 我应该只有一行而不是多行。我想你可能会回顾我试图做的事情。此链接中提供了示例。 csd.uwo.ca/~olga/Courses/CS434a_541a/Lecture8.pdf
    • @ahmed_Mobile 您的问题不清楚。我不知道您正在尝试研究线性判别函数。对我来说,这看起来像是一个纯粹的代数问题。我将删除我的答案,因为它与您想要做的冲突。
    • 不,请删除。我仍然想知道如何绘制 x1 和 x2 之间的决策边界。我想我应该缩放加权向量 w(投影),我还应该缩放垂直于它的线。如果你不介意我会更新我的代码,也许你可以帮助我更好地绘制决策边界。 LDA如何工作并不重要。我对如何绘制线条有疑问
    • 您指的是哪张幻灯片?哪几行?我很困惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-25
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多