Содержание
Реализация бинарного классификатора опорных векторов с ядром с мягким полем и квадратичным программированием в R и Python
В этой статье будут обсуждаться несколько реализаций бинарного классификатора на основе опорных векторов с библиотеками квадратичного программирования (в R и Python соответственно) и приложение к нескольким наборам данных. Для реализации очень пригодились следующие видео-лекции/уроки/ссылки:
- это из курса искусственного интеллекта MIT
- это из курса Berkeley L&DM
- это из курса UCF CV
- это из курса NPTEL/IITKGP ML
- этот и этот с сайта pythonprogramming.net
- этот на CVXOPT от MIT
- этот репозиторий с github
- это от python CVXOPT
- это от R quadprog
Следующий рисунок, взятый отсюда, описывает основы Soft-Margin SVM (без ядер).
SVM в двух словах
- Дан (обучающий) набор данных, состоящий из положительных и отрицательных экземпляров класса.
- Цель состоит в том, чтобы найти классификатор с максимальным запасом с точки зрения гиперплоскости (векторы w и b ), который разделяет положительные и отрицательные экземпляры (в обучающем наборе данных).
- Если набор данных зашумлен (с некоторым перекрытием в положительных и отрицательных выборках), будет некоторая ошибка в их классификации с помощью гиперплоскости.
- В последнем случае цель будет состоять в том, чтобы свести к минимуму ошибки в классификации наряду с максимальным запасом, и проблема станет SVM с мягким запасом (в отличие от SVM с жестким запасом без переменных запаса).
- Введена переменная резерва для каждой точки обучения, чтобы включить в цель ошибки классификации (для точек с пропущенной классификацией в наборе обучающих данных), это также можно рассматривать как добавление регуляризации.
- Проблема оптимизации квадратичный по своей природе, так как он имеет квадратичную цель с линейными ограничениями.
- Легче решить задачу оптимизации в двойном , чем в первичном пространстве , так как меньше переменных.
- Следовательно, задача оптимизации часто решается в -двойственном -пространстве путем преобразования -минимизации в -максимизирующую задачу (имея в виду теорему о слабой/сильной двойственности и дополнительные условия нежесткости ), сначала построив лагранжиан , а затем используя условия ККТ для седловой точки .
- Если набор данных не является линейно разделимым , используется трюк ядра для концептуального сопоставления точек данных с некоторыми более высокими размерностями только путем вычисления (ядро) граммовой матрицы / скалярного произведения точек данных (матрица должна к положительно полуопределенной согласно теореме Мерсера ).
- Некоторые популярные функции ядра — это линейное , полиномиальное , Гауссово ( RBF , соответствующее бесконечномерному пространству ) ядра.
- Задача двойной оптимизации решена (со стандартными квадратичными пакетами программирования ), и решение найдено с точки зрения нескольких опорных векторов (определяющих линейную/нелинейную границу решения, SV соответствуют ненулевым значения двойственной переменной / первичного множителя Лагранжа), отсюда и название SVM.
- После решения задачи оптимизации Dual значения основных переменных вычисляются для построения гиперплоскости/поверхности решений.
- Наконец, двойные и первичные переменные (оптимальные значения, полученные из решений) используются в сочетании с предсказанием класса новой (невидимой) точки данных.
- Гиперпараметры (например, C ) можно настроить для соответствия различным моделям и выбрать наиболее точную из набора данных (проверки).
На следующем рисунке SVM с мягкой маржой описан более формально.
На следующих рисунках показано, как можно сформулировать задачу SVM двойного квадратичного программирования с помощью решателя QP R quadprog QP (следуя формулировке QP в пакете R quadprog ).
На следующих рисунках показано, как задача двойного квадратичного программирования SVM может быть сформулирована с использованием Python 9.0042 CVXOPT QP-решатель (следуя формулировке QP в библиотеке Python CVXOPT ).
В следующем фрагменте кода R показано, как ядерная модель ( soft/hard-margin ) SVM может быть подобрана путем решения двойной задачи квадратичной оптимизации .
библиотека (quadprog) библиотека (матрица) linear.kernel <- функция (x1, x2) { возврат (x1%*%x2) } svm.fit <- function(X, y, FUN=linear.kernel, C=NULL) { n.samples <- nrow(X) n.features <- ncol(X) # Матрица Грамма K <- матрица (rep (0, n.samples*n. samples), nrow=n.samples) для (i в 1: n.samples) { для (j в 1: n.samples) { K[i,j] <- FUN(X[i,], X[j,]) } } Dmat <- внешний(y,y) * K Dmat <- as.matrix(nearPD(Dmat)$mat) # преобразовать Dmat в ближайшую матрицу pd dvec <- rep(1, n.samples) if (!is.null(C)) { # мягкая маржа Amat <- rbind(y, diag(n.samples), -1*diag(n.samples)) bvec <- c(0, rep(0, n.samples), rep(-C, n.samples)) } else { # жесткие поля Amat <- rbind(y, diag(n.samples)) bvec <- c(0, rep(0, n.samples)) } res <-solve.QP(Dmat,dvec,t(Amat),bvec=bvec, meq=1) a = res$solution # множители Лагранжа # Опорные векторы имеют ненулевые множители Лагранжа # ... }
Следующий фрагмент кода на Python, адаптированный отсюда и из блога Матье Блонделя, , показывает, как модель SVM с ядром (мягкая/жесткая маржа) может быть подобрана путем решения задачи двойной квадратичной оптимизации .
импортировать numpy как np импорт cvxopt def fit(X, y, ядро, C): n_samples, n_features = X. shape # Вычисление матрицы Грама K = np.zeros((n_samples, n_samples)) для i в диапазоне (n_samples): для j в диапазоне (n_samples): K[i,j] = ядро(X[i], X[j]) # построить матрицы P, q, A, b, G, h для CVXOPT P = cvxopt.matrix (np.outer (y, y) * K) q = cvxopt.matrix (np.ones (n_samples) * -1) A = cvxopt.matrix(y, (1,n_samples)) б = cvxopt.matrix (0,0) если C равно None: # SVM с жесткими маржами G = cvxopt.matrix (np.diag (np.ones (n_samples) * -1)) h = cvxopt.matrix (np.zeros (n_samples)) else: # SVM с мягкой маржой G = cvxopt.matrix(np.vstack((np.diag(np.ones(n_samples) * -1), np.identity(n_samples)))) h = cvxopt.matrix(np.hstack((np.zeros(n_samples), np.ones(n_samples) * C))) # решить проблему QP решение = cvxopt.solvers.qp(P, q, G, h, A, b) # Множители Лагранжа a = np.ravel (решение ['x']) # Опорные векторы имеют ненулевые множители Лагранжа sv = a > 1e-5 # какой-то малый порог # . ..
Notes
- Since the objective function for QP is convex if and only if the matrix P ( in python CVXOPT) or Dmat ( in R quadprog) is positive- полуопределенной, необходимо убедиться, что соответствующая матрица для SVM также является PSD.
- Соответствующая матрица вычисляется из матрицы граммов ядра (которая является PSD или неотрицательно определенной по теореме Мерсера) и меток из данных. Из-за численных ошибок часто несколько собственных значений матрицы имеют тенденцию быть очень маленькими отрицательными значениями.
- Хотя python CVXOPT допускает очень небольшие числовые ошибки в матрице P с предупреждающим сообщением, R quardprog будет строго требовать, чтобы матрица Dmat была строго положительно определенной, иначе произойдет сбой.
- Следовательно, с R quadprog матрицу D сначала необходимо преобразовать в положительно определенную матрицу с помощью некоторого алгоритма (особенно в случае, когда она содержит очень маленькие отрицательные собственные значения, что довольно часто, поскольку D исходит из данных).
- Выбирается малый порог (например, 1e-5) для нахождения опорных векторов (соответствующих ненулевым множителям Лагранжа, по условию дополнительной нежесткости).
- Случаи, соответствующие SVM с жесткой и мягкой маржей, должны обрабатываться отдельно, иначе это приведет к несогласованной системе решений.
Использование реализаций SVM для классификации некоторых наборов данных
Наборы данных
Для каждого набора данных 80-20 Проверка набора данных используется для
- Первая подгонка ( поезд ) модели на случайно выбранных 80% выборках набора данных.
- Предсказать ( тест ) на удерживаемых (оставшихся 20%) набора данных и вычислить точность .
- Используются разные значения гиперпараметра C и разные ядра .
- Для ядра полинома используется полином степени 3 и ядро RBF со стандартным отклонением 5 , хотя эти гиперпараметры также можно настраивать.
Результаты
Как видно из приведенных ниже результатов,
- Точки, обведенные синими кружками, являются опорными векторами .
- Когда значение C равно низкому (близкому к SVM с жестким запасом ), обученная модель имеет тенденцию к превышению обучающих данных.
- Когда значение C равно высокому (близкому к SVM с мягкой маржой ), изученная модель имеет тенденцию быть более обобщаемой (C действует как регуляризатор).
- Для определения поверхности решений для SVM с жесткими границами требуется больше опорных векторов, чем для SVM с мягкими границами для нелинейно разделимых наборов данных.
- Линейный (иногда полиномиальный ) ядро довольно плохо работает с наборами данных, которые не являются линейно разделимыми.
- Также показаны границы решений.
With the Python (CVXOPT) implementation
With the R (quadprog) implementation
Вот так:
Нравится Загрузка. ..
Интеллектуальный анализ данных, машинное обучение, оптимизация, Python, R
Ищи:
Copyright © 2016-2022 Сандипан Дей,
MS (CSEE), UMBC
Silvercorp Metals Inc. – Квартальные финансовые и годовые отчеты
Квартальные консолидированные финансовые отчеты
- 2023
- 2022
- 2021
- 2020
- 2019
- 2018
- 2017
Финансовая отчетность 2 квартала — 30 сентября 2022 г. Финансовая отчетность 1 квартала — 30 июня 2022 г. 30 июня 2021 г.
Финансовые отчеты на конец года и четвертый квартал — 31 марта 2021 г. , Финансовая отчетность за 3 квартал 2020 г. - 31 декабря 2019 г.Финансовая отчетность Q2 — 30 сентября 2019 г. Финансовая отчетность Q1 — 30 июня 2019 г.
Финансовая отчетность на конец года и Q4 — 31 марта 2019 г. Финансовая отчетность Q3 — 31 декабря 2018 г. Финансовая отчетность Q2 — 30 сентября 2018 г. Финансовая отчетность Q1 — 30 июня , 2018
Финансовая отчетность на конец года и четвертый квартал - 31 марта 2018 г. 3-й квартал Финансовая отчетность - 31 декабря 2017 г. 2-й финансовый отчет - 30 сентября 2017 г. 1-й квартал Финансовая отчетность - 30 июня 2017 г.
Финансовая отчетность на конец года и 4-й квартал - 31 марта 2017 г. Финансовая отчетность за 3 квартал – 31 декабря 2016 г. Финансовая отчетность за 2 квартал – 30 сентября 2016 г. Финансовая отчетность за 1 квартал – 30 июня 2016 г.
Обсуждение и анализ управления
- 2023
- 2022
- 2021
- 2020
- 2019
- 2018
- 2017
Q2MD&A – 30 сентября 2022 г. Q1MD&A – 30 июня 2022 г.
Конец года и Q4MD&A – 31 марта 2022 г. Q3MD&A – 31 декабря 2021 г.
Конец года и Q4MD&A — 31 марта 2021 г.
Q3MD&A – 31 декабря 2020 г.Q2MD&A – 30 сентября 2020 г.Q1MD&A – 30 июня 2020 г.
Конец года и Q4MD&A — 31 марта 2020 г. Q3MD&A — 31 декабря 2019 г. Q2MD&A — 30 сентября 2019 г. Q1MD&A — 30 июня 2019 г.
Конец года и Q4MD&A — 31 марта 2019 г. Q3MD&A — 31 декабря 2018 г. Q2MD&A — 30 сентября 2018 г. Q1MD&A — 30 июня 2018 г.
Конец года и Q4MD&A — 31 марта 2018 г. Q3MD&A — 31 декабря 2017 г. Q2MD&A — 30 сентября 2017 г. Q1MD&A — 30 июня 2017 г.
7 Год — Конец и Q4MD&A — 31 марта 2017 г. Q3MD&A — 31 декабря 2016 г. Q2MD&A — 30 сентября 2016 г. Q1MD&A — 30 июня 2016 г.
Годовой отчет
- 2022
- 2021
- 2020
- Архив
- 2019
- 2018
- 2017
- 2016
- 2015
- 2014
- 2013
- 2012
- 2011
- 2010
- 2009
- 2008
- 2007
- 2006
Fiscal 2022Annual Information Form Fiscal 2022Form 40-F
Fiscal 2021Annual Information Form Fiscal 2021Form 40-F
Fiscal 2020Annual Information Form Fiscal 2020Form 40-F
Fiscal 2019Annual Information Form Fiscal 2019Form 40-F
Fiscal 2018Annual Information Form 2018 финансовый годФорма 40-F
2017 финансовый годФорма годовой информации 2017 финансовый годФорма 40-F
2016 финансовый годФорма годовой информации 2016 финансовый годФорма 40-F 2016Информационный циркуляр руководства
Годовая информационная форма за 2015 финансовый год
2015 финансовый годФорма 40-F
Циркуляр с информацией для руководства за 2015 г.