【问题标题】:Separating circles using kernel PCA使用内核 PCA 分离圆圈
【发布时间】: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 的关系(没有负号?)。

我很确定我在这里犯了一个幼稚的新手错误,我非常感谢任何能让我走上正轨的指针。

谢谢, 安德鲁。

【问题讨论】:

    标签: r pca


    【解决方案1】:

    试试 sigma = 20。我想你会得到你正在寻找的答案。 kernlab 中的 sigma 实际上就是通常所说的 rbf 内核的 gamma,所以它们是负相关的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-04
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 2014-10-13
      相关资源
      最近更新 更多