input_data = rand(1000,3);%随机生成1000个样本,每个样本有x,y,z三个属性 figure(1);
%控制画图的窗口为1
hold off;
%使当前轴和图形不再具备被刷新的性质,关闭在此基础上再画图
plot3(input_data(:,1), input_data(:,2), input_data(:,3), ‘ro‘);
%% Function PCA, input_data, out_dim
% Use this to switch methods
use_svd_method=1;
%改为0后采用EIG方式求解,默认采用SVD方法
out_dim = 2;
[count in_dim] = size(input_data);
% SVD方法求解PCA,计算步骤此处不详解,可查看关于PCA的另外两篇博文
if (use_svd_method)
sub_input_data = (input_data - repmat(mean(input_data),count,1))/sqrt(count-1);
%repmat(a,m,n)就是将矩阵扩充为m行n列个矩阵a,此处是指将mean(input_data)扩充为1000行1列,结果就是将input_data每列的均值重复1000遍,生成一个1000*3的矩阵,sqrt是求开方
[U,S,V] = svd(sub_input_data);
% First out_dim columns as PCA bases
pcaV = V(:,1:out_dim);
output_data = input_data * pcaV;
else
% EIG 特征值分解方法求解PCA
mean_input_data = mean(input_data);
sub_input_data = input_data - repmat(mean_input_data, count,1);
mean_mat = sub_input_data‘ * sub_input_data ./ (count - 1);
cov_mat = mean_mat;
[V D] = eig(cov_mat);
% Last out_dim columns as PCA bases
pcaV = V(:,in_dim - out_dim + 1: in_dim);
output_data = input_data * pcaV;
end
%% End Function PCA
%% Visualize Output Data
figure(2);
hold off;
plot(output_data(:,1), output_data(:,2), ‘bo‘);%bo代表blue颜色的o(圆圈)
原数据展示图:
降维后的展示图:
原文:http://my.oschina.net/dfsj66011/blog/513387