Использование справки предсказывает () для SVM kernlab в R?

Можно установить СОБЫТИЕ в файле параметра (простой текст или spfile), чтобы вынудить Oracle вывести подробный файл трассировки в user_dump_dest, имя объекта могло бы быть там, если не SQL должен быть.

СОБЫТИЕ = "942 имени трассировки errorstack уровень 12"

при использовании файла простого текста необходимо сохранить все настройки EVENT на последовательных строках. Не уверенный, как это относилось к spfile.

6
задан poundifdef 18 November 2009 в 02:42
поделиться

2 ответа

Если вы думаете о том, как машина опорных векторов могла бы " используйте матрицу ядра, вы увидите, что вы не можете сделать это так, как вы пытаетесь (как вы видели: -)

Я действительно немного боролся с этим, когда впервые использовал kernlab + матрица ядра ... по совпадению, это также было для ядер графов!

В любом случае, давайте сначала поймем, что, поскольку SVM не знает, как вычислить вашу функцию ядра, ему необходимо, чтобы эти значения уже были рассчитаны между вашими новыми (тестирующими) примерами и примерами, которые он выбирает в качестве опорных векторов на этапе обучения.

Итак, вам необходимо вычислить матрицу ядра для всех ваших примеров вместе. Позже вы потренируетесь на некоторых и протестируете другие, удалив строки + столбцы из матрицы ядра, когда это необходимо. Позвольте мне показать вам код.

Мы можем использовать пример кода из документации ksvm , чтобы загрузить в нашу рабочую область некоторые данные:

library(kernlab)
example(ksvm)

Вам нужно будет нажать return несколько (2) раз для того, чтобы позволить графикам нарисовать и дать пример закончить, но теперь у вас должна быть матрица ядра в вашем рабочем пространстве под названием K . Мы' Мне нужно будет восстановить вектор y , который он должен использовать для своих меток (так как в этом примере он был вытоптан другим кодом):

y <- matrix(c(rep(1,60),rep(-1,60)))

Теперь выберите подмножество примеров для использования для тестирования

holdout <- sample(1:ncol(K), 10)

С этого момента я собираюсь:

  1. Создать матрицу обучающего ядра с именем trainK из исходной матрицы ядра K .
  2. Создать модель SVM из мой обучающий набор trainK
  3. Используйте опорные векторы, найденные в модели, для создания матрицы ядра тестирования testK ... это странная часть. Если вы посмотрите на код в kernlab , чтобы увидеть, как он использует индексы опорных векторов, вы поймете, почему это делается именно так. Можно было бы сделать это другим способом, но я не видел никакой документации / примеров по прогнозированию с помощью матрицы ядра, так что я делаю это здесь "трудным путем".
  4. Используйте SVM, чтобы предсказать эти функции и сообщить точность

Вот код:

trainK <- as.kernelMatrix(K[-holdout,-holdout])  # 1
m <- ksvm(trainK, y[-holdout], kernel='matrix')  # 2
testK <- as.kernelMatrix(K[holdout, -holdout][,SVindex(m), drop=F]) # 3
preds <- predict(m, testK)  # 4
sum(sign(preds) == sign(y[holdout])) / length(holdout) # == 1 (perfect!)

Это должно было сделать это. Удачи!

Ответы на комментарий ниже

что означает K [-holdout, -holdout]? (что означает "-"?)

Представьте, что у вас есть вектор x , и вы хотите получить из него элементы 1, 3 и 5, вы бы сделали:

x.sub <- x[c(1,3,5)]

Если вы хотите получить все из x , кроме элементов 1, 3 и 5, вы должны сделать:

x.sub <- x[-c(1,3,5)]

Итак K [-holdout, -holdout] возвращает все строк и столбцов K за исключением для строк, которые мы хотим удерживать.

Каковы аргументы вашего as.kernelMatrix - особенно [, SVindex (m), drop = F] (что особенно странно, потому что похоже, что вся скобка представляет собой матричный индекс K?)

Да, я объединил две команды в одну:

testK <- as.kernelMatrix(K[holdout, -holdout][,SVindex(m), drop=F])

Теперь, когда вы обучили модель, вы хочу дать ему новую матрицу ядра с примерами тестирования. K [holdout,] даст вам только строки, которые соответствуют обучающим примерам в K , и все столбцы K .

SVindex (m) дает вам индексы ваших опорных векторов из вашей исходной матрицы обучения - помните, что из этих строк / столбцов удалено удержание . Итак, чтобы индексы этих столбцов были правильными (т.е. ссылались на правильный столбец sv), я должен сначала удалить столбцы , удерживающие .

В любом случае, возможно, это более ясно:

testK <- K[holdout, -holdout]
testK <- testK[,SVindex(m), drop=FALSE]

Теперь testK содержит только строки из наших примеров тестирования и столбцы, соответствующие векторам поддержки. testK [1,1] будет иметь значение функции ядра, вычисленное между вашим первым примером тестирования и первым вектором поддержки. testK [1,2] будет иметь значение функции ядра между вашим 1-м примером тестирования и вторым вектором поддержки и т. Д.

Обновление (2014-01-30) для ответа на комментарий от @wrahool

Прошло много времени с тех пор, как я играл с этим, поэтому подробности kernlab :: ksvm немного устарели, но в принципе это должно быть правильно :-) ... вот

] в чем смысл testK <- K [holdout, -holdout] - разве вы не удаляете столбцы, которые соответствуют набору тестов?

Да. Короткий ответ заключается в том, что если вы хотите предсказать с помощью матрицы ядра, вы должны предоставить матрицу, которая имеет размерность строк на опорных векторов . Для каждой строки матрицы (новый пример, который вы хотите спрогнозировать) значения в столбцах - это просто значение матрицы ядра, оцененное между этим примером и опорным вектором.

Вызов SVindex (m ) возвращает индекс опорных векторов, заданный в измерении исходных данных обучения.

Итак, сначала выполняем testK <- K [holdout, -holdout] дает мне матрицу testK со строками примеров, по которым я хочу прогнозировать, и столбцы из тех же примеров (размерностей), на которых была обучена модель.

Я дополнительно поднабор столбцов testK с помощью SVindex (m) , чтобы получить только столбцы, которые (сейчас) соответствуют моим опорным векторам. Если бы я не сделал первый выбор [, -holdout] , индексы, возвращаемые SVindex (m) , могли бы не соответствовать правильным примерам (если только все N ) из ваших примеров тестирования - это последние N столбцов вашей матрицы).

Кроме того, что именно делает условие drop = FALSE?

Это немного защитного кодирования, чтобы гарантировать, что после индексации выполняется операция, возвращаемый объект имеет тот же тип, что и объект, который был проиндексирован.

В R, если вы индексируете только одно измерение 2D (или выше (?)) объекта, вам возвращается объект нижнего измерения. Я не

21
ответ дан 8 December 2019 в 04:53
поделиться

Во-первых, у меня есть много не используется kernlab . Но просто просматривая документацию, я действительно вижу рабочие примеры для метода pred.ksvm () . Копирование и вставка, а также удаление отпечатков на экран:

 ## example using the promotergene data set
 data(promotergene)

 ## create test and training set
 ind <- sample(1:dim(promotergene)[1],20)
 genetrain <- promotergene[-ind, ]
 genetest <- promotergene[ind, ]

 ## train a support vector machine
 gene <-  ksvm(Class~.,data=genetrain,kernel="rbfdot",\
               kpar=list(sigma=0.015),C=70,cross=4,prob.model=TRUE)

 ## predict gene type probabilities on the test set
 genetype <- predict(gene,genetest,type="probabilities")

Это кажется довольно простым: используйте случайную выборку для создания обучающего набора genetrain и его дополнения genetest , затем подгоните через ksvm и вызов метода pred () с использованием подгонки и новых данных в соответствующем формате. Это очень стандартно.

Вам может пригодиться пакет caret от Макса Куна.

2
ответ дан 8 December 2019 в 04:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: