使用内核PCA

时间:2015-05-09 05:30:05

标签: r pca

我正在尝试使用内核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

我已将数据拆分为训练和测试集,因为我有意图(一旦我开始工作!)测试结果模型。

enter image description here

在主要内核中,PCA应该允许我将这两个类分开。这个例子的其他讨论使用了径向基函数(RBF)内核,所以我也采用了它。在R内核中,PCA在kernlab包中实现。

library(kernlab)

circle.kpca <- kpca(~ ., data = circle.train[, -1], kernel = "rbfdot", kpar = list(sigma = 10), features = 1)

我只请求了第一个组件并指定了RBF内核。这是结果:

enter image description here

数据确实发生了重大转变,但转换的数据并不是我所期望的(这将是两个类的一个很好的,干净的分离)。我试图摆弄参数sigma的值,尽管结果确实有很大变化,但我仍然没有得到我期望的结果。我假设sigma与提到的here参数gamma有关,可能是通过给定here的关系(没有负号?)。

我很确定我在这里做了一个天真的菜鸟错误,我真的很感激能让我走上正轨的任何指针。

谢谢, 安德鲁。

1 个答案:

答案 0 :(得分:1)

尝试sigma = 20.我想你会得到你想要的答案。 kernlab中的sigma实际上通常被称为rbf内核的gamma,因此它们是反向相关的。