MATLAB感悟(3)--聚类分析

目的描述

​ 出于模型的需要,我们的团队选择做一次聚类分析,通常这部分在队伍中是会有同学专门负责这块的,至于为什么笔者就不在这里多说了。

解决思路

​ 在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

猜你喜欢

转载自my.oschina.net/u/3483440/blog/1626630
今日推荐