利用Weka做K-means聚类

评论12,239

聚类分析中的“类”(cluster)和分类的“类”(class)是不同的,对cluster更加准确的翻译应该是“簇”。聚类的任务是把所有的实例分配到若干的簇,使得同一个簇的实例聚集在一个簇中心的周围,它们之间距离的比较近;而不同簇实例之间的距离比较远。对于由数值型属性刻画的实例来说,这个距离通常指欧氏距离。

K-Means(K均值)算法首先随机的指定K个簇中心。然后:1)将每个实例分配到距它最近的簇中心,得到K个簇;2)计分别计算各簇中所有实例的均值,把它们作为各簇新的簇中心。重复1)和2),直到K 个簇中心的位置都固定,簇的分配也固定。

上述K均值算法只能处理数值型的属性,遇到分类型的属性时要把它变为若干个取值0和1的属性。

WEKA将自动实施这个分类型到数值型的变换,而且WEKA会自动对数值型的数据作标准化。

用“Explorer”打开数据文件,并切换到“Cluster”。点“Choose”按钮选择“SimpleKMeans”,这是WEKA中实现K均值的算法。

参数说明:

displayStdDevs 是否显示数字属性标准差和名词属性个数

distanceFunction 用于比较实例的距离函数(默认: weka.core.EuclideanDistance).

dontReplaceMissingValues 是否不使用mean/mode替换全部丢失的值。

maxIterations 最大迭代次数

numClusters 所聚类的个数

preserveInstancesOrder 是否预先排列实例的顺序

seed 设定的随机种子值

选中“Cluster Mode”的“Use training set”,点击“Start”按钮,观察右边“Clusterer output”给出的聚类结果。也可以在左下角“Result list”中这次产生的结果上点右键,“View in separate window”在新窗口中浏览结果。

结果解释:

首先我们注意到结果中有这么一行:

Within cluster sum of squared errors: 1604.7416693522332

这是评价聚类好坏的标准,数值越小说明同一簇实例之间的 距离越小。也许你得到的数值会不一样;实际上如果把“seed”参数改一下,得到的这个数值就可能会不一样。我们应该多尝试几个seed,并采纳这个数值 最小的那个结果。
例如我让“seed”取100,就得到 Within cluster sum of squared errors: 1555.6241507629218
我该取后面这个。当然再尝试几个seed,这个数值可能会更小。

接下来“Cluster centroids:”之后列出了各个簇中心的位置。对于数值型的属性,簇中心就是它的均值(Mean);分类型的就是它的众数(Mode), 也就是说这个属性上取值为众数值的实例最多。对于数值型的属性,还给出了它在各个簇里的标准差(Std Devs)。

最后的 “Clustered Instances”是各个簇中实例的数目及百分比。

为了观察可视化的聚类结果,我们在左下方“Result list”列出的结果上右击,点“Visualize cluster assignments”。弹出的窗口给出了各实例的散点图。最上方的两个框是选择横坐标和纵坐标,第二行的“color”是散点图着色的依据,默认是根 据不同的簇“Cluster”给实例标上不同的颜色。

可以在这里点“Save”把聚类结果保存成ARFF文件。在这个新的ARFF文件 中,“instance_number”属性表示某实例的编号,“Cluster”属性表示聚类算法给出的该实例所在的簇。

发表评论

匿名网友