西安交大,模式识别,基于IRIS的K-means聚类与ISODATA聚类算法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1 NC ∑ NjD j Nj j =1
第七步:判别分裂、合并及迭代运算等步骤: (1)如果迭代运算次数已达 I 次,即最后一次迭代,置 θ C = 0,跳到第十 一步,运算结束。 (2)如果 Nc≤K/2,即聚类中心的数目等于或不到规定值的一半,则进 入第八步,将已有的聚类分裂。 (3)如迭代运算的次数是偶次,或 Nc≥2K,不进行分裂处理,跳到第十 一步;如不符合以上两个条件(即既不是偶次迭代,也不是≥2K) , 则进入第八步,进行分裂处理。 第八步:分裂处理。计算每个聚类 Sj 中各样本到聚类中心的标准差。
2.1 实验目的 练习 ISODATA 聚类算法,对 IRIS 数据进行分类,加深对 ISODATA 聚类算 法聚类算法的理解,体验不同初始参数对聚类的影响。 2.2 实验原理 ISODATA 算法,即迭代自组织分析算法,通过设定初始参数引入人机对话 环节,并使用归并与分裂的机制,当某类样本数目少于某阈值时,需将其取消; 当某类标准差大于某一阈值或其样本数目超过某一阈值时,将其分为两类;当某 两类聚类中心距离小于某一阈值时,将它们合并为一类。根据初始聚类中心和设 定的类别数目等参数迭代,最终得到一个比较理想的分类结果。 ISODATA 算法的具体步骤如下。 K:预期的聚类中心数据;
θ N :一个聚类中最少的样本数目,若小于此数目,则不能独立成类;
θ S :为一个聚类域中样本距离分布的标准差;
θ C :两聚类中心间的最小距离,小于此类,则合并两类;
L:在一次迭代算法中,可以合并的聚类中心个数 I:为迭代运算次数。 第一步:将 N 个样本的模式读入,预选 Nc 个初始聚类中心,他可以不必等 于所要求的聚类中心个数, 可以从样本中任选; 确定初始参数 K,θ N ,θ S ,θ C , L,I。 第二步:将各个样本按最小距离准则划分到各类。若 Dj=min{‖x-zj‖},则 x∈Sj 第三步:如果 Sj 中的样本数 Nj< θ N ,取消该样本子集,Nc=Nc-1。 1 第四步:修正各聚类中心。Zj= ∑ x ,j=1,2,…,Nc Nj x∈Sj 1 第五步:计算 Sj 中的样本到聚类中心的平均距离 D j = ∑ x − Zj Nj x∈Sj 第六步: 计算全部模式样本与其相应聚类中心的总平均距离 D =
第九步:求每一标准差向量 σj 中的最大分量,以{σjmax}代表。 第十步: 在最大分量集{σjmax}中, 如有 σjmax > θ S , 同时又满足: 1. D < D j 子集平均距离大于总体平均距离,和 Nj>( θ N +1)*2,Sj 中样本总数超过最少数目 的一倍以上;2.Nc≤K/2,即类别不到规定的一半。则将 Zj 分裂为两个新的聚类 中心,且 Nc=Nc+1。完成分裂运算后,则跳回第二步,迭代次数加 1。 第十一步:计算全部聚类中心的距离。 Dij = Z i − Z j , i=1,2,…,Nc-1 , j=i+1,…,Nc 第十二步:比较 Dij 与 θ C 值,将 Dij< θ C 的值按最小距离次序递增排列 第十三步:将距离为 Di1j1 的两个聚类中心 Zi1 和 Zj1 合并。 第十四步:如果是最后一次迭代运算(即第 I 次) ,算法结束。否则回到第 一步且迭代次数加 1(如果需由操作者改变输入参数;或返回到第二步,如果输 入参数不变时) 。 2.3 聚类效果评价 同 1.3 2.4 实验结果与分析 为简化程序,每次迭代最多只进行一次合并,即 L=2。 在全部样本中随机抽取 N c 个样本作为初始聚类中心。 2.4.1 实验 1 当初始参数设置为= N c 10, = K 3, = θ n 5, = θ s 1.8, = θ c 1.5, = I 100 ,且不引入人 机交互时。 单次实验结果如下:
整个聚类结果的 Class_F 值为 0.8918。可见本次聚类效果较优。 但实际上,并非每次实验结果都有如此优良的效果,例如如下这次实验。
由图可以直观看出,本次聚类效果并不理想。 本次聚类随机选出的初始聚类中心为第 14,48,88 个样本。 第 i 类数据被聚类至第 j 簇的数量如表所示 第1簇 第2簇 第 1 类数据 41 9 第 2 类数据 2 0 第 3 类数据 0 0
第3簇 0 48 50
由表可看出,第 1 类数据对应第 1 聚类簇;但第 2 类与第 3 类数据并没有成 功分类。这主要是因为初始聚类中心中有 2 个都取自第 1 类样本,而第 1 类样本 距离第 2,3 类样本距离较远, 在聚类过程中聚类中心不易转移到 2,3 类样本附近, 因此,2,3 类数据附近只有一个聚类中心,所以没能成功将 2,3 类分开。 各类数据的 F 值为 第1类 第2类 第3类 F值 0.8817 0.6486 0.6757 整个聚类结果的 Class_F 值为 0.7353。可见本次聚类效果不佳。 由这两次实验对比发现,K-means 聚类算法高度依赖于初始聚类中心,当初 始聚类中心选地较接近实际分类情况时聚类效果会较好, 否则聚类效果有可能会 不佳。 对 K-means 聚类算法进行 200 次 Monte Carlo 实验,得到平均 Class_F_MC 值为 0.8369。可判断 K-means 聚类算法对 IRIS 数据分类的整体平均 F 值约为 0.8369,整体聚类效果较好。 1.5 程序实现 %Auther: XXX %Student Number: XXX %Date: 2014.5.1. %Purpose: Practise of K-means
一. K-means 聚类算法
1.1 实验目的 练习 K-means 聚类算法,对 IRIS 数据进行分类,加深对 K-means 聚类算法 的理解。 1.2 实验原理 K-means 聚类算法有如下几个步骤: Step1:选择 K 个初始的聚类中心 Step2:将样本集中的样本按照最小距离准则分配到最临近聚类(本实验中采用欧 式距离) Step3:分配完成后计算各个聚类中心 Step4:如果聚类中心改变则返回 step2 重复,进行迭代。 如果聚类中心不改变,则算法收敛,结束。 1.3 聚类效果评价 经过文献学习,我采取了基于人工标注簇的 F 值来评价聚类效果的优劣。 但这个对 对每个人工标注的簇 Pj 假设在 C 结构中存在一个与之对应的簇 Ci , 应关系是未知的。为了发现 Ci ,我们遍历聚类结果 C 中的 m 个簇,分别计算准 确率、召回率和 F 值,从中挑选最优指标值及其对应的簇,以最优的指标值来判 定 Pj 的质量。 对于任何的人工标注簇 Pj 和聚类簇 Ci 相应的准确率、 召回率和 F 值计算公式 如下: a.准确率
由图可以直观看出,本次聚类效果较为理想。 本次聚类随机选出的初始聚类中心为第 42,136,149 个样本。 第 i 类数据被聚类至第 j 簇的数量如表所示 第1簇 第2簇 第 1 类数据 0 50 第 2 类数据 48 0 第 3 类数据 14 0
第3簇 0 2 36
由表可看出,第 1 类数据对应第 2 聚类簇;第 2 类数据对应第 1 聚类簇;第 3 类数据对应第 3 聚类簇。 各类数据的 F 值为 第1类 第2类 第3类 F值 1.0000 0.8571 0.8182
%调用 K-means 函数 [class,num,center] = kmeans(x,k,center);%调用 K-均值函数 %统计聚类效果 %result(i,j)代表第 i 类数据被聚类至第 j 簇的数量
result = zeros(k,k); for m=1:3 for i=(50*(m-1)+1):1:50*m for j=1:3 if class(i)==j result(m,j) = result(m,j)+1; end end end end disp('result(i,j)表示第 i 类数据被聚类至第 j 簇的数量'); result %计算准确率,召回率,F 值 %P(i,j)代表第 i 类数据与第 j 簇相应的准确率 %R(i,j)代表第 i 类数据与第 j 簇相应的召回率 for i=1:3 for j=1:3 P(i,j) = result(i,j)/num(j); R(i,j) = result(i,j)/50; F(i,j) = 2*P(i,j)*R(i,j)/(P(i,j)+R(i,j)); end end disp('F(i,j)代表第 i 类数据与第 j 簇相应的 F 值'); F disp('FF(i)代表第 i 类数据的 F 值'); FF = max(F,[],2) disp('整个聚类结果的 F 值') F_final = mean(FF) F_MC = F_MC+F_final; end disp('200 次 MonteCarlo 后,F 的均值为'); F_MC = F_MC/MonteCarlo %绘制聚类效果图 subplot(2,1,2); index1 = find(class==1); plot(x(index1,3),x(index1,4),'r*');%红色*表示第 1 簇 hold on; index2 = find(class==2); plot(x(index2,3),x(index2,4),'b+');%红色*表示第 1 簇
close all; clear all; clc; %数据导入 iris_dataset = load('iris_dataset.txt'); %导入 iris 数据集 x = iris_dataset; %待分类样本 %给数据添加类别标签 label = [ones(50,1);ones(50,1)*2;ones(50,1)*3]; iris_dataset = [iris_dataset,label]; %使用数据前两维画出真实分类图 subplot(2,1,1); plot(x(1:50,3),x(1:50,4),'r*');%红色*表示第 1 类 hold on; plot(x(51:100,3),x(51:100,4),'b+');%红色*表示第 1 类 hold on; plot(x(100:150,3),x(100:150,4),'go');%红色*表示第 1 类 hold on; title('数据原始分类图'); legend('第 1 类','第 2 类','第 3 类'); %给定聚类数目 k = 3; MonteCarlo=200; F_MC = 0;%MonteCarlo 平均 F 值 for r=1:MonteCarlo %随机选取 3 个初始聚类中心 n = randperm(150); center(1,:) = x(n(1),:); center(2,:) = x(n(2),:); center(3,:) = x(n(3),:); disp('3 个初始聚类中心为'); disp('第'),n(1),n(2),n(3),disp('个样本')
P ( Pj , Ci ) =
Pj Ci Ci
(1)
b.召回率
R ( Pj , Ci ) =
Pj Ci Pj
(2)
c.F 值
F ( Pj , Ci ) =
2 ⋅ P( Pj , Ci ) ⋅ R( Pj , Ci ) P( Pj , Ci ) + R( Pj , Ci )
(3)
利用(3)式,对于每一个人工标注簇 Pj Байду номын сангаас我们可以定义其 F 值
hold on; index3 = find(class==3); plot(x(index3,3),x(index3,4),'go');%红色*表示第 1 簇 hold on; title('聚类效果图'); legend('第 1 簇','第 2 簇','第 3 簇');
二、ISODATA 聚类算法
F ( Pj ) = max F ( Pj , Ci )
1≤i ≤ m
(4)
进一步,对所有簇的 F 值作加权平均,则可得到整个聚类结果的 F 值
F =⋅ ∑ ω j F ( Pj ),
j =1
s
= ωj = s
Pj
Pj n
∑P
i =1 i
(5)
其中,公式(4)计算某个人工标注簇的 F 值;公式(5)通过评价全局所有的人 工标注簇来评价整个聚类结果,最终的 F 值我们成为 Class_F 值。 Class_F 值强调以人工标注簇为基准,聚类的结果尽量地逼近事先确定的人 工标注结构,该指标是一个非常有用的指标,目前在相关文献中使用比较频繁。 Class_F 值指标对聚类结果的优劣的整体区分能力比较强。 1.4 实验结果与分析 实验中在 150 个数据样本中随机抽取 3 个作为初始聚类中心。 经实验可知,样本数据的第 3 维和第 4 维在不用类之间区分度较大。所以为 使分类更直观, 我使用各数据的 3、 4 维数据绘制数据原始分类图和聚类效果图。 下面考察一次实验结果: