数据挖掘学习08 - 实验:使用R评估kmeans聚类的最优K

简介:

本文目的

最近这几天一直在研究如何评估Kmeans聚类算法中的最优K值。主要理论依据是《数据挖掘导论》8.5.5节中介绍的SSE和Silhouette Coefficient系数的方法评估最优K。现在记录整个实验过程,作为备忘。不过,体验过程中,由于R软件使用的还不太熟练,实现过程中有些地方可能不准确,还请大牛指点。

实验步骤概述

  1. 下载实验数据,点击这里
  2. 取k值范围,计算出SSE,并绘制出曲线图,观察规律
  3. 取步骤2同样的范围,计算出Silhouette Coefficient,并绘制出曲线图,观察规律
  4. 根据步骤2,3观察的规律,评估出最优K值
  5. 验证最优聚类

步骤1:下载实验数据

按照上面给出的链接,下载解压后的数据如下所示:

image

数据代表的是一些文本的特征矩阵,第一行是代表的词语,出于保密原因,词语被转义了。每一行代表一个文本。第二行开始的第一列是文本的ID。所以,上图中红框中的部分才是文本的特征矩阵。矩阵中每个元素的值代表所在文本当前词语的词频。

步骤2:计算SSE

主要采用R软件计算不同K值的SSE,R脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 开始与结果边界
begin = 1;
length = 15;
count = 50;
end = begin + length - 1;
 
# 结果容器
result = c();
result[begin:end] = 0;
 
# 遍历计算kmeans的SSE
qc = read .table( "d:/question_cluster.txt" , header=T);
for (i in  begin:end) {
     # 计算SSE
     tmp = c();
     tmp[1:count] = 0;
     for (j in  1:count) {
         kcluster = kmeans(qc, i);
         tmp[j] = kcluster$tot.withinss;
     }
     result[i] = mean(tmp);
}
 
# 绘制结果
plot(result, type = "o" , xlab= "Number of Cluster" , ylab= "Sum of Squer Error" );

此脚本按照K从1到15,计算不同的聚类的SSE,由于kmeans算法中的随机因数,每次结果都不一样,为了减少时间结果的偶然性,对于每个k值,都重复运行50次,求出平均的SSE,最后绘制出SSE曲线,如下所示:

image

步骤3:计算Silhouette Coefficient

仍然采用R脚本计算,脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 开始与结果边界
begin = 2;
length = 15;
count = 50;
end = begin + length - 1;
 
# 结果容器
result = c();
result[begin:end] = -1;
 
# 遍历计算kmeans的SSE
library(cluster);
qc = read .table( "d:/question_cluster.txt" , header=T);
for (i in  begin:end) {
     # Silhouette coefficient
     tmp = c();
     tmp[1:count] = 0;
     for (j in  1:count) {
         kcluster = pam(qc, i);
         tmp[j] = kcluster$silinfo$avg.width;
     }
     result[i] = mean(tmp);
}
 
# 绘制结果
plot(result, type = "o" , xlab= "Number of Cluster" , ylab= "Silhouette Coefficient" );

 

K从2到15(k=1时无法计算),重复执行50次,得到结果如下:

步骤4:估算K值

SSE图中没有什么特点,但是充Silhouette Coefficient图中可以明显看到K=8与K=9之间有一个巨大的深沟,根据Silhouette Coefficient的定义,值较大时的K较优,所以估算最优K=8为最优点。但是,书上给出的示意图是可以看到SSE中对应的地方应该改也有一个比较大的特征点,可能是kmeans的实现算法和pam具有一定的差异造成的。

 image

 

 

步骤5:验证最优K

采用如下代码计算8个聚类的kmeans

1
2
qc = read .table( "d:/question_cluster.txt" , header=T);
kc = kmeans(qc, centers=8)
 
 

使用下面的代码将实验数据从N维空间降低到2维平面,并绘制图像

1
2
3
eucQcd = dist(qc,method= "euclidean" )
mds = cmdscale(eucQcd)
plot(mds, col=kc$cluster, main=”8 clusters”)

输出图像如下所示

image

 

实验感受

上述面描述的实验过程,大致与《数据挖掘导论》8.5.5节中的一致。通过实验,发现的确可以通过Silhouette Coefficient评估最优K值,但是如何将此评估过程自动化,这还有待进一步研究。最后,也希望高人可以指出kmeans的最佳实践。

 

参考资料

《数据挖掘导论》(by Pang-Ning Tan) 8.5.5节

 
声明:如有转载本博文章,请注明出处。您的支持是我的动力!文章部分内容来自互联网,本人不负任何法律责任。

本文转自bourneli博客园博客,原文链接: http://www.cnblogs.com/bourneli/archive/2012/11/08/2761120.html ,如需转载请自行联系原作者
相关文章
|
5月前
|
机器学习/深度学习 数据挖掘 Python
【数据挖掘】分类器模型性能评估讲解及iris数据集评估实战(超详细 附源码)
【数据挖掘】分类器模型性能评估讲解及iris数据集评估实战(超详细 附源码)
54 0
|
5月前
|
编解码 算法 数据挖掘
【数据挖掘】聚类趋势估计、簇数确定、质量测定等评估方法详解(图文解释 超详细)
【数据挖掘】聚类趋势估计、簇数确定、质量测定等评估方法详解(图文解释 超详细)
52 0
|
4天前
|
SQL 数据可视化 算法
SQL Server聚类数据挖掘信用卡客户可视化分析
SQL Server聚类数据挖掘信用卡客户可视化分析
13 2
|
4天前
|
数据采集 机器学习/深度学习 存储
MATLAB用改进K-Means(K-均值)聚类算法数据挖掘高校学生的期末考试成绩
MATLAB用改进K-Means(K-均值)聚类算法数据挖掘高校学生的期末考试成绩
10 0
|
5月前
|
算法 数据可视化 数据挖掘
【数据挖掘】密度聚类DBSCAN讲解及实战应用(图文解释 附源码)
【数据挖掘】密度聚类DBSCAN讲解及实战应用(图文解释 附源码)
177 1
|
3月前
|
数据采集 算法 搜索推荐
数据挖掘实战:基于KMeans算法对超市客户进行聚类分群
数据挖掘实战:基于KMeans算法对超市客户进行聚类分群
153 0
|
5月前
|
机器学习/深度学习 自然语言处理 数据可视化
【Python百宝箱】数据科学的黄金三角:数据挖掘和聚类
【Python百宝箱】数据科学的黄金三角:数据挖掘和聚类
168 2
|
5月前
|
机器学习/深度学习 存储 编解码
【数据挖掘】网格聚类STING、概念聚类COBWEB和模糊聚类的讲解(图文解释)
【数据挖掘】网格聚类STING、概念聚类COBWEB和模糊聚类的讲解(图文解释)
110 0
|
5月前
|
机器学习/深度学习 算法 数据挖掘
【数据挖掘】关联模式评估方法及Apriori算法超市购物应用实战(超详细 附源码)
【数据挖掘】关联模式评估方法及Apriori算法超市购物应用实战(超详细 附源码)
55 0
|
6月前
|
机器学习/深度学习 算法 数据挖掘
数据挖掘2.6——聚类 知识点整理
数据挖掘2.6——聚类 知识点整理
73 0

热门文章

最新文章