应用Matlab内部数据cites.mat进行分析。该数据是美国329个城市反应生活质量的9项指标的数据。9项指标依次为:气候、住房、健康、犯罪、交通、教育、艺术、娱乐和经济。
首先载入数据,包含3个变量>> clear
>> load cities
>> who
Your variables are:
categories names ratings
复制代码
用箱图表达下:>> boxplot(ratings,0,'+',0)
>> set(gca,'yticklabel',categories)
复制代码
从图可以看出,艺术和住房的变化很大,气候的变化很小。
当原始数据的量级和量纲存在较大差异时,需要先对数据进行标准化,然后进行主成分析。标准化的方法是将原始数据的各列除以各列的标准差:stdr=std(ratings);
sr=ratings./stdr(ones(329,1),:);
复制代码
现在寻找主要成分:[pcs,newdata,var,ts]=princomp(sr);
复制代码
(1)第一个输出——主成分pcs
pcs包括9个主成分,下面只是给出前四列
>> p4=pcs(:,1:4)
p4 =
0.2064 0.2178 -0.6900 0.1373
0.3565 0.2506 -0.2082 0.5118
0.4602 -0.2995 -0.0073 0.0147
0.2813 0.3553 0.1851 -0.5391
0.3512 -0.1796 0.1464 -0.3029
0.2753 -0.4834 0.2297 0.3354
0.4631 -0.1948 -0.0265 -0.1011
0.3279 0.3845 -0.0509 -0.1898
0.1354 0.4713 0.6073 0.4218[/code]
可以看出第一个主成分中第7个元素的权重最大。
可以通过查看p3乘以p3T的结果来判断其正交性:>> p4'*p4
ans =
1.0000 -0.0000 0.0000 -0.0000
-0.0000 1.0000 0.0000 -0.0000
0.0000 0.0000 1.0000 -0.0000
-0.0000 -0.0000 -0.0000 1.0000
计算结果为单位矩阵,说明主成分之间满足正交。
(2)第2个输出——主成分得分(newdata)
主成分得分是原始数据在主成分所定义的新坐标系中的确定的数据,其大小与输入数据矩阵大小相同。
下面我们看看newdata的前两列数据作为前两个主成分时的结果:>> x=newdata(:,1);
>> y=newdata(:,2);
>> plot(x,y,'+')
>> xlabel('第一主成分')
>> ylabel('第二主成分')
从图像可以看出,在右侧有一些异常点。可以使用gnames()函数标注图中的点,下面使用字符串矩阵names调用gnames:>> gname(names)
此时将在图像中生成一个十字交叉线,交点跟随鼠标移动。在散点附近单击,将标注该点的字符串。标注结束后,敲回车。结果显示如下:
对于这些异常值我们可以直接删除,也即是将那几行的元素直接置空,比如New York对应第213行:rsubset=ratings;
rsubset(213,:)=[];
复制代码
(3)第3个输出——主成分方差(var)
主成分方差var是有newdata的对应列所解释的包含方程的向量:>> var
var =
3.4083
1.2140
1.1415
0.9209
0.7533
0.6306
0.4930
0.3180
0.1204
复制代码
可以很方便的计算每个主成分所解释的总方差的百分比:>> percent_explained=100*var/sum(var)
percent_explained =
37.8699
13.4886
12.6831
10.2324
8.3698
7.0062
5.4783
3.5338
1.3378
复制代码
可见,前面5个主成分所解释的方差占了80%以上。
用帕累托图描述每个注册烦恼所占的百分数:>> pareto(percent_explained)
>> xlabel('主成分')
>> ylabel('方差解释')
复制代码
有图可以看出,前面3个主成分基本解释了2/3的标准化ratings的总变异性。
(4)第4个输出——Hotelling的T2检验
Hotelling的T2检验统计量是描述每一测量值与数据中心距离的统计量,用它可以找到数据中的极值点:>> [st,ind]=sort(ts);
>> st=flipud(st);
>> ind=flipud(ind);
>> ex=ind(1);
>> ex=ind(1)
ex =
213
>> names(ex,:)
ans =
New York, NY
说明New York, NY是离数据中心最远的城市!!!!
应用Matlab内部数据cites.mat进行分析。该数据是美国329个城市反应生活质量的9项指标的数据。9项指标依次为:气候、住房、健康、犯罪、交通、教育、艺术、娱乐和经济。
首先载入数据,包含3个变量>> clear
>> load cities
>> who
Your variables are:
categories names ratings
复制代码
用箱图表达下:>> boxplot(ratings,0,'+',0)
>> set(gca,'yticklabel',categories)
复制代码
从图可以看出,艺术和住房的变化很大,气候的变化很小。
当原始数据的量级和量纲存在较大差异时,需要先对数据进行标准化,然后进行主成分析。标准化的方法是将原始数据的各列除以各列的标准差:stdr=std(ratings);
sr=ratings./stdr(ones(329,1),:);
复制代码
现在寻找主要成分:[pcs,newdata,var,ts]=princomp(sr);
复制代码
(1)第一个输出——主成分pcs
pcs包括9个主成分,下面只是给出前四列
>> p4=pcs(:,1:4)
p4 =
0.2064 0.2178 -0.6900 0.1373
0.3565 0.2506 -0.2082 0.5118
0.4602 -0.2995 -0.0073 0.0147
0.2813 0.3553 0.1851 -0.5391
0.3512 -0.1796 0.1464 -0.3029
0.2753 -0.4834 0.2297 0.3354
0.4631 -0.1948 -0.0265 -0.1011
0.3279 0.3845 -0.0509 -0.1898
0.1354 0.4713 0.6073 0.4218[/code]
可以看出第一个主成分中第7个元素的权重最大。
可以通过查看p3乘以p3T的结果来判断其正交性:>> p4'*p4
ans =
1.0000 -0.0000 0.0000 -0.0000
-0.0000 1.0000 0.0000 -0.0000
0.0000 0.0000 1.0000 -0.0000
-0.0000 -0.0000 -0.0000 1.0000
计算结果为单位矩阵,说明主成分之间满足正交。
(2)第2个输出——主成分得分(newdata)
主成分得分是原始数据在主成分所定义的新坐标系中的确定的数据,其大小与输入数据矩阵大小相同。
下面我们看看newdata的前两列数据作为前两个主成分时的结果:>> x=newdata(:,1);
>> y=newdata(:,2);
>> plot(x,y,'+')
>> xlabel('第一主成分')
>> ylabel('第二主成分')
从图像可以看出,在右侧有一些异常点。可以使用gnames()函数标注图中的点,下面使用字符串矩阵names调用gnames:>> gname(names)
此时将在图像中生成一个十字交叉线,交点跟随鼠标移动。在散点附近单击,将标注该点的字符串。标注结束后,敲回车。结果显示如下:
对于这些异常值我们可以直接删除,也即是将那几行的元素直接置空,比如New York对应第213行:rsubset=ratings;
rsubset(213,:)=[];
复制代码
(3)第3个输出——主成分方差(var)
主成分方差var是有newdata的对应列所解释的包含方程的向量:>> var
var =
3.4083
1.2140
1.1415
0.9209
0.7533
0.6306
0.4930
0.3180
0.1204
复制代码
可以很方便的计算每个主成分所解释的总方差的百分比:>> percent_explained=100*var/sum(var)
percent_explained =
37.8699
13.4886
12.6831
10.2324
8.3698
7.0062
5.4783
3.5338
1.3378
复制代码
可见,前面5个主成分所解释的方差占了80%以上。
用帕累托图描述每个注册烦恼所占的百分数:>> pareto(percent_explained)
>> xlabel('主成分')
>> ylabel('方差解释')
复制代码
有图可以看出,前面3个主成分基本解释了2/3的标准化ratings的总变异性。
(4)第4个输出——Hotelling的T2检验
Hotelling的T2检验统计量是描述每一测量值与数据中心距离的统计量,用它可以找到数据中的极值点:>> [st,ind]=sort(ts);
>> st=flipud(st);
>> ind=flipud(ind);
>> ex=ind(1);
>> ex=ind(1)
ex =
213
>> names(ex,:)
ans =
New York, NY
说明New York, NY是离数据中心最远的城市!!!!