Веса из линейной модели SVM (в R)?

Только для добавления, что мы сделали для устранения этой проблемы: Мы обновили до последних драйверов Nvidia, решил проблему. Никакой код не должен был быть переписан.

Для полноты, картой был Nvidia Quadrо NVS 290 с драйверами, датированными мартом 2008 (v. 169). Обновление до последнего (v. 182 датированных февраля 2009) значительно улучшило события краски для всех моих средств управления, специально для DataGridView.

Эта проблема не была замечена ни на каких картах ATI (где разработка происходит).

5
задан Ken Williams 19 December 2009 в 01:32
поделиться

2 ответа

Чтобы получить смещение, просто оцените модель с вектором признаков со всеми нулями. Чтобы получить коэффициент первого признака, оцените модель с вектором признака с «1» в первой позиции и нулями везде, а затем вычтите смещение, которое вы уже знаете. Боюсь, я не знаю синтаксиса R, но концептуально вам нужно что-то вроде этого:

bias = my.model.eval([0, 0, 0])
f1 = my.model.eval([1, 0, 0]) - bias
f2 = my.model.eval([0, 1, 0]) - bias
f3 = my.model.eval([0, 0, 1]) - bias

Чтобы проверить, что вы сделали это правильно, вы можете попробовать что-то вроде этого:

assert(bias + f1 + f2 + f3 == my.model.eval([1, 1, 1]))
7
ответ дан 13 December 2019 в 05:36
поделиться

Если я не ошибаюсь, я думаю, вы спрашиваете, как извлечь вектор W SVM, где W определяется как:

W = \sum_i y_i * \alpha_i * example_i

Ух: не знаю лучшего способа чтобы написать здесь уравнения, но это просто сумма весовых * опорных векторов. После вычисления W вы можете извлечь «вес» для нужной вам функции.

Если это верно, вы должны:

  1. Получить индексы ваших данных, которые являются опорными векторами.
  2. Получить их веса (альфа)
  3. Calculate W

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

my.model <- ksvm(result ~ f1+f2+f3, data=gold, kernel="vanilladot", type="C-svc")
alpha.idxs <- alphaindex(my.model)[[1]]  # Indices of SVs in original data
alphas <- alpha(my.model)[[1]]
y.sv <- gold$result[alpha.idxs]
# for unscaled data
sv.matrix <- as.matrix(gold[alpha.idxs, c('f1', 'f2', 'f3')])
weight.vector <- (y.sv * alphas) %*% sv.matrix
bias <- b(my.model)

kernlab фактически сначала масштабирует ваши данные, прежде чем делать свое дело. Вы можете получить (масштабированные) веса следующим образом (где, я полагаю, смещение должно быть 0 (?))

weight.vector <- (y.sv * alphas) %*% xmatrix(my.model)[[1]]

Если я понял ваш вопрос, это должно дать вам то, что вам нужно.

5
ответ дан 13 December 2019 в 05:36
поделиться
Другие вопросы по тегам:

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