Подтвердить что ты не робот

Назначить новые данные для кластера в k-значении ядра (пакет kernlab в R)?

У меня есть вопрос о функции kkmeans в пакете kernlab R. Я новичок в этом пакете, и, пожалуйста, простите меня, если я пропущу что-то очевидное здесь.

Я хотел бы назначить новую точку данных кластеру в наборе кластеров, которые были созданы с использованием ядра k-средств с функцией "kkmeans". При регулярной кластеризации это можно сделать, вычислив эвклидово расстояние между новой точкой данных и центроидами кластера и выбрав кластер с ближайшим центроидом. В k-значении ядра нужно сделать это в пространстве признаков.

Возьмем пример, используемый в описании kkmeans:

data(iris)

sc <- kkmeans(as.matrix(iris[,-5]), centers=3)

Скажем, что у меня есть новая точка данных здесь, которую я бы хотел назначить ближайшему кластеру, созданному выше в sc.

Sepal.Length  Sepal.Width  Petal.Length  Petal.Width
     5.0         3.6          1.2         0.4 

Любые советы о том, как это сделать? Ваша помощь очень ценится.

4b9b3361

Ответ 1

Kernel K-mean использует функцию Kernel для вычисления подобия объектов. В простом k-значении вы перебираете все центроиды и выбираете ту, которая минимизирует расстояние (при использовании метрики) до данной точки данных. В случае метода ядра (функция ядра по умолчанию в kkmeans равна radial basis function), вы просто зацикливаете центроиды и выбираете ту, которая максимизирует значение функции ядра (в случае RBF) или минимизирует ядро, вызванное расстоянием (для любого ядра). Подробное описание преобразования ядра в меру расстояния предоставляется здесь - общее расстояние, вызванное ядром K, может быть рассчитано через d^2(a,b) = K(a,a)+K(b,b)-2K(a,b), но, как и в случае RBF, K(x,x)=1 для всех x, вы можете просто максимизировать K(a,b) вместо минимизации всего K(a,a)+K(b,b)-2K(a,b).

Чтобы получить функцию ядра из объекта kkmeans, вы можете использовать функцию kernelf

> data(iris)
> sc <- kkmeans(as.matrix(iris[,-5]), centers=3)
> K = kernelf(sc)

Итак, для вашего примера

> c=centers(sc)
> x=c(5.0, 3.6, 1.2, 0.4)
> K(x,c[1,])
             [,1]
[1,] 1.303795e-11
> K(x,c[2,])
             [,1]
[1,] 8.038534e-06
> K(x,c[3,])
          [,1]
[1,] 0.8132268
> which.max( c( K(x,c[1,]), K(x,c[2,]), K(x,c[3,]) ) )
[1] 3

ближайший центроид c[3,]=5.032692 3.401923 1.598077 0.3115385 в смысле используемой функции ядра.