Вы используете 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])