首页 > 解决方案 > 在 R 代码中使用“caret”包中的 preProcess 的目的是什么?

问题描述

“大家好。当我看到他们使用 K Nearest Network 对组进行分类时。我不知道他们为什么只使用 preProcess 来标准化数据。这是代码”

preProc <-  preProcess(UB2[3:12])
UBn <- predict(preProc, UB2)
set.seed(12)
UBKm <- kmeans(UBn[3:12], centers = 5, iter.max = 1000)

标签: rdataframeclassificationk-meansr-caret

解决方案


您使用 preProcess 来缩放和居中变量,基本上使它们在相同的范围内。

在列具有不同范围的情况下,如果直接应用kmeans,它将主要形成集群,以最小化具有较高值的​​列的方差。

例如,我们模拟了三个可以在不同尺度的变量上分离的集群:

library(caret)
library(MASS)
library(rgl)
set.seed(111)

Sigma <- matrix(c(10,1,1,1,1,1,1,1),3,3)
X = rbind(mvrnorm(n=200,c(50,1,1), Sigma),
mvrnorm(n=200,c(20,5,1), Sigma),
mvrnorm(n=200,c(20,2.5,2.5), Sigma))
X = data.frame(X,cluster=factor(rep(1:3,each=200)))
plot3d(X[,1:3],col=factor(rep(1:3,each=200)))

在此处输入图像描述

并不是说 X1 在 0-60 的范围内,而 X2、X3 在 -1 到 10 左右。

如果我们在没有缩放的情况下做 kmeans:

clus = kmeans(X[,1:3],3)
COLS = heat.colors(3)
plot3d(X[,1:3],col=COLS[clus$cluster])

在此处输入图像描述

它主要尝试使用 X1 进行拆分,忽略 X2、X3 导致原始集群 1 中的拆分。

所以我们扩展和集群:

clus = kmeans(predict(preProcess(X[,1:3]),X[,1:3]),3)
COLS = heat.colors(3)
plot3d(X[,1:3],col=COLS[clus$cluster])

在此处输入图像描述


推荐阅读