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

car*_*978 12 r cluster-analysis machine-learning k-means kernlab

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

我想将一个新数据点分配给一组集群中的集群,这些集群是使用内核k-means和函数'kkmeans'创建的.通过常规聚类,可以通过计算新数据点和聚类质心之间的欧几里德距离来实现此目的,并选择具有最接近质心的聚类.在内核k-means中,必须在特征空间中执行此操作.

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

data(iris)

sc <- kkmeans(as.matrix(iris[,-5]), centers=3)
Run Code Online (Sandbox Code Playgroud)

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

Sepal.Length  Sepal.Width  Petal.Length  Petal.Width
     5.0         3.6          1.2         0.4 
Run Code Online (Sandbox Code Playgroud)

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

lej*_*lot 8

内核K-means使用内核函数来计算对象的相似性.在简单的k-means中,您遍历所有质心并选择最小化距离(在使用的度量下)到给定数据点的质心.在内核方法(kkmeansis中的默认内核函数radial basis function)的情况下,您只需循环遍历质心并选择最大化内核函数值的那个(在RBF的情况下)或最小化内核引起的距离(对于任何内核).这里提供了将内核转换为距离测量的详细描述- 通常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)
Run Code Online (Sandbox Code Playgroud)

所以对你的例子

> 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
Run Code Online (Sandbox Code Playgroud)

最接近的质心是c[3,]=5.032692 3.401923 1.598077 0.3115385使用内核函数的意思.