Можно установить СОБЫТИЕ в файле параметра (простой текст или spfile), чтобы вынудить Oracle вывести подробный файл трассировки в user_dump_dest, имя объекта могло бы быть там, если не SQL должен быть.
СОБЫТИЕ = "942 имени трассировки errorstack уровень 12"
при использовании файла простого текста необходимо сохранить все настройки EVENT на последовательных строках. Не уверенный, как это относилось к spfile.
Если вы думаете о том, как машина опорных векторов могла бы " используйте матрицу ядра, вы увидите, что вы не можете сделать это так, как вы пытаетесь (как вы видели: -)
Я действительно немного боролся с этим, когда впервые использовал 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)
С этого момента я собираюсь:
trainK
из исходной матрицы ядра K
. trainK
testK
... это странная часть. Если вы посмотрите на код в kernlab
, чтобы увидеть, как он использует индексы опорных векторов, вы поймете, почему это делается именно так. Можно было бы сделать это другим способом, но я не видел никакой документации / примеров по прогнозированию с помощью матрицы ядра, так что я делаю это здесь "трудным путем". Вот код:
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 (или выше (?)) объекта, вам возвращается объект нижнего измерения. Я не
Во-первых, у меня есть много не используется 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 от Макса Куна.