Разделяне на кръгове с помощта на PCA на ядрото

Опитвам се да възпроизведа прост пример за използване на PCA на ядрото . Целта е да се отделят точките от два концентрични кръга.

Създаване на данните:

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 kernel PCA е внедрен в пакета kernlab.

library(kernlab)

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

Поисках само първия компонент и посочих RBF ядрото. Това е резултатът:

въведете описание на изображението тук

Определено има голяма трансформация на данните, но трансформираните данни не са това, което очаквах (което би било хубаво, чисто разделяне на двата класа). Опитах да си играя със стойността на параметъра сигма и въпреки че резултатите варират драматично, все още не получих това, което очаквах. Предполагам, че сигма е свързана с параметъра гама, споменат тук , вероятно чрез връзката, дадена тук (без отрицателния знак?).

Почти съм сигурен, че допускам наивна грешка на новобранец тук и наистина ще оценя всякакви насоки, които биха ме насочили на правилния път.

Благодаря, Андрю.


r pca
person DataWookie    schedule 09.05.2015    source източник


Отговори (1)


Опитайте сигма = 20. Мисля, че ще получите отговора, който търсите. Сигмата в kernlab всъщност е това, което обикновено се нарича гама за rbf ядрото, така че те са обратно свързани.

person Masyanya    schedule 29.11.2016