我对R的kkmeans
包中的kernlab
函数有疑问。我是这个包的新手,请原谅我,如果我遗漏了明显的东西。
我想将一个新数据点分配给一组集群中的集群,这些集群是使用内核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
有关如何执行此操作的任何提示?非常感谢您的帮助。
答案 0 :(得分:8)
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
。