绘制向量 w 以及另一个向量在 w 上的投影

Draw the vector w as well as the projection of another vector onto w

如何 绘制 向量 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'])

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

Source: Oregon State Mathematics: Calculus for Undergraduates

在我们的例子中,a 将是 w,而 b 将是 x1x2 中看到的每个向量。我假设这些矩阵的每一行都是一个向量。在 y1y2 中可以看到标量投影。您需要计算 向量 投影,它被定义为采用标量投影并乘以 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.

的原始向量