2017-12-25 11 views
0

で正しく固有ベクトルをプロット、ここで私はそのために書いてきたスクリプト:私は、2Dデータセットのcaculated固有ベクトルをプロットしようとしているMatlabの

を:

clear ; 
s = [2 2] 
set = randn(200,1); 
x = normrnd(s(1).*set,1)+3 
x = zscore(x) % Standardize 
y = normrnd(s(1).*set,1)+2 
y= zscore(y)%Standardize 
x_0 = mean(x) 
y_0 = mean (y) 
c = linspace(1,100,length(x)); % color 

scatter(x,y,100,c,'filled') 
xlabel('1st Feature : x') 
ylabel('2nd Feature : y') 
title('2D_dataset') 

grid on 
% gettign the covariance matrix 
covariance = cov([x,y]) 
% getting the eigenvalues and the eigenwert 
[eigen_vector, eigen_values] = eig(covariance) 
eigen_value_1 = eigen_values(1,1) 
eigen_vector_1 =eigen_vector(:,1) 
eigen_value_2 = eigen_values(2,2) 
eigen_vector_2 =eigen_vector(:,2) 

% ploting the eigenvectors ! 
hold on 
x_0 = repmat(x_0,size(eigen_vector_2,1),1); 
y_0 = repmat(y_0,size(eigen_vector_1,1),1); 
quiver(x_0, y_0,eigen_vector_2*(eigen_value_2),eigen_vector_1*(eigen_value_1),'-r','LineWidth',5) 

、ここでは、私が取得していた結果であります

enter image description here

私は二重の数学をチェックしました、値が正しいですが、プロットは混乱です! 私は2つのベクトルのプロットで何が分かりませんか?ありがとうございます。 あなたのコードで

答えて

1

、この部分を置き換えます。次のコードで

covariance = cov([x,y]) 
% getting the eigenvalues and the eigenwert 
[eigen_vector, eigen_values] = eig(covariance) 
eigen_value_1 = eigen_values(1,1) 
eigen_vector_1 =eigen_vector(:,1) 
eigen_value_2 = eigen_values(2,2) 
eigen_vector_2 =eigen_vector(:,2) 

% ploting the eigenvectors ! 
hold on 
x_0 = repmat(x_0,size(eigen_vector_2,1),1); 
y_0 = repmat(y_0,size(eigen_vector_1,1),1); 
quiver(x_0, y_0,eigen_vector_2*(eigen_value_2),eigen_vector_1*(eigen_value_1),'-r','LineWidth',5) 

を:

covariance = cov([x,y]); 
[eigen_vector, eigen_values] = eig(covariance); 
eigen_vector_1 = eigen_vector(:,1); 
eigen_vector_2 = eigen_vector(:,2); 
d = sqrt(diag(eigen_values)); 

hold on; 
quiver(x_0,y_0,eigen_vector(1,2),eigen_vector(2,2),d(2),'k','LineWidth',5); 
quiver(x_0,y_0,eigen_vector(1,1),eigen_vector(2,1),d(1),'r','LineWidth',5); 
hold off; 

ん、これはあなたが探しているものを生産しますか?それはあなたが2つのベクトルのx成分、およびY成分として他の固有ベクトルとして1個の固有ベクトルの二つの成分をプロットしている

enter image description here

+0

もう一度お世話になりましたが、なぜsqrtを使用しているのか分かりません。 – Engine

1

...私にははるかにコヒーレントに見えます。

[eigen_vector, eigen_values] = eig(covariance) 
eigen_x = eigen_vector(1,:); 
eigen_y = eigen_vector(2,:); 
scale = diag(eigen_vector)'; % not sure what the output orientation is 

% ploting the eigenvectors ! 
hold on 
x_0 = repmat(x_0,size(eigen_vector_2,1),1); 
y_0 = repmat(y_0,size(eigen_vector_1,1),1); 
quiver(x_0, y_0,eigen_x.*scale,eigen_y.*scale,'-r') 

実際には正規直交であるため、行列を他の方法でスライスしてもそれほど変化はありません。しかし、あなたのスケーリングは、私が上で言及した理由のために、単にその長さだけではなく、ベクトルの角度を変えています。

関連する問題