clear all;clc;
%绘制椭圆形随机点
N=1000; %随机点数
a=20;b=5; %椭圆参数
num=0;
theta=80;
X1=[];Y=[];
while( num<N )
xi=rand()*2-1;
yi=rand()*2-1;
if( xi^2 + yi^2 <= 1 )
xi=xi*a;
yi=yi*b;
x= xi*cos(theta)-yi*sin(theta); %旋转
y= yi*cos(theta)+xi*sin(theta);
X1=[X1; x];
Y=[Y; y];
num = num + 1 ;
end
end
figure;
plot(X1,Y,'b.');grid on;hold on;
xlim([-30 30]);ylim([-20 20]);
Sample(:,1)=X1;Sample(:,2)=Y;
X=Sample;
CRate=0.5; %贡献率
means=mean(X);
meanValue=ones(size(X,1),1)*mean(X);
X=X-meanValue;%每个维度减去该维度的均值
C=X'*X/(size(X,1)-1);%计算协方差矩阵
%计算特征向量,特征值
[V,D]=eig(C); %求矩阵C的全部特征值,构成对角阵D,并求C的特征向量构成V的列向量。
%将特征向量按降序排序
[dummy,order]=sort(diag(-D));
V=V(:,order); %将特征向量按照特征值大小进行降序排列
d=diag(D); %将特征值取出,构成一个列向量
newd=d(order); %将特征值构成的列向量按降序排列
plot([means(1,1),means(1,1)+V(1,1)*D(1,1)],[means(1,2),means(1,2)+V(2,1)*D(1,1)],'Color','k','LineWidth',2);
hold on;
plot([means(1,1),means(1,1)+0.05*V(1,2)*D(2,2)],[means(1,2),means(1,2)+0.05*V(2,2)*D(2,2)],'Color','r','LineWidth',2);
hold on;
%取前n个特征向量,构成变换矩阵
sumd=sum(newd);%特征值之和
for j=1:length(newd)
i=sum(newd(1:j,1))/sumd; %计算贡献率,贡献率=前n个特征值之和/总特征值之和
if i>CRate %当贡献率大于95%时循环结束,并记下取多少个特征值
cols=j;
break;
end
end
T=V(:,1:cols); %取前cols个特征向量,构成变换矩阵T(DxK)
newSample=X*T; %用变换矩阵T对X进行降维
newX1=X(1,:)*T;