KMeans聚类算法模式识别
各种聚类算法的比较

各种聚类算法的比较聚类算法是一种将数据按照相似性分组的无监督学习方法。
在数据分析和机器学习中,聚类算法被广泛应用于数据挖掘、模式识别、图像处理等领域。
本文将介绍几种常见的聚类算法,并对它们进行比较。
1. K-means算法K-means算法是最常见的聚类算法之一,它将数据划分为K个集群,每个集群包含最接近其均值的数据点。
该算法迭代地更新集群的均值,直到满足收敛条件。
K-means算法简单、高效,适用于大型数据集。
然而,它对异常值和噪声敏感,并且对初始聚类中心的选择非常敏感。
2.层次聚类算法层次聚类算法是一种自底向上或自顶向下的聚类方法,它通过计算数据点之间的相似性构建一个聚类层次结构。
这种层次结构可以以树状图的形式表示,称为树状图聚类。
层次聚类算法的优点是不需要指定聚类个数,且能够处理任意形状的聚类。
然而,该算法的计算复杂度较高,并且对输入数据的规模和噪声敏感。
3.密度聚类算法密度聚类算法通过计算数据点周围的密度来确定聚类结构。
DBSCAN是最常见的密度聚类算法之一,它通过指定半径和邻域密度来定义聚类。
DBSCAN能够识别任意形状的聚类,并且对噪声和异常值具有较高的鲁棒性。
然而,密度聚类算法对参数的选择非常敏感,并且对高维数据和不同密度的聚类效果较差。
4.基于概率的聚类算法基于概率的聚类算法假设数据服从其中一种概率分布,并通过最大化似然函数来进行聚类。
GMM (Gaussian Mixture Model) 是一种常见的基于概率的聚类算法,它假设数据由多个高斯分布组成。
GMM算法能够分离具有不同协方差的聚类,适用于高维数据和非球状的聚类。
然而,该算法对初始参数的选择敏感,并且计算复杂度较高。
5.划分聚类算法划分聚类算法将数据划分为互斥的聚类,然后通过迭代地重新分配数据点来优化聚类质量。
PAM (Partitioning Around Medoids) 和CLARA (Clustering Large Applications)是常见的划分聚类算法。
各种聚类算法的优缺点

各种聚类算法的优缺点在机器学习领域中,聚类(cluster)是最基本的无监督学习问题之一。
聚类算法是指把具有相似性质的数据对象分组的算法,被广泛应用于数据挖掘、模式识别等领域。
本文将介绍几种常见的聚类算法、它们的优缺点,并与之间做出比较。
一、K-Means聚类算法K-Means算法又称为K均值算法,是最为普及的一种聚类算法。
该算法通过将 n 个对象分到 k 个类的方法来使每个数据对象都与所属类的均值最为接近。
K-Means聚类算法有以下优缺点:优点:1.简单、易于实现。
2.计算速度快。
缺点:1.需要预先设定数据类别数量,且对初始化比较敏感。
2.数据集分布不均匀或聚类类别的数量差别较大时,聚类效果较差。
二、层次聚类算法层次聚类算法是一种基于树形结构的聚类方法,可以得到不同类别的层次结构。
该算法的核心思想就是通过计算每个数据对象间的距离并逐步将他们聚合成层次结构。
层次聚类算法的优缺点如下:优点:1.可以帮助我们发现数据对象之间的内部关系和层次结构。
2.不需要预先设定聚类类别数量。
缺点:1.计算复杂度较高,不适合大规模数据集。
2.聚类的结果可能会很大,难以在可视化方面得到较好的展示效果。
三、DBSCAN聚类算法DBSCAN是基于密度的聚类算法。
该算法将具有密度连接的数据点视为一组,并且可以在其它密度较低的区域中选择单个数据点。
DBSCAN聚类算法的优缺点如下:优点:1.不需要预设聚类类别数量。
2.能够发现任意形态的聚类。
缺点:1.初始化比较敏感,对参数设置等因素较为敏感。
2.难以解决密度分布不均一、噪音点分布不规律的问题。
四、BIRCH聚类算法BIRCH算法是基于描述的聚类方法,是聚类中的层次算法。
BIRCH的全称是Balanced Iterative Reducing and Clustering using Hierarchies,它采用一种合并聚类方式,通过类的层次结构来简化聚类过程。
BIRCH聚类算法的优缺点如下:优点:1.该算法能够处理海量数据。
kmeans聚类算法原理与步骤

kmeans聚类算法原理与步骤K-means聚类算法原理与步骤K-means聚类算法是一种常用的无监督学习算法,用于将数据集划分成不同的类别。
该算法的原理和步骤如下:一、算法原理1. 初始化:选择K个初始的聚类中心点,可以是随机选择或者根据领域知识进行选择。
2. 数据分配:根据欧氏距离等度量方式,将每个样本点分配到与其最近的聚类中心点所代表的类别。
3. 聚类中心更新:根据当前分配的聚类结果,重新计算每个类别的聚类中心点。
4. 重复步骤2和步骤3,直到聚类中心点不再发生变化或达到预设的迭代次数。
5. 输出最终的聚类结果。
二、算法步骤1. 选择聚类的数量K:根据问题的具体要求和领域知识,确定聚类的数量K。
2. 初始化聚类中心点:从数据集中随机选择K个样本点作为初始的聚类中心点。
3. 计算样本点到聚类中心点的距离:对于每个样本点,计算其与各个聚类中心点之间的距离,常用的距离度量方式是欧氏距离。
4. 将样本点分配到最近的聚类中心点所代表的类别:将每个样本点分配到与其最近的聚类中心点所代表的类别,形成初始的聚类结果。
5. 更新聚类中心点:根据当前的聚类结果,重新计算每个类别的聚类中心点,通常是计算类别内样本点的均值。
6. 重复步骤3和步骤5,直到聚类中心点不再发生变化或达到预设的迭代次数。
如果聚类中心点不再发生变化,则算法收敛;如果达到预设的迭代次数,但聚类中心点仍在发生变化,则可以考虑增加迭代次数或调整聚类的数量K。
7. 输出聚类结果:将最终的聚类结果输出,每个样本点属于某个类别。
三、算法优缺点1. 优点:- K-means算法简单易实现,计算效率高。
- 对大规模数据集有较好的可扩展性。
- 聚类结果具有较好的可解释性。
2. 缺点:- 对初始聚类中心点的选择敏感,可能会得到不同的聚类结果。
- 对噪声和异常点较为敏感,可能会影响聚类结果的准确性。
- 需要提前确定聚类的数量K,如果选择不当可能会影响聚类结果。
实验三-K-均值聚类算法实验报告

实验三K-Means聚类算法一、实验目的1) 加深对非监督学习的理解和认识2) 掌握动态聚类方法K-Means 算法的设计方法二、实验环境1) 具有相关编程软件的PC机三、实验原理1) 非监督学习的理论基础2) 动态聚类分析的思想和理论依据3) 聚类算法的评价指标四、算法思想K-均值算法的主要思想是先在需要分类的数据中寻找K组数据作为初始聚类中心,然后计算其他数据距离这三个聚类中心的距离,将数据归入与其距离最近的聚类中心,之后再对这K个聚类的数据计算均值,作为新的聚类中心,继续以上步骤,直到新的聚类中心与上一次的聚类中心值相等时结束算法。
实验代码function km(k,A)%函数名里不要出现“-”warning off[n,p]=size(A);%输入数据有n个样本,p个属性cid=ones(k,p+1);%聚类中心组成k行p列的矩阵,k表示第几类,p是属性%A(:,p+1)=100;A(:,p+1)=0;for i=1:k%cid(i,:)=A(i,:); %直接取前三个元祖作为聚类中心m=i*floor(n/k)-floor(rand(1,1)*(n/k))cid(i,:)=A(m,:);cid;endAsum=0;Csum2=NaN;flags=1;times=1;while flagsflags=0;times=times+1;%计算每个向量到聚类中心的欧氏距离for i=1:nfor j=1:kdist(i,j)=sqrt(sum((A(i,:)-cid(j,:)).^2));%欧氏距离end%A(i,p+1)=min(dist(i,:));%与中心的最小距离[x,y]=find(dist(i,:)==min(dist(i,:)));[c,d]=size(find(y==A(i,p+1)));if c==0 %说明聚类中心变了flags=flags+1;A(i,p+1)=y(1,1);elsecontinue;endendiflagsfor j=1:kAsum=0;[r,c]=find(A(:,p+1)==j);cid(j,:)=mean(A(r,:),1);for m=1:length(r)Asum=Asum+sqrt(sum((A(r(m),:)-cid(j,:)).^2));endCsum(1,j)=Asum;endsum(Csum(1,:))%if sum(Csum(1,:))>Csum2% break;%endCsum2=sum(Csum(1,:));Csum;cid; %得到新的聚类中心endtimesdisplay('A矩阵,最后一列是所属类别'); Afor j=1:k[a,b]=size(find(A(:,p+1)==j));numK(j)=a;endnumKtimesxlswrite('data.xls',A);五、算法流程图六、实验结果>>Kmeans6 iterations, total sum of distances = 204.82110 iterations, total sum of distances = 205.88616 iterations, total sum of distances = 204.8219 iterations, total sum of distances = 205.886........9 iterations, total sum of distances = 205.8868 iterations, total sum of distances = 204.8218 iterations, total sum of distances = 204.82114 iterations, total sum of distances = 205.88614 iterations, total sum of distances = 205.8866 iterations, total sum of distances = 204.821Ctrs =1.0754 -1.06321.0482 1.3902-1.1442 -1.1121SumD =64.294463.593976.9329七、实验心得初始的聚类中心的不同,对聚类结果没有很大的影响,而对迭代次数有显著的影响。
模式识别中的聚类分析方法

模式识别中的聚类分析方法聚类分析是一种常用的机器学习方法,用于将大量数据分为不同的类别或群组,并在其中寻找共性和差异性。
在模式识别中,聚类分析可以帮助我们理解数据集中不同对象之间的关系,以及它们之间的相似性和差异性。
本文将介绍聚类分析的基本概念、算法和应用,以及一些实用的技巧和方法,以帮助读者更好地理解和应用这一方法。
一、聚类分析的基础概念在聚类分析中,我们通常会面对一个数据点集合,其特征被表示为$n$个$d$维向量$x_{i}=(x_{i1},x_{i2},…,x_{id})$。
聚类分析的目标是将这些数据点划分为$k$个不同的类别或群组$G_{1},G_{2},…,G_{k}$,并使得同一类别中的数据点相似性较高,不同类别之间的相似性较低。
为了完成这个任务,我们需要先定义一个相似性度量方法,用于计算数据点之间的距离或相似度。
常用的相似性度量方法包括欧式距离、余弦相似度、Jaccard相似度和曼哈顿距离等,具体选择哪一种方法取决于我们要研究的数据类型和应用要求。
定义了相似性度量方法后,我们可以使用聚类算法将数据点分成不同的类别。
聚类算法的主要分类包括层次聚类和基于中心点的聚类。
层次聚类是通过自下而上的方法将数据点归属到不同的类别中,以便于构建聚类树或聚类图。
基于中心点的聚类则是通过不断地计算每个数据点离其所属类别的中心点的距离来更新类别簇,直到收敛为止。
通常来说,基于中心点的聚类算法更快且更易于应用,因此被广泛应用于实际问题中。
二、聚类分析的主要算法1. K-means 聚类算法K-means 聚类算法是一种基于中心点的聚类算法,其核心思想是通过不断更新每个数据点所属的类别,同时更新该类别的中心点,直到找到最优的聚类结果。
具体而言,K-means 聚类算法首先需要预设$k$个初始的聚类中心点,然后计算每个数据点与这$k$个聚类中心的距离,并将其分配到最近的一个聚类中心点所代表的类别中。
完成初始聚类后,算法会重新计算每个类别的中心点,并根据新的中心点重新分配所有数据点,直到所有数据点都不再变换为止。
kmeans聚类算法的算法流程

K-means聚类算法是一种经典的基于距离的聚类算法,它被广泛应用于数据挖掘、模式识别、图像分割等领域。
K-means算法通过不断迭代更新簇中心来实现数据点的聚类,其算法流程如下:1. 初始化:首先需要确定要将数据分成的簇的个数K,然后随机初始化K个簇中心,可以从数据集中随机选择K个样本作为初始簇中心。
2. 分配数据:对于每个数据点,计算它与各个簇中心的距离,将该数据点分配给距离最近的簇,并更新该数据点所属簇的信息。
3. 更新簇中心:计算每个簇中所有数据点的均值,将该均值作为新的簇中心,更新所有簇中心的位置。
4. 重复迭代:重复步骤2和步骤3,直到簇中心不再发生变化或者达到预定的迭代次数。
5. 输出结果:最终得到K个簇,每个簇包含一组数据点,形成了聚类结果。
K-means算法的优点在于简单易实现,时间复杂度低,适用于大规模数据;但也存在一些缺点,如对初始聚类中心敏感,对噪声和离裙点敏感,需要事先确定聚类个数K等。
K-means聚类算法是一种常用的聚类方法,通过迭代更新簇中心的方式逐步将数据点划分为不同的簇,实现数据的聚类分析。
通过对算法流程的详细了解,可以更好地应用K-means算法解决实际问题。
K-means算法是一种非常经典的聚类算法,它在数据挖掘和机器学习领域有着广泛的应用。
在实际问题中,K-means算法可以帮助我们对数据进行分组和分类,从而更好地理解数据的内在规律,为我们提供更准确的数据分析和预测。
接下来,我们将对K-means聚类算法的一些关键要点进行探讨,包括算法的优化、应用场景、以及与其他聚类算法的比较等方面。
1. 算法的优化:在实际应用中,K-means算法可能会受到初始簇中心的选择和迭代次数的影响,容易收敛到局部最优解。
有一些改进的方法可以用来优化K-means算法,例如K-means++算法通过改进初始簇中心的选择方式,来减少算法收敛到局部最优解的可能性;另外,Batch K-means算法通过批量更新簇中心的方式来加快算法的收敛速度;而Distributed K-means算法则是针对大规模数据集,通过并行计算的方式来提高算法的效率。
K-means聚类算法研究

个数据对象作为初始的聚类中心 , 初 始的代表一个 聚类 。对于剩下的其他数据集 。 则分别计算它们 到 这些聚类中心的相似度 ( 以欧 氏距离作 为相似度 测 量准则) ,并根据最短距离将每个数据对象赋给 各 个聚类中心 。然后再计算新获得 的每一个聚类的距 离平均值得 到新 的聚类 中心 , 如果连续两次计算 出
进 行 了详 细 的分析 。
关键词 : 聚类分析 ; K — m e a n s 算法 中图分类号 : T P 3 1 1 文献标识码 : A 文章编号 : 1 6 7 2 - 4 4 7 X ( 2 0 1 3 ) 0 5 - 0 0 1 7 - 0 3 文 采 用 Ma l t a b 7 . 0实 现 了 K- me a n s 聚 类 算
法, 下面这个例子 , 显示 K - me a d s 聚类算法对于一 组二维数据集合 的聚类效果。
输入 : 包含 n 个数据对象的集合置,
x ={ X l , x 2 , … , X n }
b e i g n f o r j = 1 t o k d o
c o m p u t e D ( , z j ) = x i 一 l; / / 计算剩下的数
据对象到各聚类中心的距离 i f D ( , z ) = m i n { D ( X i Z ) } t h e n ∈ C j ; / / 根 据最 短距离将数据对象分类
J 已经收敛 , 聚类算法结束。通常采用平方误差准则
函数 作为 聚类目 标准则, 即 . , = ∑ : 。 ∑ 鹇I P 一 『,
∑g z 。 是分类 的中心 , 即 = 。 的数据 , 可以降低数据量及计算量 , 并可 以避免 杂 p是一个数据 对象 , ¨ 一,目 质的不 良影响。 上述算法的特 点是首先必须指定 k个初 始聚类 中 本 文简要介绍了 K - me a n s 聚类算法 的算法流 心, 然后借着 反复迭代运算 , 逐次降低 目标准则函 程, 复杂度 , 并用 Ma d a b实现 , 根据实验结果分析 了
k-means聚类方法

k-means聚类方法1. K-means聚类方法的基本原理K-means聚类方法是一种基于划分的聚类算法,它将数据集划分为K 个簇,每个簇由与其中心距离最近的点组成。
K-means聚类方法的基本原理是:给定一组数据,将它们划分为K个簇,使得每个簇的内部距离最小,而簇之间的距离最大。
K-means算法通过迭代的方式,不断地调整簇的中心,以最小化每个簇内部的距离,从而实现最优的划分。
2. K-means聚类方法的优缺点K-means聚类方法具有计算简单、收敛快等优点,它可以将数据集划分为多个簇,每个簇内的数据点彼此具有较高的相似度,而簇与簇之间的数据点具有较低的相似度,从而有效地实现了数据分类。
但K-means聚类方法也有一些缺点,首先,K-means聚类方法的结果受初始值的影响较大,如果初始值不合理,可能导致聚类结果不理想;其次,K-means聚类方法只适用于线性可分的数据,如果数据不具有线性可分的特征,K-means聚类方法可能不能得到理想的结果;最后,K-means聚类方法没有考虑数据点之间的距离,因此可能会出现噪声数据点的情况,从而影响聚类结果。
3. K-means聚类方法的应用K-means聚类方法可以用于多种应用,如机器学习、数据挖掘、模式识别、图像处理等。
其中,最常见的应用是基于K-means聚类方法的聚类分析,用于将数据分成不同的组,以便更好地理解和分析数据。
此外,K-means聚类方法也可以用于多维数据可视化,以及探索数据中隐藏的模式和趋势。
K-means聚类方法还可以用于客户分类,以及市场细分,以更好地了解客户行为和需求。
此外,K-means聚类方法还可以用于语音识别,文本分类,图像分类等。
4. K-means聚类方法的参数调整K-means聚类方法的参数调整主要有两个:K值和距离度量标准。
K 值决定聚类的数量,距离度量标准决定两个点之间的距离。
参数调整的目的是为了让聚类结果尽可能满足用户的要求。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
K-Means聚类算法
1.算法原理
k-means是划分方法中较经典的聚类算法之一。
由于该算法的效率高,所以在对大规模数据进行聚类时被广泛应用。
目前,许多算法均围绕着该算法进行扩展和改进。
k-means算法以k为参数,把n个对象分成k个簇,使簇内具有较高的相似度,而簇间的相似度较低。
k-means算法的处理过程如下:首先,随机地选择k个对象,每个对象初始地代表了一个簇的平均值或中心;对剩余的每个对象,根据其与各簇中心的距离,将它赋给最近的簇;然后重新计算每个簇的平均值。
这个过程不断重复,直到准则函数收敛。
通常,采用平方误差准则,其定义如下:
这里E是数据库中所有对象的平方误差的总和,p是空间中的点,mi 是簇Ci的平均值。
该目标函数使生成的簇尽可能紧凑独立,使用的距离度量是欧几里得距离,当然也可以用其他距离度量。
k-means聚类算法的算法流程如下:
输入:包含n个对象的数据库和簇的数目k;
输出:k个簇,使平方误差准则最小。
步骤:
(1) 任意选择k个对象作为初始的簇中心;
(2) repeat;
(3) 根据簇中对象的平均值,将每个对象(重新)赋予最类似的簇;
(4) 更新簇的平均值,即计算每个簇中对象的平均值;
(5) 直到不再发生变化。
2.主要代码
主程序:
clc;
clear;
close all;
%% 聚类算法测试
nSample = [500, 500, 500];
% 3维情况
dim = 3;
coeff = {
[-2 0.8; -1 0.9; 2 0.7;], ....
[1 0.9; -2 0.7; -2 0.8; ], ...
[-2 0.7; 2 0.8; -1 0.9; ], };
data = createSample(nSample, dim , coeff);
%% 得到训练数据
nClass = length(nSample);
tlabel = [];
tdata = [];
for i = 1 : nClass
tlabel = [tlabel; i * ones(nSample(i), 1)];
tdata = [tdata; data{i}];
end
%% 调用k-means聚类算法
[ label ] = stpKMeans( tdata, nClass);
%% 绘图
result = cell(1, nClass);
index = 0;
for i = 1 : nClass
index = find(label(:,1) == i);
result{i} = tdata(index, :);
end
figure;
subplot(1, 2, 1);
plot3(data{1}(:, 1), data{1}(:, 2), data{1}(:, 3), '*', ...
data{2}(:, 1), data{2}(:, 2), data{2}(:, 3), 'o', ...
data{3}(:, 1), data{3}(:, 2), data{3}(:, 3), 'x');
title('初始数据');
subplot(1, 2, 2);
plot3(result{1}(:, 1), result{1}(:, 2), result{1}(:, 3), '*', ... result{2}(:, 1), result{2}(:, 2), result{2}(:, 3), 'o', ...
result{3}(:, 1), result{3}(:, 2), result{3}(:, 3), 'x');
title('K-Means聚类结果');
K-Means核心算法:
function [ label ] = stpKMeans( data, k)
%% KMeans 聚类算法,参考
%
/William_Fire/archive/2013/02/09/2909499.html %
%% 输入
% data 原始数据
% k 聚多少个簇
%
%% 输出
% label 按照data数据的顺序,每个样本的簇号的列表
[n, dim] = size(data);
label = zeros(n, 1);
% 任选k个对象作为初始的簇中心
seq = stpRandN_K(n, k);
nowMeans = data(seq, :);
for i = 1 : k
label(seq(i)) = i;
end
dist = zeros(n, k);
while(true)
% 计算数据到每个簇的欧几里得距离
for i = 1 : k
temp = data;
for j = 1 : dim
% 先让数据减去第j个特征
temp(:, j) = data(:, j) - nowMeans(i, j);
end
% 点乘后再相加球的距离的平方
temp = temp .* temp;
dist(:, i) = sum(temp, 2);
end
% 从k种距离中找出最小的,并计算修改次数(label跟上一次不一样) [~, label2] = min(dist, [], 2);
editElem = sum(label(:, 1) ~= label2(:, 1));
label = label2;
% for i = 1 : n
% % 根据均值将当前的每个元素重新分簇
% minDist = inf;
% index = -1;
% % 从当前的k个均值中找到离元素i最近的一个,将其划分到该簇% for j = 1 : k
% dist = data(i,:) - nowMeans(j, :);
% dist = dot(dist, dist);
%
% if(dist < minDist)
% % 修改最近的距离,并记录测试的簇号% minDist = dist;
% index = j;
% end
% end
%
% % 判断是该元素是否重新划分了簇
% if(index ~= label(i) )
% editElem = editElem + 1;
% label(i) = index;
% end
%
% end
if editElem == 0
% 表示本次没有修改,那么跳出循环
break;
end
% 重新分簇后,重新计算均值
for i = 1 : k
% 计算第k簇的均值
[index] = find(label(:, 1) == i );
nowMeans(i, :) = mean(data(index, :));
end
end
end
从n个元素中随机抽取K个元素的代码:
function [ out ] = stpRandN_K(n, k)
%% 从1-n中随机选中k个不同的元素
data = 1 : n;
for i = 1 : k
index = floor( (n-i+1)*rand() ) + i;
% 交换i和index上的数据
temp = data(index);
data(index) = data(i);
data(i) = temp;
end
out = data(1:k);
end
图片聚类测试代码:
close all;
clc;
clear;
rgbdata = imread('data\\g-1.jpg');
labdata = stpRgb2Lab(rgbdata);
[sm, sn, ~] = size(labdata);
sN = sm * sn;
nClass = 4;
labdata = reshape(labdata, sN, 3);
[ label ] = stpKMeans( labdata, nClass);
label = reshape(label, sm, sn);
figure;
subplot(1, 2, 1);imshow(rgbdata);
hold on;
subplot(1, 2, 2);
TX = 1 : sn;
TY = 1 : sm;
imagesc(TX, TY, label);
3.结果分析
针对给定的参数
K-Means算法三类聚类结果:
图1 初始数据和K-Means聚类结果
当初始数据给为如下时:
K-Means算法三类聚类结果:
图2 初始数据和K-Means聚类结果
由此可以看到,K-Means算法会把一些偏离中心较远的点分到其它簇内。
4.用于图片的结果
以图片的在Lab颜色空间的三通道作为三个特征,每个像素为一个样本点,进行图片聚类,此时,如果类数为8,则得到:
图3a 图片聚类(8类)结果
图3b 图片聚类(8类)结果聚类数量变为15时结果如下:
图4a 图片聚类(15类)结果
图4b 图片聚类(15类)结果当聚类为4的时候,结果为:
图5a 图片聚类(4类)结果
图5b 图片聚类(4类)结果。