先上结果
1:聚类原理
聚类分析指将物理或抽象对象的集合分组为由类似的对象组成的多个类的分析过程。它是一种重要的人类行为。分解聚类的基本思想是首先将所有的样本归成一类,然后依据相似性原理将其进行分解,分解的效果好坏我们通过一个评价函数对其进行评价:
、
其中N是总样本数,N1是第一类的样本数,N2是第二类的样本数,括号里的是均值。我们可以从这个评价函数里很明显的看出,这里采用了欧几里得距离来衡量样本之间的差异,同样的,我们也可以采用马马哈拉诺比斯距离和明科夫斯基距离进行衡量,这里不再赘述。
在分解聚类的过程中,我们常用的是对分算法,它的特点是将样本分解成两个类别。现在我们介绍对分算法:
1:选取目标函数,把全体样品分成两类
X = {x_1,x_2,…x_n};Y = { };E = 0
2:计算分别将x_1,x_2等样本从X计入Y中的E值,我们设将x_i计入Y样本时E最大,那么就把它归入Y。此时
X = {x_1,x_2,…x_i-1,x_i+1};
Y = {x_i};
E=E(1)
3:继续计算将x_1,x_2等样本从X计入Y中的E值,我们设将x_j计入Y样本时E最大,那么就把它归入Y。
4:若E(K+1)>=E(K),我们就重复上述行为,知道E(K)到达最大值停止,此时分类结果是最好的。
需要注意的是:在每次我们将一个样本从X拿出来放到Y的过程中,X的均值和Y的均值都发生了变化,需要重新计算,我们可以使用下列递推公式进行均值的更新
2:代码实现
整体代码我分成了三个部分:
1:第一部分是主函数部分,负责打乱输入的数据次序和将得到的数据进行划分,需要注意的是,IRIS数据集有三个大分类,我们要使用分解聚类对其进行操作,可以先进行一次聚类,然后选择第一次聚类的较大的数据集结果进行二次聚类,这样就可以将IRIS样本分解成三个类别。
[E(1),cluster1,cluster2] = find_min(A,cluster1,cluster2);
[E(2),cluster1,cluster2] = find_min(A,cluster1,cluster2);
for i=3:m
[E(i),cluster1,cluster2] = find_min(A,cluster1,cluster2);
if (E(i-2)>=E(i-1))
break;
end
end
a=find(cluster1); %第一类结果放在a里面
------------------------------------------------------------------------------------
plot3(C_1(:,1),C_1(:,2),C_1(:,3),'r*');hold on;
plot3(C_2(:,1),C_2(:,2),C_2(:,3),'g*');hold on;
plot3(C_3(:,1),C_3(:,2),C_3(:,3),'b*');hold off;
title('可视化图形');
legend('Iris-setosa','Iris-versicolor','Iris-virginica');
xlabel('萼片长度');ylabel('萼片宽度');zlabel('花瓣长度');
2:第二个部分是均值推导部分。
function [X1,Y1,Z1,T1,X2,Y2,Z2,T2,m1,m2] = cut_cluster(A,B,C,D,cluster1,cluster2)
cluster1_index=find(cluster1);
cluster2_index=find(cluster2);
[m1,~]=size(cluster1_index);
[m2,~]=size(cluster2_index);
3:第三个部分是评价函数部分,我将每个每次的E值放在评价矩阵里,这样可以方便的对程序进行处理。
function [c,cluster1,cluster2] = find_min(A,cluster1,cluster2)
cluster1_copy = cluster1;cluster2_copy = cluster2; %进行矩阵投影
[a,~] = size(A);
E = zeros(a,1);
此外,由于样本的分类在IRIS数据集里面已经给了出来,所以我们可以在后续中加入准确度度量函数,以评价这个方法的优劣。
E值矩阵:
分类展示:
结果可视化(这里使用了四个变量里的萼片长度和宽度,花瓣长度作为三个坐标轴进行可视化操作):