在R中,如何从XMeans输出中检索信息

时间:2018-03-27 16:46:42

标签: r weka k-means rweka xmeans

我有一个数据框df,其中包含一堆点的xy坐标。这是一个摘录:

> tail(df)
            x        y
1495 0.627174 0.120215
1496 0.616036 0.123623
1497 0.620269 0.122713
1498 0.630231 0.110670
1499 0.611844 0.111593
1500 0.412236 0.933250

我正在尝试找出最合适的群集数量。最终目标是用数万个这样的数据框来做到这一点,因此选择的方法必须快速且不可视。基于这些要求,似乎RWeka包是可行的方式。

我设法成功加载了RWeka软件包(我必须首先在我的计算机上安装Java SE Runtime)以及RWeka的软件包XMeans,然后运行它:

library("RWeka") # requires Java SE Runtime
WPM("refresh-cache") # Build Weka package metadata cache
WPM("install-package", "XMeans") # Install XMeans package if not previously installed

weka_ctrl <- Weka_control( # Create a Weka control object to specify our parameters
  I = 100, # max no iterations overall
  M = 100, # max no iterations in the kmeans loop
  L = 2,   # min no clusters
  H = 5,   # max no clusters
  D = "weka.core.EuclideanDistance", # distance metric
  C = 0.4, S = 1)
x_means <- XMeans(df, control = weka_ctrl) # run algorithm on data

这产生了我想要的结果:

XMeans
======
Requested iterations            : 100
Iterations performed            : 1
Splits prepared                 : 2
Splits performed                : 0
Cutoff factor                   : 0.4
Percentage of splits accepted 
by cutoff factor                : 0 %
------
Cutoff factor                   : 0.4
------

Cluster centers                 : 2 centers

Cluster 0
            0.4197712002617799 0.9346986806282739
Cluster 1
            0.616697959239131 0.11564350951086963

Distortion: 30.580934
BIC-Value : 2670.359509

我可以通过运行x_means$class_ids将数据框中的每个点分配到群集。

但是,我想找到一种检索聚类中心坐标的方法。我可以在输出中看到它们并手动写下来,但是如果我要运行成千上万的这些,我需要能够有一段代码将它们保存到变量中。我似乎无法使用方括号对x_means进行分组,因此我不知道还能做什么。

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

这些中心似乎没有直接存储在返回的结构中。但是,由于结构 告诉您每个点属于哪个集群,因此很容易计算中心。由于您不提供数据,我将使用内置的虹膜数据进行说明。

正如您所观察到的,打印结果显示了中心。我们可以用它来检查结果。

x_means <- XMeans(iris[,1:4], control = weka_ctrl) 
x_means
## Output truncated to just the interesting part.
Cluster centers                 : 2 centers

Cluster 0
            6.261999999999998 2.872000000000001 4.906000000000001 1.6760000000000006
Cluster 1
            5.005999999999999 3.428000000000001 1.4620000000000002 0.2459999999999999

所以这是如何计算

colMeans(iris[x_means$class_ids==0,1:4])
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
       6.262        2.872        4.906        1.676 
colMeans(iris[x_means$class_ids==1,1:4])
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
       5.006        3.428        1.462        0.246 

结果同意。