【发布时间】:2015-07-20 02:40:48
【问题描述】:
我正在尝试重现使用内核 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 的关系(没有负号?)。
我很确定我在这里犯了一个幼稚的新手错误,我非常感谢任何能让我走上正轨的指针。
谢谢, 安德鲁。
【问题讨论】: