Matlab 主成分分析与K均值聚类分析实验报告

提示:数据资源在本CSDN号的上传资料中直接领取


1 引言

数据:gyzb.mat(按顺序对应每一列)为:31个省市区的国有控股企业的主要指标(包括:总利润(亿元)、总资产贡献率(%)、资产负债率(%)、流动资产周转次数(次/年)、工业成本费用利用率(%)和人均主营收入(万元/人))。需要使用数据分析方法对该数据进行分析,试着得出一些分析总结。这里使用的分析方法为:主成分分析、K均值聚类分析。


2 算法原理

2.1 主成分分析的简介及算法原理

(1)简介:

主成分分析(Principal Component Analysis,PCA), 是一种分析方法。首先是由K.皮尔森(Karl Pearson)对非随机变量引入的,尔后H.霍特林将此方法推广到随机向量的情形。信息的大小通常用离差平方和或方差来衡量。通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分。在实际中,为了全面分析问题,往往提出很多与此有关的变量(或因素),因为每个变量都在不同程度上反映这个问题的某些信息。

(2)PCA的算法原理:

将n维特征映射到k维上(k<n),这k维是全新的正交特征。这k维特征称为主元,是重新构造出来的k维特征,而不是简单地从n维特征中去除其余n-k维特征。先进行标准化,计算相关系数矩阵;接着,利用相关系数矩阵去求其特征值和特征向量,再将特征值排序;然后,保留前N个最大的特征值对应的特征向量,将数据转换到上面得到的N个特征向量构建的新空间中(实现了特征压缩)。

(3)算法步骤:

【1】对原始数据进行标准化处理。

【2】计算样本的相关系数矩阵。

【3】计算相关系数矩阵的特征值和特征向量。

【4】计算主成分贡献率和累计贡献率。

【5】计算主成分载荷和主成分。

2.2 K均值聚类分析的简介及算法原理

(1)简介:

K均值聚类分析是将样本数据矩阵划分为K个类,使得所有类内对象与该类中心点之间的距离和最小。它属于聚类分析(非监督学习)一种分析方法。

(2)大致算法原理:

首先随机选择初始聚类中心,其中K是用户指定的参数(需要分成几类),然后将数据集中的每个点指派到最近的聚类中心,而指派到一个聚类中心的点就为一个簇(或类别)。然后再根据指派到簇的点,将每个簇的聚类中心更新为该簇所有点的平均值,重复指派和更新步骤,直到簇不发生变化,或者等价的,直到聚类中心不发生变化。

(3)大致算法步骤:

【1】随机地取K个点作为K个初始聚类中心。

【2】计算其它点到这个K个聚类中心的距离。

【3】如果某个点p1距离第n个聚类中心的距离更近(按最小距离准则),则该点p1属于第n个类别,并对其打标签。

【4】计算同一个类中,也就是相同标签的点向量的平均值,作为新的聚类中心。

【5】迭代至所有聚类中心都不变化为止,即算法结束。

(4)适用范围:

K均值适用于绝大多数的数据类型,并且思路不难且有效。但缺点是需要知道K的值,并且不能处理异形簇,比如环形簇、球形簇等。


3 实验结果与分析

3.1 主成分分析的实验结果与分析:

(1)实验思路:

gyzb.mat数据文件是一个每一列都是数据值的样本数据矩阵,列数多,且没有可供判断类别列也没有时间值等。列数多就暂不考虑多元回归分析,没有判断类别就暂不考虑各种判别分析方法,如(贝叶斯判决、神经网络判决、KNN等)。想到可选择对gyzb.mat数据文件进行K均值聚类分析,还有就是因为Matlab有pca()等内置函数,就开始实验了。

(2)实验步骤:

【1】先导入gyzb.mat数据文件,然后观察数据的大致情况;

【2】选择主成分分析;

【3】先在matlab脚本中写好大致的代码思路;

【4】再试着进行编写matlab代码,边写边测试边修改代码边回顾知识;

【5】试着对运行得出的结果及统计图进行分析。

【6】试着修改统计图。

【7】后来增加了基于主成分的K均值聚类分析。

(3)结果及分析:

(3.1)matlab代码1:

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #clcdisp('【1】主成分分析:')
% (1)导入样本数据
load('gyzb_data.mat');% (2)使用标准化,对样本进行归一化处理, z为标准化后的数据,mu是原样本的均值,sigma是原样本的方差。
[z, mu, sigma] = zscore(gyzb_data);
disp('(1)原样本数据的均值:')
disp(mu)
disp('(2)原样本数据的方差:')
disp(sigma)
disp('(3)标准化后的数据:')
disp(z)% (3)进行主成分分析
% coeff是n×m 数据矩阵 gyzb_data 的主成分系数矩阵,主成分系数也称为载荷。
% gyzb_data 的行对应于观测值,列对应于变量。系数矩阵是 m×m 矩阵。coeff 的每列包含一个主成分的系数,并且这些列按成分方差的降序排列。
% 默认情况下,pca 将数据中心化,并使用奇异值分解 (SVD) 算法。
% score 中返回主成分分数,在 latent 中返回主成分方差。主成分方差是 z 的协方差矩阵的特征值。
[coeff, score, latent] = pca(z);
disp('(4)主成分系数(载荷)矩阵(即正交单位化特征向量):')
disp(coeff)
disp('(5)主成分分数:')
disp(score)
disp('(6)主成分方差(即特征值):')
disp(latent)% (4)计算每一种主成分的贡献率
perContributionRate = 100*latent/sum(latent);
disp('(7)每一种主成分(每一列)的贡献率(单位为 %):')
disp(perContributionRate)% (5)计算累积贡献率
cumContributionRate = cumsum(perContributionRate);
disp('(8)计算累积贡献率(单位为 %):')
disp(cumContributionRate)% (6)这里绘制出前两个主成分得分的散点图
figure(1);
plot(score(:, 1), score(:, 2), 'o');
title('前两个主成分得分的散点图:')
xlabel('前第一列的主成分得分');
ylabel('前第二列的主成分得分');% (7)绘制出各个成分的3D饼图
figure(2);
pie3(perContributionRate);
title('样本数据的各个成分的3D饼图:')
legend('总利润(亿元)', '总资产贡献率(%)', '资产负债率(%)', '流动资产周转次数(次/年)', '工业成本费用利用率(%)', '人均主营收入(万元/人)');% (8)利用主成分表达式,求主成分,并形成主成分矩阵Y,将样本数据降为3维
Y = gyzb_data*coeff(:,1:3);% (9)开始基于主成分的K均值聚类分析:
disp('基于主成分的K均值聚类分析:')% (10)选择初始聚类中心点。
startdata1 = Y([5, 15, 25],:);% (11)获取聚类结果,index为聚类结果
[index, ctrs] = kmeans(Y, 3, 'start', startdata1);% (12)绘制出轮廓图,s1为轮廓向量,h1为图形句柄
figure(3)
[s1, h1] = silhouette(Y, index);% (13)对聚类结果矩阵、轮廓值向量进行转置输出,(size(idx)、size(s)都为31行1列)
disp('(1)轮廓图的轮廓值向量:')
disp(s1')
disp('(2)使用K均值聚类后,样本数据的各行的聚类类别:')
disp(index')
figure(4);
plot(Y(index==1,1),Y(index==1,2),'r.','MarkerSize',12)
hold on
plot(Y(index==2,1),Y(index==2,2),'m.','MarkerSize',12)
hold on
plot(Y(index==3,1),Y(index==3,2),'c.','MarkerSize',12)
hold on
plot(ctrs(:,1),ctrs(:,2),'ko','MarkerSize',4,'LineWidth',1.5)
legend('第 1 类聚类点','第 2 类聚类点','第 3 类聚类点','聚类中心点','Location','NW')
title('基于主成分的K均值聚类后的样本散点图:');
xlabel('主成分的前第一列值');
ylabel('主成分的前第二列值');**# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #**

(3.2)结果截图及分析:

温馨提示:基于主成分的聚类分析的结果显示在后面!




分析:由上面的结果可知:标准化后的样本数据的前三列贡献率达到82.5654%,已经超过2/3以上,且这上列数据为’总利润(亿元)', ‘总资产贡献率(%)’, '资产负债率(%)‘的实际意义等,大致可以将这3个变量取代原来的6个变量,来实现降维。通过主成分系数(载荷)矩阵(即正交单位化特征向量矩阵)的前三列乘以样本数据矩阵。就能够形成新的近似样本的矩阵,它的规模从316降为313。(该矩阵不是原始样本数据的’总利润(亿元)’, ‘总资产贡献率(%)’, '资产负债率(%)'那3列,而是代表这31个省市区的国有控股工业企业的主要指标,即原始样本数据。)

3.2 K均值聚类分析的实验结果与分析:

(1)实验思路:

gyzb.mat数据文件是一个每一列都是数据值的样本数据矩阵,列数多,且没有可供判断类别列也没有时间值等。列数多就暂不考虑多元回归分析,没有判断类别就暂不考虑各种判别分析方法,如(贝叶斯判决、神经网络判决、KNN等)。想到可选择对gyzb.mat数据文件进行K均值聚类分析,还有就是因为Matlab有Kmeans()、silhouette()等内置函数,就开始实验了。

(2)实验步骤:

【1】先导入gyzb.mat数据文件,然后观察数据的大致情况;

【2】选择K均值聚类分析;

【3】先在matlab脚本中写好大致的代码思路;

【4】再试着进行编写matlab代码,边写边测试边修改代码边回顾知识;

【5】试着对运行得出的结果及统计图进行分析。

【6】试着修改统计图。

(3)结果及分析:

(3.1)matlab代码:

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
disp(' ')
disp('【2】K均值聚类分析:')
% (1)导入样本数据
% (2)选择初始凝聚点。
startdata = gyzb_data([5, 15, 25],:);
% (3)获取聚类结果,idx为聚类结果
[idx, ctrs] = kmeans(gyzb_data, 3, 'start', startdata);
% (4)绘制出轮廓图,s为轮廓向量,h为图形句柄
figure(3)
[s, h] = silhouette(gyzb_data, idx);
% (5)对聚类结果矩阵、轮廓值向量进行转置输出,(size(idx)、size(s)都为31行1列)
disp('(1)轮廓图的轮廓值向量:')
disp(s')
disp('(2)使用K均值聚类后,样本数据的各行的聚类类别:')
disp(idx')
figure(4);
plot(gyzb_data(idx==1,1),gyzb_data(idx==1,2),'r.','MarkerSize',12)
hold on
plot(gyzb_data(idx==2,1),gyzb_data(idx==2,2),'m.','MarkerSize',12)
hold on
plot(gyzb_data(idx==3,1),gyzb_data(idx==3,2),'c.','MarkerSize',12)
hold on
plot(ctrs(:,1),ctrs(:,2),'ko','MarkerSize',4,'LineWidth',1.5)
legend('第 1 类聚类点','第 2 类聚类点','第 3 类聚类点','聚类中心点','Location','NW')
title('K均值聚类后的样本散点图:')
xlabel('样本数据的前第一列值');
ylabel('样本数据的前第二列值');
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

(3.2)结果截图及分析:

(3.2.1)聚类结果文本显示:

【2】K均值聚类分析:(1)轮廓图的轮廓值向量:1 至 14 列0.1194  0.9029  0.9376  0.9266  0.9382  0.9449  0.8985  0.8650  0.7922  0.4571  0.7159  0.7824  0.9051  0.894715 至 28 列0.8702  0.8701  0.8966  0.8578  0.7976  0.9327  0.9078  0.7069  0.4671  0.7803  0.7943  0.8544  0.8397  0.937029 至 31 列0.9158  0.9030  0.5497(2)使用K均值聚类后,样本数据的各行的聚类类别:1 至 24 列22   3   1   1   1   1   3   3   2   3   3   1   1   1   2   1   3   1   2   1   1   1   3   125 至 31 列1   1   2   1   1   1   3

分析:这里做过修改多次修改初始聚类中心的测试,由于篇幅过于赘余,便省掉了一些数据,测试后:聚类效果几乎相似。可以推断:初始的聚类中心的不同,对聚类结果没有很大的影响,而对迭代次数有明显的影响。数据的输入顺序不同,同样会影响迭代次数,而对聚类结果没有太大的影响。

(3.2.2):聚类结果轮廓图显示:

【统计图1】

(3.2.3)聚类结果散点图显示:

【统计图2】

结果分析:根据(3.2.1)、【统计图1】、【统计图2】等,可见在K=3的情况下,即聚成3种类别的情况下,样本点的簇在(类别)分配结果值算是不错的。就是说:根据31各省市区的国有控股工业企业的主要指标,可以将这31个企业分配成3种类别的企业。

但是也得考虑k-均值算法收敛到了局部最小值,而非全局最小值。因而使用不同的K的K均值算法的聚类结果不是都是那么可观、分明的。

(3.3)基于主成分的K均值聚类分析与K均值聚类分析的结果比较:

(3.3.1)聚类结果的结果比较:

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *【1】基于主成分的K均值聚类分析:(1)轮廓图的轮廓值向量:1 至 14 列0.5077  0.8351  0.9309  0.9049  0.9326  0.9378  0.8991  0.8651  0.7025  -0.3507  0.8915  0.8044  0.8101  0.804315 至 28 列0.8204  0.9112  0.9076  0.8575  0.8026  0.9053  0.9193  0.7174  0.3470  0.8641  0.7180  0.8240  0.7506  0.925429 至 31 列0.8967  0.8982  0.6657(2)使用K均值聚类后,样本数据的各行的聚类类别:1 至 24 列2   3   1   1   1   1   3   3   2   **2**   3   1   1   1   2   1   3   1   2   1   1   1   3   125 至 31 列1   1   2   1   1   1   3* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *【2】K均值聚类分析:(1)轮廓图的轮廓值向量:1 至 14 列0.1194  0.9029  0.9376  0.9266  0.9382  0.9449  0.8985  0.8650  0.7922   0.4571  0.7159  0.7824  0.9051  0.894715 至 28 列0.8702  0.8701  0.8966  0.8578  0.7976  0.9327  0.9078  0.7069  0.4671  0.7803  0.7943  0.8544  0.8397  0.937029 至 31 列0.9158  0.9030  0.5497(2)使用K均值聚类后,样本数据的各行的聚类类别:1 至 24 列22   3   1   1   1   1   3   3   2   **3**   3   1   1   1   2   1   3   1   2   1   1   1   3   125 至 31 列1   1   2   1   1   1   3* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

(3.3.2)聚类轮廓图的结果比较

【1】基于主成分的K均值聚类分析轮廓图:

【2】K均值聚类分析轮廓图:

(3.3.3)聚类效果散点图:

【1】基于主成分的K均值聚类分析:

【2】K均值聚类分析:

分析:基于主成分的K均值聚类分析与K均值聚类分析的聚类结果只有一项(即第10行数据)不一致,其两者对应的轮廓图几乎是近似的,其对应聚类效果散点图虽然由于坐标轴的不对应等而产生的显示效果,但其聚类效果几乎是近似且可观。可见基于主成分的K均值聚类分析与原数据的K均值聚类分析的聚类结果可以说是近似,这也间接地说明前面进行的主成分分析,然后进行数据降维的处理算是合理的。

4 总结

主成分分析对于处理“31各省市区的国有控股工业企业的主要指标”的数据矩阵的降维来说是很可靠的。在做主成分分析时,若是面对每列数值差异性过大的样本数据可考虑进行标准化处理,然后再进行主成分分析等降维处理。在K均值聚类分析中,初始的聚类中心的不同,对聚类结果没有很大的影响,而对迭代次数有明显的影响。数据的输入顺序不同,同样会影响迭代次数,而对聚类结果没有太大的影响。而对K的取值,对聚类结果的影响却是很大的,这是由于研究者或测试者的主观因素,K的取值可以说还是得吃经验、需要对数据有点敏感的。聚类结果得出的类别,还可以在类别内部进行分析。


参考文献

《MATLAB数据分析教程》, 由伟、刘亚秀, 清华大学出版社

《MATLAB数据分析方法》, 李柏年、吴礼斌,张孔生,丁华, 机械工业出版社

《MATLAB数据分析与挖掘实战》, 张良均等, 机械工业出版社, 2015.06.01

Matlab 主成分分析与K均值聚类分析实验报告相关推荐

  1. 【MATLAB统计分析与应用100例】案例018:matlab读取Excel数据,进行K均值聚类分析

    文章目录 1. K均值聚类分析结果 2. matlab完整代码 (1)读取数据,并进行标准化变换 (2)选取初始凝聚点,进行聚类 (3)绘制轮廓图 1. K均值聚类分析结果 2. matlab完整代码 ...

  2. 聚类分析 | MATLAB实现k-Means(k均值聚类)分析

    目录 聚类分析 | MATLAB实现k-Means(k均值聚类)分析 k-均值聚类简介 相关描述 程序设计 学习小结 参考资料 致谢 聚类分析 | MATLAB实现k-Means(k均值聚类)分析 k ...

  3. 【MATLAB统计分析与应用100例】案例019:matlab读取Excel数据,进行K均值聚类分析

    文章目录 1. 读取数据,并进行标准化变换 2. 进行模糊C均值聚类 3. 查看聚类结果 4. K均值聚类分析结果 1. 读取数据,并进行标准化变换 % 从文件examp09_05.xls中读取数据 ...

  4. matlab fft谱分析实验报告,基于matlab的fft频谱分析及应用实验报告.docx

    基于matlab的fft频谱分析及应用实验报告 实验三用FFT对信号进行频谱分析 一实验目的 1能够熟练掌握快速离散傅立叶变换的原理及应用FFT进行频谱分析的基本方法:2了解用FFT进行频谱分析可能出 ...

  5. SPSS聚类分析:K均值聚类分析

    SPSS聚类分析:K均值聚类分析 一.概念:(分析-分类-K均值聚类) 1.此过程使用可以处理大量个案的算法,根据选定的特征尝试对相对均一的个案组进行标识.不过,该算法要求您指定聚类的个数.如果知道, ...

  6. 无穷大功率电源matlab仿真,MATLAB-Simulink系统建模与仿真-实验报告

    MATLAB/Simulink 电力系统建模与仿真 实验报告 姓名: ****** 专业:电气工程及其自动化 班级: ******************* 学号:****************** ...

  7. 电力系统matlab实验报告,基于matlab语言计算电力系统暂态稳定仿真程序实验报告.docx...

    基于matlab语言计算电力系统暂态稳定仿真程序实验报告 BeijingJiaotongUniversity 电力系统分析 暂态稳定分析实验 学院:电气工程学院 班级:xxxxxxxx 学号:xxxx ...

  8. 手把手教你R语言做k均值聚类分析

    今天聊聊k均值聚类分析,我们先要知道什么是类,在大数据时代,我们每个人都被打上很多个性标签,比如:宅男,月光族,手机控,非主流等等,每个标签都可以算是一个类,因此,可以不严谨的说:类是一些有特殊属性个 ...

  9. 全国113个城市空气质量的K均值聚类分析--基于R

    下表给出了2017年全国113个环保重点城市空气质量年度数据(资料来源:中华人们共和国国家统计局).它们分别为:二氧化硫平均浓度(微克每立方米,),二氧化氮平均浓度(微克每立方米,);可吸入颗粒物(P ...

最新文章

  1. IJ pom包的自动导入设置
  2. python二元函数如何编写,如何用Python和sklearn编写多元对数回归?
  3. Spring Boot-Profile
  4. java 日期 运算
  5. 使用 HTTP 缓存防止不必要的网络请求
  6. Atom React或前端插件推荐
  7. kivy中文手册python_K-Meleon
  8. 前端学习(1979)vue之电商管理系统电商系统之让文本框获得焦点
  9. oracle 10.2.0.1升级到10.2.0.4
  10. python生成的词云没有图案_还在为专栏封面发愁?我用Python写了个词云生成器!...
  11. Spring Boot JWT 快速入门
  12. SQLite | 数据库设计与 Creat Table 语句
  13. 父工程的版本号决定上传私服仓库的位置
  14. 必 备 习 题 集 (五)
  15. null可以转换成任意非基本类型(int/short/long/float/boolean/byte/double/char以外)
  16. Linux socket程序演示
  17. wps文字表格制作拼音田字格模板_宝宝拼音汉字田字格doc模板下载
  18. 七层网络协议模型(ISO模型)
  19. androd欢迎页播放视频和广告页面
  20. ngnix 端口映射

热门文章

  1. Redis缓存穿透、击穿、雪崩
  2. 自定义标签JSTL标签库详解
  3. HTML做一个抗疫逆行者感动人物页面(纯html代码)
  4. 【JVM】元数据空间(Metaspace)
  5. VS2010安装失败
  6. JS哈希表算法——空间换时间
  7. Apache伪静态(Rewrite).htaccess文件详解以及RewriteCond 规则
  8. 高考平行报志愿计算机录取规则,高考平行志愿是怎么录取的?录取规则是什么?...
  9. 云服务器明明系统盘有40G但是上传文件时发现容量不足问题
  10. db2 java存储过程,db2存储过程 - 辜圆圆的个人空间 - OSCHINA - 中文开源技术交流社区...