聚类分析
1 预备数据
对以下10个向量进行聚类。
X = [ % X=rand(10,2)*5 4.4988 1.5465 4.1081 4.1925 3.2246 2.8404 4.0899 1.8521 3.3011 3.5137 1.7099 2.7329 1.4486 2.2244 1.7060 3.4728 2.6704 3.1066 3.6356 3.9741]
在聚类前,应标准化数据。设X的每个列向量为V,被标准化为(V-mean(V))./std(V)
X=zscore(X)
绘图 figure plot(X(:,1),X(:,2),'*') for i=1:10 text(X(i,1),X(i,2), num2str(i),'FontSize',15); end
2 计算向量之间的相似性
Y是距离(对称)矩阵的向量表示形式 Y = pdist(X, 'euclidean');
% 还原为对称矩阵,便于调试 H=squareform(Y)
更高级的距离计算方式: 带权的欧氏距离 Y = pdist(X, @DISTFUN,[.1 .3 .3 .2 .1]); function d = DISTFUN(XI, XJ, W) d = sqrt((XI-XJ).^2 * W');
3 聚类树的计算与显示 Z=linkage(Y,'single')
聚类C1和聚类C2的距离的计算方法: 'single' 点间的最短距离 'complete' 点间的最远距离 'average' 点间的平均距离 点/聚类编号 点/聚类编号 距离 新聚类编号、组成 2 10 0.4935 11[2 10] 1 4 0.5068 12[1 4] 3 9 0.5846 13[3 9] 11 5 0.6041 14[2 10 5] 6 7 0.6242 15[6 7] 14 13 0.7336 16[2 10 5] [3 9] 15 8 0.8408 17[6 7 8] 16 17 0.9649 18[2 10 5][3 9][6 7 8] 12 18 1.3680 19[1 4] [2 10 5][3 9][6 7 8] dendrogram(Z); %绘制聚类树
4 聚类结果
对聚类树,按照指定数目确定子集。 T=cluster(Z,2);
1 2 2 1 2 2 2 2 2 2 T=cluster(Z,3);
3 1 1 3 1 2 2 2 1 1 T=cluster(Z,4);
4 3 3 4 3 1 1 2 3 3 4 3 3 4 3 1 1 2 3 3
5 聚类评价
C=cophenet(Z,Y); % 相聚系数 计算方法: C??((Zi?ji,j?z)*(Yi,j?y))22?(Zi?ji,j?z)*?(Yi,j?y)i?j
Yi,j是向量i与向量j的距离, y是距离的均值.
Zi,j是向量i与向量j在合并中的距离,z距离的均值。
一般情形:
Z=linkage(Y,'average'); C=cophenet(Z,Y) % 更合理