WEKA聚类算法wine数据集分析(附代码数据)研究报告文档格式.docx
《WEKA聚类算法wine数据集分析(附代码数据)研究报告文档格式.docx》由会员分享,可在线阅读,更多相关《WEKA聚类算法wine数据集分析(附代码数据)研究报告文档格式.docx(18页珍藏版)》请在冰点文库上搜索。
其中第1
类有59个样本,第2类有71个样本,第3类有48个样本。
3实验方法
聚类是对数据对象进行划分的一种过程,与分类不同的是,它所划分的类是
未知的,故此,这是一个“无指导的学习”过程,它倾向于数据的自然划分。
其中聚类算法常见的有基于层次方法、基于划分方法、基于密度以及网格等方法。
本文中对近年来聚类算法的研究现状与新进展进行归纳总结。
一方面对近年来提出的较有代表性的聚类算法,从算法思想。
关键技术和优缺点等方面进行分析概括;
另一方面选择一些典型的聚类算法和一些知名的数据集,主要从正确率和运行效率两个方面进行模拟实验,并分别就同一种聚类算法、不同的数据集以及同一个数据集、不同的聚类算法的聚类情况进行对比分析。
最后通过综合上述两方面信息给出聚类分析的研究热点、难点、不足和有待解决的一些问题等。
实验中主要选择了K均值聚类算法、FCM模糊聚类算法并以UCIMachine
LearningRepository网站下载的WINE数据集为基础,然后以WINE数据集在学习了解Weka软件接口方面的基础后作聚类分析,使用最常见的K均值(即K-means)聚类算法和FCM模糊聚类算法。
下面简单描述一下K均值聚类的步骤。
K均值算法首先随机的指定K个类中心。
然后:
(1)将每个实例分配到距它最近的类中心,得到K个类;
(2)计分别计算各类中所有实例的均值,把它们作为各类新的类中心。
重复
(1)和
(2),直到K个类中心的位置都固定,类的分配也固定。
在实验过程中通过利用Weka软件中提供的simpleKmeans(也就是K均值聚类算法对WINE数据集进行聚类分析,更深刻的理解k均值算法,并通过对实验结果进行观察分析,找出实验中所存在的问题。
然后再在学习了解Weka软件接口方面的基础上对Weka软件进行一定的扩展以加入新的聚类算法来实现基于Weka平台的聚类分析。
3.1K均值聚类算法
3.1.1K均值聚类算法理论
K均值算法是一种硬划分方法,简单流行但其也存在一些问题诸如其划分结果并不一定完全可信。
K均值算法的划分理论基础是
c
min
i1
x v
k
i
kAi 2
(1)
其中c是划分的聚类数,Ai是已经属于第i类的数据集vi是相应的点到第i类的平均距离,即
vi
其中Ni表示在数据集Ai中的对象数。
3.1.2算法的基本过程
Ni
k i
x
k1k,x ANi
(2)
step1:
任意选择K个对象作为初始的类的中心;
step2:
repeat;
step3:
根据类中的平均值,将每个数据点(重新)赋给最相近的类;
step4:
更新类的平均值;
step5:
until不再发生变化,即没有对象进行被重新分配时过程结束。
3.2FCM模糊聚类算法
FCM算法也是一种基于划分的聚类算法,它的思想就是使得被划分到同一类的对象之间相似度最大,而不同类之间的相似度最小。
模糊C均值算法是普通C均值算法的改进,普通C均值算法对于数据的划分是硬性的,而FCM则是一种柔性的模糊划分。
在介绍FCM具体算法之前我们先介绍一些模糊集合的基本知识。
3.2.1FCM模糊聚类算法的理论
1)理论基础-模糊集基本知识
首先说明隶属度函数的概念。
隶属度函数是表示一个对象x隶属于集合A的
A
程度的函数,通常记做 x,其自变量范围是所有可能属于集合 的对象(即
集合A所在空间中的所有点),取值范围是0,1,即0
x 1。
x 1表
A A
示x完全隶属于集合A,相当于传统集合概念上的xA。
一个定义在空间Xx上的隶属度函数就定义了一个模糊集合A,或者叫定义在论域Xx上的模糊子集。
在聚类的问题中,可以把聚类生成的类看成模糊集合,因此每个样
本点隶属于每个类的隶属度就是0,1区间里面的值。
2)FCM的算法理论
1973年,Bezdek提出了该算法,并作为早期硬C均值聚类(HCM)方法的一种改进,命名为模糊C均值聚类简称FCM是一种目标函数法。
假设将样本空
间X要分为k个类,则类中心集C
(c1,c2,c3, ,ck)使下式的目标函数值最小
minJ
n k 2
mx c 3
m ij i j ()
i1j1
ij 1
j1
n;
j 1,2, ,k
且有
(4)
ij [0,1]
其中
i 1,2,
U (ij)
被称为模糊隶属度矩阵。
ij表示的是数据xi隶属于类中心cj的隶属度。
m是模
糊加权参数,用于控制在模糊类间的程度依据参考的文献中一般取值为1 5。
应用拉格朗日乘法并基于上述约束可得到如下式
1
ij 2
c Dijm 1
t1 Dtj
且
(5)
1 i c,1 j N
N
m
ij j
C j1
1 i c (6)
i N
mij
j1
其中Dij是Xi到第j类中心Cj的欧氏距离,即
Xi
3.2.2FCM模糊聚类算法的过程
Cj。
置初始化参数值,包含模糊加权参数值m和聚类数k,以及迭代的次数s和算法终止误差。
step2:
随机化置初始化聚类的中心C0,t 0。
计算隶属度矩阵U可通过(5)式计算Us得来。
依据(6)式迭代计算聚类的中心Cs1。
检验Us1 Us
3.2.3实验配置
是否成立,成立则算法结束否则gotostep3。
实验配置过程与K均值算法的实验配置过程基本相同,只是在FCM模糊聚类算法实验中要用到模糊隶属度参数,一般将其设置在1~5之间在实验中设置如下param.m=2。
也可以根据需要对其进行修改。
3.2.4FCM模糊聚类算法特点
FCM算法需要两个参数一个是聚类数目c,另一个是参数m。
一般来讲c要
远远小于聚类样本的总个数,同时要保证c 1。
对于m,它是一个控制算法的
柔性的参数,如果m过大,则聚类效果会很次,而如果m过小则算法会接近K均值聚类算法。
算法的输出是c个聚类中心点向量和c*N的一个模糊划分矩阵,这个矩阵表示的是每个样本点属于每个类的隶属度。
根据这个划分矩阵按照模糊集合中的最大隶属原则就能够确定每个样本点归为哪个类。
聚类中心表示的是每个类的平均特征,可以认为是这个类的中心代表。
FCM算法是图像分割使用最多的方法之一,它的成功主要归功于为解决每
个图像像素的隶属需要引入了模糊性。
与K均值聚类相比较来说FCM能够保留初始图像的更多信息。
FCM对孤立点和其他人造图像非常敏感。
3.3基于weka的聚类分析
3.4.1数据的预处理
从网站下载的WINE原始数据集wine.data文件,而Weka软件需要的是ARFF
文件格式的数据。
因此需要将数据转换成Weka支持的ARFF文件格式的。
转换过程如下
首先用记事本方式打开文件发现文件中的数据之间是以逗号来划分的,因此可以将数据文件的名称改为wine.csv。
然后,打开Weka选择Tools选项下的ArffViewer如下图
打开ArffViewer后选择File选项下的Open弹出如下图的打开窗口,在文件类型一栏选择CSVdatafiles(*.csv)项。
然后找到相应的文件后单击打开后如下图
接下来选择File选项下的Saveas后弹出如下图
在文件名栏输入相应的文件名后单击保存即可得到相应的arff格式的数据集文件。
K均值算法只能处理数值型的属性,遇到分类型的属性时要把它变为若干个取值0和1的属性。
WEKA将自动实施这个分类型到数值型的变换,而且WEKA会自动对数值型的数据作标准化。
WEKA中的StringToWordVector过滤
器能将ARFF文件中的文本数据转换为空间向量模型,它同时拥有分词、特征表示、特征提取等功能。
在Explorer中的Reprocess界面导入ARFF文件,选择StringToWordVector过滤器,再设置相关参数。
3.4.2聚类过程
进入Explorer中的Preprocess界面单击Openfile后弹出如下图的数据集选择窗口,选择WINE.arff数据集文件后打开。
然后可以在Filter下的choose中选择需要的过滤器参数。
接下来选择Cluster选项界面,在Clusterer中选择choose来选择Weka中提供的聚类算法Clusters下的SimpleKMeans,然后设置参数如下图
即为修改“numClusters”为3就是我们要将数据聚类为3类即K=3,下面的“seed”参数是要设置一个随机种子,依此产生一个随机数,用来得到K均值算法中第一次给出的K个簇中心的位置,这里暂时让它就为10,设置完成后单击OK返回。
然后选中“ClusterMode”的“Usetrainingset”,点击“Start”按钮,观察右边“Clustereroutput”给出的聚类结果如下
===Runinformation===
Scheme:
Weka.clusterers.SimpleKMeans-N3-A"
Weka.core.EuclideanDistance-Rfirst-last"
-I500
-S10
Relation:
WINEDAT
Instances:
177
Attributes:
14
1.42E+01
1.71E+00
2.43E+00
1.56E+01
1.27E+02
2.80E+00
3.06E+00
2.80E-01
2.29E+00
5.64E+00
1.04E+00
3.92E+00
1.07E+03
Testmode:
evaluateontrainingdata
===Modelandevaluationontrainingset===
kMeans
======
Numberofiterations:
7
Withinclustersumofsquarederrors:
49.650910689035356
Missingvaluesgloballyreplacedwithmean/mode
Clustercentroids:
Cluster#
Attribute FullData 0 1 2
(177) (59) (49) (69)
===================================================
13.0006
13.7305
13.1612
12.2623
2.3399
2.01
3.3445
1.9086
2.3662
2.4585
2.4347
2.2386
19.5169
17.2814
21.4388
20.0638
99.5876
106.5424
99.0204
94.0435
2.2923
2.8486
1.6782
2.2526
2.0234
2.9795
0.798
2.0762
0.3623
0.2888
0.4508
1.5869
1.8937
1.1631
1.6257
5.0553
5.4895
7.3451
3.058
0.957
1.0666
0.6859
1.0557
2.6043
3.1507
1.6902
2.7862
745.678
1116.1017
627.551
512.8261
1.9435
1.0169
2.9796
2
ClusteredInstances
59(33%)
49(28%)
69(39%)
也可以在左下角“Resultlist”中这次产生的结果上点右键,“Viewinseparatewindow”在新窗口中浏览结果。
3.4.3结果分析
首先我们注意到结果中有这么一行:
这是评价聚类好坏的标准,数值越小说明同一类实例之间的距离越小。
也许你得到的数值会不一样;
实际上如果把"
seed"
参数改一下,得到的这个数值就可能会不一样。
我们应该多尝试几个seed,并采纳这个数值最小的那个结果。
接下来"
"
之后列出了各个类中心的位置。
对于数值型的属性,类中心就是它的均值(Mean);
分类型的就是它的众数(Mode),也就是说这个属性上取值为众数值的实例最多。
对于数值型的属性,还给出了它在各个类里的标准差(StdDevs)。
最后的"
ClusteredInstances"
是各个类中实例的数目及百分比如下ClusteredInstances
实际的聚类各类中的实例分配如下
NumberofInstances
class159
class271
class348
通过对比可以得出聚类的结果还是比较满意的。
为了观察可视化的聚类结果,我们在左下方"
Resultlist"
列出的结果上右击,点"
Visualizeclusterassignments"
。
弹出的窗口给出了各实例的散点图。
最上方的
两个框是选择横坐标和纵坐标,第二行的"
color"
是散点图着色的依据,默认是根据不同的类"
Cluster"
给实例标上不同的颜色,如下图
从图中很容易看出聚类的结果由不同颜色区分。
可以在这里点"
Save"
把聚类结果保存成ARFF文件。
在这个新的ARFF文件中,"
instance_number"
属性表示某实例的编号,"
属性表示聚类算法给出的该实例所在的类。
3.4.4实验扩展
聚类算法在数据挖掘里面被称之为无监督学习(unsupervisedlearning),这是与分类算法(supervisedlearning)相对的。
所谓无监督学习就是在预先不知道样本类别的情况下,由聚类算法来判别样本的类别的一种学习方法。
但是在Weka中还有一个问题就是所提供的聚类算法有限难以满足具体需要,基于此问题在阅读了相关文献后发现可以通过扩展Weka的聚类算法来满足具体的实验需要。
通过分析实验的相关代码可以得到Weka中聚类的一般过程主要如下
1.读入需预测样本
2.初始化聚类算法(并设置参数)
3.使用聚类算法对样本进行聚类
4.打印聚类结果
大概过程可实现如下
Instancesins=null;
InstancestempIns=null;
SimpleKMeansKM=null;
DistanceFunctiondisFun=null;
try{
Filefile=newFile("
data.arff"
);
ArffLoaderloader=newArffLoader();
loader.setFile(file);
ins=loader.getDataSet();
KM=newSimpleKMeans();
KM.setNumClusters
(2);
KM.buildClusterer(ins);
tempIns=KM.getClusterCentroids();
System.out.println("
CentroIds:
"
+tempIns);
}catch(Exceptione){e.printStackTrace();
}
首先读入样本过程比较简单可以调用ArffLoader()函数和setFile()函数以及getDataSet()函数等在构建聚类器时也是通过现有的类来实现的。
SimpleKMean是最简单的KMeans算法,因为聚类算法的核心是通过距离来得到类别(类间相异,类内相似),所以需要有一个计算距离的公式常见的就是欧几里得距离了。
将SimpleKMean计算距离的方法默认为欧几里得距离。
Weka中提供了设置距离函数的接口setDistanceFunction(DistanceFunctiondf),可以方便我们设置自己的距离计算方法。
在聚类过程中将样本的类别属性放在里面是不符合常识的,因为样本类别属性包含了大量的类别信息,可能诱导聚类算法得到很好的效果。
但是这与我们的初衷是相背离的,所以在聚类之前我们要记住删除掉类别属性。
在第四步打印聚类结果是一个很简单的信息,里面包括了聚类的几个中心点。
在写程序时可以使用ClusterEvaluation类来打印更多的信息。
3.4.5FCM模糊聚类算法
在扩展之前Weka中的聚类算法如下图
通过扩展加入FCM聚类算法。
加入所需的未导入的Java包
importweka.classifiers.rules.DecisionTableHashKey;
importweka.core.Attribute;
importweka.core.DistanceFunction;
importweka.core.EuclideanDistance;
importweka.core.ManhattanDistance;
importweka.core.RevisionUtils;
实现接口中的抽象方法
publicStringgetRevision(){
returnRevisionUtils.extract("
$Revision:
1.40$"
下面在实验中使用FCM模糊聚类算法来实现对WINE数据集的聚类。
首先选择Applications下的Explorer如下图
然后在Preprocess中在Openfile中选择WINE.arff文件
打开后在Cluster选项的choose中选择FuzzyCMeans如下图
然后设置参数如下图
然后单击OK后返回,然后选中“ClusterMode”的“Usetrainingset”,点击“Start”按钮,观察右边“Clustereroutput”给出的聚类结果如下
实验结果中的ClusteredInstances如下
ClusteredInstances0 49(28%)
1 72(41%)
2 56(32%)
与前面给出的实际数据相比较吻合实验结果比较满意。
4 实验总结
如何能够快速找到“Withinclustersumofsquarederrors”值最小的聚类方案是在实验过程中的一个难题。
对于不同的算法其相应的最小值标准确定方法也是未知的。
如果数据实例的数目非常的大,显然尝试手段是不现实的。
通过实验对如何在Weka中进行聚类分析有了更深刻的了解,对Weka中进行聚类分析的相关算法也有了进一步的理解,在实验过程中也学到了诸多实践技能。