Каковы цели использования preProcess из пакета "caret" в коде R? - PullRequest
1 голос
/ 28 марта 2020

"Привет всем. Когда я вижу, что они используют 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)

1 Ответ

1 голос
/ 02 апреля 2020

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

enter image description here

Не то чтобы 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])

enter image description here

Он в первую очередь пытается разделить, используя 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])

enter image description here

...