目的描述
出于模型的需要,我们的团队选择做一次聚类分析,通常这部分在队伍中是会有同学专门负责这块的,至于为什么笔者就不在这里多说了。
解决思路
在MATLAB中封装了有关因子分析的方法--cluster
,读者可以通过help
命令来查看如何调用这个方法。
需要读者注意的是,聚类分析在分析之前会计算"几种距离"的值,具体哪一种距离的值比较合适是需要读者自行选取的,为了达到最优,笔者封装了将各种聚类都计算之后选取最优的方法,在接下来的代码中会给出。
同时具体分成几类也是需要读者自行选取的。
代码展示
function [Max,Method_Max_Index,Incon,Incon_Max,Incon_Max_Index]=Max_cohenet_clust(Data_Y,Method,Depth)
%检查那种距离方式是最好的
for i=1:7
Data_Z=linkage(Data_Y,Method{i});
Cophenet(i)=cophenet(Data_Z,Data_Y);
end
Max=max(Cophenet);
Method_Max_Index=find(Cophenet==Max);
Data_Z=linkage(Data_Y,Method{Method_Max_Index});
TEMP=inconsistent(Data_Z,Depth);
SIZE=size(TEMP);
%求取最好距离方式下逐步分类的不一致值
for j=1:SIZE(1)
if j~=SIZE(1)
Incon(SIZE(1)-j)=TEMP(SIZE(1),4)-TEMP(SIZE(1)-j,4);
end
end
%检查出最大不一致值以找出最好的分类数目
Incon_Max=max(Incon);
Incon_Max_Index=find(Incon==Incon_Max);
function [FData_M,LOCATION,Lab]=Split_Factor_Data(title,F_title,DataSet,index)
%index 表示要提取的Lab有多少个
LOCATION=[];
Lab={};
NUM=1;
for i=1:index
OBJECT=F_title{i,1};
for j=1:584
MSN=title{1,j};
if j~=1
if MSN==OBJECT
LOCATION(:,NUM)=j;
Lab(i,1)={MSN};
Lab(i,2)={OBJECT};
NUM=NUM+1;
end
end
end
FData_M=DataSet(:,LOCATION);
end
%,拿到location,先选出值
[TX_C_D,Loc,Lab]=Split_Cluster_Data(title,Factormatrix,DataSet{1,1},index);
%,求和
SUM_C_D=TX_D'+AZ_D'+CA_D'+NM_D';
%数据规格化
SUM_C_D=zscore(SUM_C_D);
%求取距离向量
Cluster_Method={'average','centroid','complete','median','single','ward','weighted'}
SUM_C_Y=pdist(SUM_C_D);
depth=13;
Cluster_Method={'average','centroid','complete','median','single','ward','weighted'};
%第一步聚类
[Max,Method_Max_Index,Incon,Incon_Max,Incon_Max_Index]=Max_cohenet_clust(SUM_C_Y,Cluster_Method,depth)
Class_Num=?;
%第二次聚类
SUM_C_Best=cluster(linkage(SUM_C_Y,Cluster_Method{Method_Max_Index}),'maxclust',Class_Num)
SUM_C_Z=linkage(SUM_C_Y,Cluster_Method{Method_Max_Index});
%画出cluster轮廓图
silhouette(SUM_C_D,SUM_C_Best)
color=?;
%画出系统聚类树形矩阵图
dendrogram(SUM_C_Z,0,'orientation','right','labels',Factormatrix,'colorthreshold',color)
结果展示
由于结果有多种多样的,直接给出MATLAB的工作空间,有兴趣的读者可以自行下载。
链接: 密码:5gid