r - 在 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)
解决方案
您使用 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])
推荐阅读
- regex - Bash正则表达式解析ss输出
- javascript - js - 使用 onkeyup 的时间跨度
- javascript - 我需要从状态中删除一个数组项。我怎样才能做到这一点?
- python - 如何在保存在数据库中的值上显示刻度线以在 Django 中更新表单
- node.js - 无法为我的 nodejs/axios 应用程序提供 Let'sEncrypt 的正确根证书
- c++ - 使用switch c ++的简单货币转换器
- java - “不正确的 PK”:在 CrudRepository 上删除带有 @IdClass 注释的实体的操作
- wordpress - 谷歌字体未在 wordpress 主题中加载
- javascript - 如何修复活页夹中的参数 linter 错误?
- python - 用上面的值填充缺失值