R中kmean的创建预测函数

d-m*_*max 1 r k-means

我想创建预测函数来预测观察属于哪个集群

data(iris)
 mydata=iris
m=mydata[1:4]
train=head(m,100)
xNew=head(m,10)


rownames(train)<-1:nrow(train)

norm_eucl=function(train)
  train/apply(train,1,function(x)sum(x^2)^.5)
m_norm=norm_eucl(train)


result=kmeans(m_norm,3,30)

predict.kmean <- function(cluster, newdata)
{
  simMat <- m_norm(rbind(cluster, newdata),
              sel=(1:nrow(newdata)) + nrow(cluster))[1:nrow(cluster), ]
  unname(apply(simMat, 2, which.max))
}

## assign new data samples to exemplars
predict.kmean(m_norm, x[result$cluster, ], xNew)
Run Code Online (Sandbox Code Playgroud)

当我收到错误后

Error in predict.kmean(m_norm, x[result$cluster, ], xNew) : 
  unused argument (xNew)
Run Code Online (Sandbox Code Playgroud)

我知道我正在做一些错误的功能,因为我只是在学习这样做,但我不明白到底在哪里。

确实我想采用 apcluster 的类似功能(我见过类似的主题,但是针对 apcluster)

predict.apcluster <- function(s, exemplars, newdata)
{
  simMat <- s(rbind(exemplars, newdata),
              sel=(1:nrow(newdata)) + nrow(exemplars))[1:nrow(exemplars), ]
  unname(apply(simMat, 2, which.max))
}

## assign new data samples to exemplars
predict.apcluster(negDistMat(r=2), x[apres@exemplars, ], xNew)
Run Code Online (Sandbox Code Playgroud)

怎么做?

Jul*_*ora 6

让我们提出我们自己的函数,而不是尝试复制某些东西。对于给定的向量x,我们希望使用一些先前的 k 均值输出来分配一个簇。考虑到 k-means 算法的工作原理,我们想要的是找到哪个簇的中心最接近x。可以这样做

predict.kmeans <- function(x, newdata)
  apply(newdata, 1, function(r) which.min(colSums((t(x$centers) - r)^2)))
Run Code Online (Sandbox Code Playgroud)

也就是说,我们逐行newdata遍历并计算相应行到每个中心的距离并找到最小的距离。然后,例如,

head(predict(result, train / sqrt(rowSums(train^2))), 3)
# 1 2 3 
# 2 2 2
all.equal(predict(result, train / sqrt(rowSums(train^2))), result$cluster)
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)

这证实了我们的预测函数将所有相同的集群分配给训练观察。然后还有

predict(result, xNew / sqrt(rowSums(xNew^2)))
#  1  2  3  4  5  6  7  8  9 10 
#  2  2  2  2  2  2  2  2  2  2 
Run Code Online (Sandbox Code Playgroud)

另请注意,我只是简单地调用predict而不是predict.kmeans. 那是因为result它是类的kmeans,并且会自动选择正确的方法。另请注意我如何以矢量化方式标准化数据,而不使用apply.