在内核k-means(R中的kernlab包)中将新数据点分配给集群?

Posted

技术标签:

【中文标题】在内核k-means(R中的kernlab包)中将新数据点分配给集群?【英文标题】:Assign new data point to cluster in kernel k-means (kernlab package in R)? 【发布时间】:2012-07-22 05:26:22 【问题描述】:

我对 R 的 kernlab 包中的 kkmeans 函数有疑问。我是这个包的新手,如果我在这里遗漏了一些明显的东西,请原谅我。

我想为一组集群中的一个集群分配一个新数据点,这些集群是使用内核 k-means 和函数“kkmeans”创建的。使用常规聚类,可以通过计算新数据点和聚类质心之间的欧几里得距离来做到这一点,并选择质心最近的聚类。在内核 k-means 中,必须在特征空间中执行此操作。

以 kkmeans 描述中使用的例子为例:

data(iris)

sc <- kkmeans(as.matrix(iris[,-5]), centers=3)

假设我在这里有一个新数据点,我想将其分配给上面在sc 中创建的最近的集群。

Sepal.Length  Sepal.Width  Petal.Length  Petal.Width
     5.0         3.6          1.2         0.4 

关于如何做到这一点的任何提示?非常感谢您的帮助。

【问题讨论】:

【参考方案1】:

Kernel K-means 使用 Kernel 函数来计算对象的相似度。在简单的 k-means 中,您循环遍历所有质心并选择最小化到给定数据点的距离(未使用度量)的质心。在核方法的情况下(kkmeans 中的默认核函数是radial basis function),您只需遍历质心并选择最大化核函数值(在 RBF 的情况下)或 最小化内核诱导距离(对于任何内核)。提供了将内核转换为距离度量的详细描述here - 通常由内核K 诱导的距离可以通过d^2(a,b) = K(a,a)+K(b,b)-2K(a,b) 计算,但对于RBF,K(x,x)=1 对所有x,您可以只最大化K(a,b) 而不是最小化整个K(a,a)+K(b,b)-2K(a,b)

要从kkmeans 对象获取内核函数,您可以使用kernelf 函数

> data(iris)
> sc <- kkmeans(as.matrix(iris[,-5]), centers=3)
> K = kernelf(sc)

你的例子

> c=centers(sc)
> x=c(5.0, 3.6, 1.2, 0.4)
> K(x,c[1,])
             [,1]
[1,] 1.303795e-11
> K(x,c[2,])
             [,1]
[1,] 8.038534e-06
> K(x,c[3,])
          [,1]
[1,] 0.8132268
> which.max( c( K(x,c[1,]), K(x,c[2,]), K(x,c[3,]) ) )
[1] 3

就使用的核函数而言,最近的质心是c[3,]=5.032692 3.401923 1.598077 0.3115385

【讨论】:

这是否应该与 sc[] 的集群成员资格输出一致? 链接不再起作用,如果你能恢复它并允许用户进一步深入研究这样的主题,那就太好了。非常感谢!

以上是关于在内核k-means(R中的kernlab包)中将新数据点分配给集群?的主要内容,如果未能解决你的问题,请参考以下文章

如何在kernlab包的ksvm中自定义内核函数?

在kernlab中的SVM训练之外的内核矩阵计算

带有 Kernlab 的内核 PCA 和结肠癌数据集的分类

R 理解来自 kernlab 的 caret train(tuneLength = ) 和 SVM 方法

kernlab中的rbfKernel方程与标准不同?

R语言使用kernlab包中的ksvm函数构建支持向量机SVM模型(Support vector machines)使用RBF核函数使用table函数计算混淆矩阵评估分类模型性能