K-means与ISODATA算法的比较研究的程序

合集下载

基于envi的地物分类

基于envi的地物分类
基于envi的地物分类
一、非监督分类
仅凭遥感影像地物的光谱特征的分布规律,即自然聚类性, 迚行“盲目”的分类;其类别的属性是通过分类结束后目 视判读或实地调查确定的。
1.K-均值聚类法 2.IsoData聚类算法
1.K-均值聚类法
K-均值算法的聚类准则是使每一聚类中,多模式点 到该类别的中心的距离的平方和最小。 基本思想是:通过迭代,逐次移动各类的中心,直 至得到最好的聚类结果为止。
分类后处理
1.合并:在主菜单中Classification—post classification—Sieve Classes
• 2.生成混淆矩阵:主 菜单中, Classification—post classification— confusion Matrix— Using Ground Truth ROIS.将所有类别都选 上。
参数值<1.8需重新选择,>1.9说明样本之 间分离性好
6.Roitools对话框中单击saveRois保存
7.选取的训练区保存以后,迚行分类。主菜 单—Classification—supervised-------maximum likelihood(最大似然法)
在弹出的对话框中选待分类的图像:
保存混淆矩阵
在分类中遇到的问题:
1. 类别数的确定:目视判读?经验指导? 2. 样本训练区的选择:有代表性的多训练区选取,如丌同的植 被区域选取. 3. 训练样本间的可区分度指标(这一点在erdas实习中没有 涉及,在实习中,七类分别为长江、汉江、湖泊、水田等, 但在envi的样点选取中这些类别之间的可区分度均小于 1.8,意味着这些类别之间丌可区分需要迚行删除或者合 并,因此涉及到了类别数的确定问题和分类精度问题以 及分类的精确度问题) 4. 两类的边界线上的样点分类的丌确定性

K-MEANS算法(K均值算法)

K-MEANS算法(K均值算法)

k-means 算法一.算法简介k -means 算法,也被称为k -平均或k -均值,是一种得到最广泛使用的聚类算法。

它是将各个聚类子集内的所有数据样本的均值作为该聚类的代表点,算法的主要思想是通过迭代过程把数据集划分为不同的类别,使得评价聚类性能的准则函数达到最优,从而使生成的每个聚类内紧凑,类间独立。

这一算法不适合处理离散型属性,但是对于连续型具有较好的聚类效果。

二.划分聚类方法对数据集进行聚类时包括如下三个要点:(1)选定某种距离作为数据样本间的相似性度量k-means 聚类算法不适合处理离散型属性,对连续型属性比较适合。

因此在计算数据样本之间的距离时,可以根据实际需要选择欧式距离、曼哈顿距离或者明考斯距离中的一种来作为算法的相似性度量,其中最常用的是欧式距离。

下面我给大家具体介绍一下欧式距离。

假设给定的数据集 ,X 中的样本用d 个描述属性A 1,A 2…A d 来表示,并且d 个描述属性都是连续型属性。

数据样本x i =(x i1,x i2,…x id ), x j =(x j1,x j2,…x jd )其中,x i1,x i2,…x id 和x j1,x j2,…x jd 分别是样本x i 和x j 对应d 个描述属性A 1,A 2,…A d 的具体取值。

样本xi 和xj 之间的相似度通常用它们之间的距离d(x i ,x j )来表示,距离越小,样本x i 和x j 越相似,差异度越小;距离越大,样本x i 和x j 越不相似,差异度越大。

欧式距离公式如下:(2)选择评价聚类性能的准则函数k-means 聚类算法使用误差平方和准则函数来评价聚类性能。

给定数据集X ,其中只包含描述属性,不包含类别属性。

假设X 包含k 个聚类子集X 1,X 2,…X K ;{}|1,2,...,m X x m total ==(),i j d x x =各个聚类子集中的样本数量分别为n 1,n 2,…,n k ;各个聚类子集的均值代表点(也称聚类中心)分别为m 1,m 2,…,m k 。

实验四遥感图像的监督分类和非监督分类

实验四遥感图像的监督分类和非监督分类

实验四遥感图像的监督分类和⾮监督分类实验四遥感图像的⾮监督分类与监督分类⼀、实验⽬的1.⾮监督分类是对数据集中的像元依据统计数字,光谱类似度和光谱距离进⾏分类,在没有⽤户定义的条件下练习使⽤,在ENVI环境下的⾮监督分类技术有两种:迭代⾃组织数据分析技术(ISodata)和K均值算法(K-Means);2.分类过程中应注意:1)怎样确定⼀个最优的波段组合,从⽽达到最佳的分类精度,基于OIF和相关系数,协⽅差矩阵以及经验的使⽤来完成对最适合的组合的选取,分类效果的关键即在于此;2)K-Means的基本原理;3)Isodata的基本原理;4)分类结束后,被分类后的图像是⼀个新的图像,被分类类码秘填充,从⽽可以获得数据提取信息,统计不同类码数量,转化为实际⾯积,在得到后的图像上,可对不同⽬标的形态指标进⾏分析。

3.对训练区中的像元进⾏分类;4.⽤训练数据集估计查看监督分类后的统计参数;5.⽤不同⽅法进⾏监督分类,如最⼩距离法、马⽒距离法和最⼤似然法。

⼆、实验设备与材料1、软件ENVI 4.7软件2、所需材料TM数据三、实验步骤1.选择最优的波段组合ENVI主⼯具栏中File →Open image file →选择hbtmref.img打开→在Basic Tools中选择Statistics →Compute statistics选定原图,在Spectral subset中可选项全部选定→OK →OK →全选→保存→OK,则各类统计数字均可查;OIF计算,选择分类波段:1,2;2,3;1,3波段标准差分别为2.665727;3.473308;4.574609,和为10.713644。

Correlation Matrix 中1和2波段的相关系数0.964308,加上2和3波段的相关系数0.980166,再加上1和3波段的相关系数0.945880,最终等于2.890354。

⽤标准差相加的结果10.713644⽐上相关系数之和2.890354等于3.70668922。

医疗数据挖掘算法比较研究

医疗数据挖掘算法比较研究

医疗数据挖掘算法比较研究在现代医疗领域中,数据挖掘已经发挥了重要作用,可以用于预测病情、制定诊断方案、分析医疗资源利用等方面。

那么,医疗数据挖掘算法有哪些呢?它们之间又有何异同呢?本文将对几种常用的医疗数据挖掘算法进行比较和研究。

一、K-means算法K-means算法是一种聚类算法,可以根据数据点的相似程度将其分为若干组。

在医疗领域中,K-means算法可以用于疾病分类、药物筛选等方面。

例如,可以将某些疾病按照病因、症状等特征进行分类,以便医生更好地制定治疗方案。

K-means算法的优点是易于实现,算法简单,适用于大规模数据集。

但是,K-means算法需要先确定聚类数K,这一步可能会影响到聚类结果的质量。

此外,K-means算法对于噪声较敏感。

二、主成分分析(PCA)算法主成分分析(PCA)算法是一种降维算法,可以将高维数据降为低维空间,从而更好地进行数据可视化、数据分析等工作。

在医疗领域中,PCA算法可以用于病人分类、病情分析等方面。

例如,可以基于某些生物标志物(例如血液中某些指标)对病人进行分类,以便医生更好地制定治疗方案。

PCA算法的优点是可以进行有效的数据降维,降低计算成本,同时可以保留原始数据中的主要信息。

但是,PCA算法只能捕捉线性相关的信息,对于非线性相关的信息效果不理想。

三、支持向量机(SVM)算法支持向量机(SVM)算法是一种分类算法,可以将数据点分类为正类和负类。

在医疗领域中,SVM算法可以用于肿瘤分类、心脏病分析等方面。

例如,可以基于肿瘤的大小、位置、形态等特征对其进行分类,以便医生制定更为精准的治疗方案。

SVM算法的优点是可以有效地处理高维度、小样本的数据,同时具有较高的分类准确性。

但是,SVM算法对于数据量较大的情况下,计算成本较高,同时实现难度也较高。

四、朴素贝叶斯(Naive Bayes)算法朴素贝叶斯(Naive Bayes)算法是一种概率模型,可以用于分类和预测工作。

聚类分析算法实验报告(3篇)

聚类分析算法实验报告(3篇)

第1篇一、实验背景聚类分析是数据挖掘中的一种重要技术,它将数据集划分成若干个类或簇,使得同一簇内的数据点具有较高的相似度,而不同簇之间的数据点则具有较低相似度。

本实验旨在通过实际操作,了解并掌握聚类分析的基本原理,并对比分析不同聚类算法的性能。

二、实验环境1. 操作系统:Windows 102. 软件环境:Python3.8、NumPy 1.19、Matplotlib 3.3.4、Scikit-learn0.24.03. 数据集:Iris数据集三、实验内容本实验主要对比分析以下聚类算法:1. K-means算法2. 聚类层次算法(Agglomerative Clustering)3. DBSCAN算法四、实验步骤1. K-means算法(1)导入Iris数据集,提取特征数据。

(2)使用Scikit-learn库中的KMeans类进行聚类,设置聚类数为3。

(3)计算聚类中心,并计算每个样本到聚类中心的距离。

(4)绘制聚类结果图。

2. 聚类层次算法(1)导入Iris数据集,提取特征数据。

(2)使用Scikit-learn库中的AgglomerativeClustering类进行聚类,设置链接方法为'ward'。

(3)计算聚类结果,并绘制树状图。

3. DBSCAN算法(1)导入Iris数据集,提取特征数据。

(2)使用Scikit-learn库中的DBSCAN类进行聚类,设置邻域半径为0.5,最小样本数为5。

(3)计算聚类结果,并绘制聚类结果图。

五、实验结果与分析1. K-means算法实验结果显示,K-means算法将Iris数据集划分为3个簇,每个簇包含3个样本。

从聚类结果图可以看出,K-means算法能够较好地将Iris数据集划分为3个簇,但存在一些噪声点。

2. 聚类层次算法聚类层次算法将Iris数据集划分为3个簇,与K-means算法的结果相同。

从树状图可以看出,聚类层次算法在聚类过程中形成了多个分支,说明该算法能够较好地处理不同簇之间的相似度。

K-means聚类算法的研究的开题报告

K-means聚类算法的研究的开题报告

K-means聚类算法的研究的开题报告一、选题背景K-means聚类算法是一种常用的聚类算法,它可以把数据分成K个簇,每个簇代表一个聚类中心。

该算法适用于大数据分析、图像分析等领域。

由于其具有简单、快速、效果明显等特点,因此备受研究者的关注。

二、研究意义K-means聚类算法在大数据分析、图像分析等领域的应用广泛,研究该算法有着十分重要的意义。

本次研究将对该算法进行探究,通过改进和优化算法,提高其聚类效果和运行效率,为实际应用提供更加可靠、有效的解决方案。

三、研究内容与方法本研究将围绕K-means聚类算法展开,重点探讨以下内容:1. K-means聚类算法原理及优缺点分析2. 基于距离的K-means聚类算法优化3. 基于密度的K-means聚类算法研究4. 算法的实现与效果评估在研究方法上,将采用文献调研、数学统计方法、算法实现和效果评估等多种方法对K-means聚类算法进行研究。

四、计划进度安排本研究总计时长为12周,具体进度安排如下:第1-2周:文献调研,研究K-means聚类算法的原理和优缺点分析第3-4周:基于距离的K-means聚类算法优化第5-6周:基于密度的K-means聚类算法研究第7-8周:算法实现第9-10周:效果评估第11-12周:论文撰写和答辩准备五、预期研究结果本研究将针对K-means聚类算法进行深入探究,并尝试改进和优化算法,提高其聚类效果和运行效率。

预期研究结果将包括以下几个方面:1.对该算法的优缺点进行全面分析,揭示其内在机制和局限性。

2.基于距离和密度两种方法对算法进行优化,提高其聚类效果和运行效率。

3.通过实验评估算法效果,得出具体的结论。

4.输出论文成果,向相关领域进行贡献。

六、研究的难点1.算法优化的设计,需要具备一定的数学和计算机知识。

2.实验的设计需要满足实际应用场景,需要有较强的应用能力。

3.研究过程中可能遇到一些技术难点,需要耐心解决。

七、可行性分析K-means聚类算法是广泛使用的算法之一,其研究具有实际意义和可行性。

isodata算法流程

isodata算法流程ISODATA(Iterative Self-Organizing Data Analysis Technique Algorithm)是一种常用的聚类算法,它能够将数据集划分为不同的类别。

本文将介绍ISODATA算法的流程。

ISODATA算法的流程主要包括以下几个步骤:1. 初始化参数:首先,需要确定一些初始参数,包括聚类的数量、每个类别的最小样本数、最大方差、最大迭代次数等。

这些参数的选择对于算法的效果有着重要的影响。

2. 随机选择初始聚类中心:从数据集中随机选择一些样本作为初始聚类中心。

聚类中心是每个类别的代表,后续的迭代过程中会不断更新。

3. 样本分配:将每个样本分配到最近的聚类中心。

这里可以使用欧氏距离或其他距离度量方法来衡量样本与聚类中心之间的相似度。

4. 更新聚类中心:根据当前的样本分配情况,重新计算每个聚类的中心点。

计算方法可以是简单的平均值或其他更复杂的方法。

5. 合并和分裂:根据一定的条件,对聚类进行合并或分裂操作。

合并操作将相似度较高的聚类合并为一个,分裂操作将相似度较低的聚类分裂为两个。

6. 判断终止条件:判断是否满足终止条件,如果满足则结束迭代,否则返回第3步。

7. 输出结果:将最终的聚类结果输出,每个样本被分配到一个类别中。

ISODATA算法的核心思想是通过迭代的方式不断优化聚类结果。

在迭代过程中,通过样本分配和聚类中心的更新,不断调整聚类的划分,使得同一类别内的样本相似度较高,不同类别之间的样本相似度较低。

ISODATA算法的优点是能够自动确定聚类的数量,并且能够处理数据集中的噪声和异常值。

同时,它还能够动态地调整聚类的划分,适应数据集的变化。

然而,ISODATA算法也存在一些不足之处。

首先,算法的效果受到初始参数的选择和设置的影响较大,需要经过一定的调试和实验才能得到较好的结果。

其次,算法的计算复杂度较高,对于大规模数据集的处理可能会比较耗时。

K-means与ISODATA算法的比较研究


中数据点的个数。聚类结果的好坏用目标函数 J 表 示: ������ ������ J= ������ (2-1) ������ =1 ������ =1 ������������������ ������������ , ������������ 公式(2-1)中,������������������ (xj,������������ )是 xj 与 ci 之间的欧氏 距离。目标函数 J 其实是每个数据点与所在簇的质 心的距离之和,所以 J 值越小,簇就越紧凑、越相 对独立。因此,算法通过不断优化 J 的取值来寻求 好的聚类方案,当 J 取极小值时,对应的聚类方法 即为最优方案。 K-means 算法步骤如下: (1) 从 X 中随机选择 k 个初始参照 c1, c2, ……, ck。 (2)在第 n 次迭代中,对任意一个样本,求其 到 k 个中心的距离,将该样本归到距离最短的中心 所在的类。 (3)利用均值等方法更新该类的中心值。 (4)对于所有的 k 个聚类中心,如果利用(2) (3) 的迭代法更新后, 值保持不变 (目标函数收敛) , 则迭代结束,否则继续迭代。 (5)输出聚类结果。 K-means 算法的流程如图 2-1 所示。 开始
2.1K-means 算法简介 K-means 算法是一种古老的、广泛使用的聚类 算法。K-means 算法简单并且适用各种数据类型, 而且有效。K-means 算法是一种典型的基于划分的 方法,目标是根据输入参数 k,将数据集划分成 k
个簇。 K-means 聚类算法是目前应用最广泛的划分聚 类算法之一,适用于处理庞大的样本数据[5]。 根据初始值、相异度、聚类平均值计算策略上 的不同,K-均值方法有很多变种,对于数据分布比 较接近球体的情况有很好的聚类效果。 2.2K-means 算法的基本思想 K-means 算法根据输入参数 k,将数据集划分 成 k 个簇。 算法采用迭代更新的方法: 在每一轮中, 依据 k 个参照点将其周围的点分别组成 k 个簇,而 每个簇的质心被视为下一轮迭代的参照点。迭代使 得选取的参照点越来越近真实的簇质心,所以聚类 效果越来越好。 K-means 聚类算法的原理是:首先随机选取 k 个点作为初始聚类中心,然后计算各个样本到聚类 中心的距离,把样本鬼到离它最近的那个聚类中心 所在的簇;对调整后的新簇计算新的聚类中心,如 果相邻两次的聚类中心没有任何变化,说明样本调 整结束,这时某个误差平方和函数已经达到最小, 聚类准则函数已经收敛,算法结束。 2.3K-means 算法的主要步骤 将 d 维数据集 X={xj|xj∈Rd,i=1,2,……,N}聚 集成 k 个簇 W1,W2,……,Wk,它们的质心依次 1 为 c1,c2,……,ck,其中 ci= ������∈������ ������ ������ ,ni 是簇 Wi

大数据环境下的聚类算法比较研究

大数据环境下的聚类算法比较研究随着大数据时代的到来,传统的数据处理方法已经无法满足大规模数据的分析和处理需求。

大数据环境下的数据聚类成为了一项重要的研究领域。

聚类算法可以将数据划分为不同的类别,并根据相似性将数据点进行分组。

本文将对大数据环境下的聚类算法进行比较研究,分析它们的优势和劣势。

在大数据环境下,聚类算法需要具备高效性、准确性和可扩展性。

以下将对几种常见的聚类算法进行比较研究。

1. K-means算法K-means是一种基于距离的聚类算法,它将数据点划分为K个簇,每个簇的中心点代表该簇的特征。

这个算法的思想是通过最小化每个数据点与其所属簇中心点的距离来实现聚类。

K-means算法的优势在于简单、易于理解和实现。

它的时间复杂度较低,可以处理大规模数据集。

然而,K-means算法的结果依赖于初始的聚类中心的选择,且对于非凸形状的聚类效果较差。

2. DBSCAN算法DBSCAN是一种基于密度的聚类算法,它能够自动识别不同密度的数据点并形成不同大小的簇。

DBSCAN通过在数据空间中寻找密度可达的数据点来实现聚类。

DBSCAN算法的优势在于对噪声数据的鲁棒性和对密度分布不规则的聚类效果较好。

它不需要预先指定聚类个数,并且对于大规模数据集也有较好的可扩展性。

然而,DBSCAN算法对于高维数据和不同密度簇的聚类效果较差。

3. 层次聚类算法层次聚类算法通过自底向上或自顶向下的方式逐步合并或划分数据点,形成树状的聚类结构。

这个算法不需要预先指定聚类个数,并可以灵活地处理不同形状和大小的簇。

层次聚类算法的优势在于对于非球形和非凸形状的聚类效果较好。

它可以同时进行全局和局部的聚类分析。

然而,这个算法的时间复杂度较高,对于大规模数据集的处理效率较低。

4. 亲和聚类算法亲和聚类算法是一种基于图论的聚类算法,它通过衡量数据点之间的亲和力来判定是否属于同一个簇。

亲和聚类算法通过最大化簇内亲和力和最小化簇间亲和力来实现聚类。

ISODATA迭代自组织数据分析流程


c
1 N
∑N d
i =1 i
c
i
其中N为样本集中样本总数。 第七步:判断分裂、合并及迭代运算步骤。 (1) 若迭代已达I次,置 θ c = 0 ,转到第十一步,算法结束。 (2) 若 c ≤ K / 2 ,即聚类中心小于或等于希望数的一半,转到第八步,将 已有类分裂; (3) 若迭代次数是偶数,或 c ≥ 2 K ,即聚类中心数目大于期望数的两倍, 则转到第十一步,进行合并处理。 (4) 若(2)和(3)不满足则继续,转入第八步。 第八步:计算每个聚类中样本距离的标准差向量。对第 X i 类有
zi = 1 N
x∈X i
∑ x, i = 1, 2,..., c
第五步:计算 X i 中样本与各聚类中心间的平均距离:
di = 1 Ni
x∈ X i
∑ || x − z
i
||, i = 1, 2,..., c
第六步:计算总体的平均距离:
d=
1 N
∑ ∑ || x − zi || =
i =1 x∈ X i
zi+ 这样构成: zi 中对应 σ i max 的分量加上 ασ i max ; zi− 这样构成: zi 中对应 σ i max 的分量减去 ασ i max ;
其中 0 < α ≤ 1 ; 选择 α 的基本要求是, 使任意样本到这两个新的聚类中心 zi+ 和 zi− 之间有一个足够可检测的距离差别,但又不能太大。 如果完成分裂,则迭代次数加1, l = l + 1 ,转到第二步。否则继续进行第十 一步。 第十一步:计算全部聚类中心的两两距离 dij :
X i 类聚类中心 zi 的第j个分量,所以 σ ij 是 xi 的第i个分量的标准差。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.K-means算法程序% k-均聚类算法clcclear;% main variablesdim = 2; % 模式样本维数k = 8; % 设有k个聚类中心load('file.txt');PM=file;% 模式样本矩阵N = size(PM,1);figure();subplot(1,2,1);for(i=1:N)plot(PM(i,1),PM(i,2), '*r'); % 绘出原始的数据点hold onendxlabel('X');ylabel('Y');title('聚类之前的数据点');CC = zeros(k,dim); % 聚类中心矩阵,CC(i,:)初始值为i号样本向量D = zeros(N,k); % D(i,j)是样本i和聚类中心j的距离C = cell(1,k); %% 聚类矩阵,对应聚类包含的样本。

初始状况下,聚类i(i<k)的样本集合为[i],聚类k的样本集合为[k,k+1,...N]for i = 1:k-1C{i} = [i];endC{k} = k:N;B = 1:N; % 上次迭代中,样本属于哪一聚类,设初值为1B(k:N) = k;for i = 1:kCC(i,:) = PM(i,:);endwhile 1change = 0;%用来标记分类结果是否变化% 对每一个样本i,计算到k个聚类中心的距离for i = 1:Nfor j = 1:k% D(i,j) = eulerDis( PM(i,:), CC(j,:) );D(i,j) = sqrt((PM(i,1) - CC(j,1))^2 + (PM(i,2) - CC(j,2))^2); endt = find( D(i,:) == min(D(i,:)) ); % i属于第t类if B(i) ~= t % 上次迭代i不属于第t类change = 1;% 将i从第B(i)类中去掉t1 = C{B(i)};t2 = find( t1==i );t1(t2) = t1(1);t1 = t1(2:length(t1));C{B(i)} = t1;C{t} = [C{t},i]; % 将i加入第t类B(i) = t;endendif change == 0 %分类结果无变化,则迭代停止break;end% 重新计算聚类中心矩阵CCfor i = 1:kCC(i,:) = 0;iclu = C{i};for j = 1:length(iclu)CC(i,:) = PM( iclu(j),: )+CC(i,:);endCC(i,:) = CC(i,:)/length(iclu);endendsubplot(1,2,2);plot(CC(:,1),CC(:,2),'o')hold onfor(i=1:N)if(B(1,i)==1)plot(PM(i,1),PM(i,2),'*b'); %作出第一类点的图形hold onelseif(B(1,i)==2)plot(PM(i,1),PM(i,2), '*r'); %作出第二类点的图形hold onelseif(B(1,i)==3)plot(PM(i,1),PM(i,2),'*g'); %作出第三类点的图形hold onelseif(B(1,i)==4)plot(PM(i,1),PM(i,2),'*m'); %作出第4类点的图形hold onelseif(B(1,i)==5)plot(PM(i,1),PM(i,2),'*c'); %作出第5类点的图形hold onelseif(B(1,i)==6)plot(PM(i,1),PM(i,2),'*b'); %作出第6类点的图形hold onelseif(B(1,i)==7)plot(PM(i,1),PM(i,2),'*y'); %作出第7类点的图形hold onelseplot(PM(i,1),PM(i,2), '*k'); %作出第四类点的图形hold onendendxlabel('X');ylabel('Y');title('聚类之后的数据点');% 打印C,CCfor i = 1:k %输出每一类的样本点标号str=['第' num2str(i) '类包含点: ' num2str(C{i})];disp(str);end;2.ISODATA算法程序Mainclc;clear all;fprintf('ISODATA分类算法\n');load('file.txt');x=file;plot(x(:,1),x(:,2),'.');%显示待分类点的坐标位置title('待分类的样本点坐标位置');[N,n]=size(x);%获得样本数目和维数,N为样本数目,n为样本维度K=4;%预期的聚类中心数目thet_N=1;%每一聚类域中最少的样本数目thet_S=1;%一个聚类域中样本距离分布的标准差thet_C=1;%两个聚类中心间的最小距离L=2;%在一次迭代运算中可以合并的聚类中心的最多对数I=200;%迭代运算的次数Nz=1;%决定初始聚类中心的个数ifNz==1z0=[1];z=[x(z0(1),:)];%初始化聚类中心fprintf('选样本点x(%d)作为初始聚类中心\n',z0(1));endifNz==3z0=[1,2,7];z=[x(z0(1),:);x(z0(2),:);x(z0(3),:)];%初始化聚类中心fprintf('选样本点x(%d)、x(%d)、x(%d)作为初始聚类中心\n',z0(1),z0(2),z0(3));endifNz==4z0=[1,2,7,8];z=[x(z0(1),:);x(z0(2),:);x(z0(3),:);x(z0(4),:)];%初始化聚类中心fprintf('选样本点x(%d)、x(%d)、x(%d)、x(%d)作为初始聚类中心\n',z0(1),z0(2),z0(3),z0(4)); endlabel=zeros(1,N);for k=1:I[z,mean_D1,mean_D,delta,Nc,Ni,label]=get_einf(x,z,label);for j=1:Ncif Ni(j)<thet_N%如果类中样本数目太少,则取消该样本子集for i=1:N;if label(i)==jfor m=i:Nx(m,:)=x(m+1,:);endendendend%[z,mean_D1,mean_D,delta,Nc,Ni,label]=get_einf(x,z,label);%重新进行聚类并计算类的基本信息if k==Ithet_C=0;[z] = merge(z,Ni,L,thet_C);continue;endif Nc<=(K/2)%如果聚类中心的数目小于或等于规定值的一半,则对已有聚类进行分裂处理[z] = split(K,z,Ni,thet_N,delta,thet_S,mean_D1,mean_D);continue;endif (Nc>=2*K)||(mod(k,2)==0)%如果Nc>=2K,或迭代运算的次数是偶数次,进行合并处理[z] = merge(z,Ni,L,thet_C);continue;else%否则进行分裂处理[z] = split(K,z,Ni,thet_N,delta,thet_S,mean_D1,mean_D);continue;endend[z,mean_D1,mean_D,delta,Nc,Ni,label]=get_einf(x,z,label);fprintf('样本被分为%d类\n',Nc);for j=1:Ncfprintf('第%d类的聚类中心坐标为:(%f,%f)\n',j,z(j,1),z(j,2));%显示聚类中心坐标endfor i=1:Nfprintf('第%d个样本的坐标:(%d,%d),属于第%d类\n',i,x(i,1),x(i,2),label(i));%显示样本坐标和属于第几类if label(i)==1plot(x(i,1),x(i,2),'.B');hold on;endif label(i)==2plot(x(i,1),x(i,2),'.R');hold on;endif label(i)==3plot(x(i,1),x(i,2),'.g');hold on;if label(i)==4plot(x(i,1),x(i,2),'.m');hold on;endif label(i)==5plot(x(i,1),x(i,2),'.c');hold on;endif label(i)==6plot(x(i,1),x(i,2),'.b');hold on;endif label(i)==7plot(x(i,1),x(i,2),'.y');hold on;endif label(i)==8plot(x(i,1),x(i,2),'.k');hold on;endtitle('分类结果图');end%==================================================================== %函数功能:基于聚类中心进行重新分类,并获得新的分类的基本信息%输入参数:x:样本% z:原聚类中心% label:原样本类别标签%输出参数:z:新的聚类中心% mean_D1:每个类中样本到聚类中心的平均距离% mean_D:全部模式样本和其对应聚类中心的总平均距离% delta:每个聚类中样本距离的标准差向量% Nc:分类的数目% Ni:每个类中样本的数目% label:新的类别标签%==================================================================== function [ z,mean_D1,mean_D,delta,Nc,Ni,label ] = get_einf( x,z,label )[N,n]=size(x);[Nc,n]=size(z);d=zeros(1,Nc);Ni=zeros(1,Nc);%用于保存每一类中样本的个数mean_D1=zeros(1,Nc);%用于保存每个类中样本到聚类中心的平均距离mean_D=0;%用于保存全部模式样本和其对应聚类中心的总平均距离delta=zeros(Nc,n);%用于保存每个聚类中样本距离的标准差向量for i=1:Nfor j=1:Ncd(j)=norm(x(i,:)-z(j,:));endd_min=d(1);for j=1:Ncif d(j)<=d_mind_min=d(j);label(i)=j;%对样本进行分类endendendfor j=1:Ncz(j,:)=zeros(1,n);for i=1:Nif label(i)==jNi(j)=Ni(j)+1;z(j,:)=z(j,:)+x(i,:);endendz(j,:)=z(j,:)/Ni(j);%计算新的聚类中心endfor j=1:Ncfor i=1:Nif label(i)==jmean_D1(j)=mean_D1(j)+norm(x(i,:)-z(j,:));for k=1:ndelta(j,k)=delta(j,k)+(x(i,k)-z(j,k))^2;endendendmean_D=mean_D+mean_D1(j);mean_D1(j)=mean_D1(j)/Ni(j);%获得每个类中样本到聚类中心的平均距离delta(j,:)=sqrt(delta(j,:)/Ni(j));%获得每个聚类中样本距离的标准差向量endmean_D=mean_D/N;%获得全部模式样本和其对应聚类中心的总平均距离end%====================================================================%函数功能:对满足条件的类进行合并%输入参数:z:原聚类中心% Ni:每个类中样本的数目% L:在一次迭代运算中可以合并的聚类中心的最多对数% thet_C:两个聚类中心间的最小距离%输出参数:z_new:新的聚类中心%====================================================================function [z_new] = merge(z,Ni,L,thet_C)[Nc,n]=size(z);D=zeros(Nc,Nc);%记录聚类中心间两两之间的距离merge=zeros(L,2);%用于保存L个最小距离的聚类中心的索引D_min=zeros(1,L);%用于保存L个最小距离D_max=[0,1,1];%保存最大距离的相关信息%第一个参数保存最大距离%第二、三个参数保存最大距离的聚类中心的索引for j=1:(Nc-1)%找到最大距离及其聚类中心的索引,用于初始化D_min和mergefor l=(j+1):NcD(j,l)=norm(z(j,:)-z(l,:));if D(j,l)>=D_maxD_max(1)=D(j,l);D_max(2)=j;D_max(3)=l;endendendfor i=1:Lmerge(i,:)=[D_max(2),D_max(3)];%初始化D_min和mergeD_min(i)=D_max(1);end%------------%以下部分的目的是找到L个最小距离及其聚类中心的索引max=[0,0];%用于保存L个最小距离中的最大距离,及其在D_min和merge中的索引for j=1:(Nc-1)for l=(j+1):Ncfor i=1:Lif max<=D_min(i)max(1)=D_min(i);max(2)=i;endendif D(j,l)<=max(1)%如果新的距离小于L个最小距离中的最大距离,用新的距离替代其中的原最大距离merge(max(2),:)=[j,l];D_min(max(2))=D(j,l);endendend%------------k=0;for i=1:Lif D_min(i)<thet_C%如果距离在最小的L个距离中,且小于thet_C,则满足合并条件,进行合并k=k+1;%以下部分将待合并的两个聚类中心进行赋值(在此处值相等)z(merge(i,1),:)=(Ni(merge(i,1))*z(merge(i,1))+Ni(merge(i,2))*z(merge(i,2)))/(Ni(merge(i,1))+Ni(me rge(i,2)));z(merge(i,2),:)=z(merge(i,1),:);endendz_new=zeros(Nc-k,n);k1=0;for j=1:Nc-1for i=j+1:Ncif z(j,:)==z(i,:)%如果出现相等的聚类中心,则去掉后面一个。

相关文档
最新文档