我正在尝试使用内核PCA重现simple example。目标是将两个同心圆分开。
创建数据:
circle <- data.frame(radius = rep(c(0, 1), 500) + rnorm(1000, sd = 0.05),
phi = runif(1000, 0, 2 * pi),
group = rep(c("A", "B"), 500))
#
circle <- transform(circle,
x = radius * cos(phi),
y = radius * sin(phi),
z = rnorm(length(radius))) %>% select(group, x, y, z)
TFRAC = 0.75
#
train <- sample(1:1000, TFRAC * 1000)
circle.train <- circle[train,]
circle.test <- circle[-train,]
> head(circle.train)
group x y z
491 A -0.034216 -0.0312062 0.70780
389 A 0.052616 0.0059919 1.05942
178 B -0.987276 -0.3322542 0.75297
472 B -0.808646 0.3962935 -0.17829
473 A -0.032227 0.0027470 0.66955
346 B 0.894957 0.3381633 1.29191
我已将数据拆分为训练和测试集,因为我有意图(一旦我开始工作!)测试结果模型。
在主要内核中,PCA应该允许我将这两个类分开。这个例子的其他讨论使用了径向基函数(RBF)内核,所以我也采用了它。在R内核中,PCA在kernlab包中实现。
library(kernlab)
circle.kpca <- kpca(~ ., data = circle.train[, -1], kernel = "rbfdot", kpar = list(sigma = 10), features = 1)
我只请求了第一个组件并指定了RBF内核。这是结果:
数据确实发生了重大转变,但转换的数据并不是我所期望的(这将是两个类的一个很好的,干净的分离)。我试图摆弄参数sigma的值,尽管结果确实有很大变化,但我仍然没有得到我期望的结果。我假设sigma与提到的here参数gamma有关,可能是通过给定here的关系(没有负号?)。
我很确定我在这里做了一个天真的菜鸟错误,我真的很感激能让我走上正轨的任何指针。
谢谢, 安德鲁。
答案 0 :(得分:1)
尝试sigma = 20.我想你会得到你想要的答案。 kernlab中的sigma实际上通常被称为rbf内核的gamma,因此它们是反向相关的。