Изменения

Перейти к: навигация, поиск

Ядро

2538 байт добавлено, 19:36, 4 сентября 2022
м
rollbackEdits.php mass rollback
Поскольку для задачи линейного разделения объектов не требуется их признаковое описание, а достаточно скаляров, то можно заменить скалярное произведение $\langle x,x'\rangle$ на ядро $K(x,x')$. Более того, можно вообще не строить спрямляющее пространство $H$ в явном виде, и вместо подбора отображения $\varphi$ заниматься непосредственно подбором ядра.
Можно пойти ещё дальше, и вовсе отказаться от признаковых описаний объектов. Во многих практических задачах объекты изначально задаются информацией об их попарном взаимоотношении, например, отношении сходства. Если эта информация допускает представление в виде двуместной функции $K(x,x')$, удовлетворяющей аксиомам скалярного произведения, то задача может решаться методом[[Метод опорных векторов (SVM) | опорных векторов ]]. 
== Преимущества и недостатки ==
а) с сохранением вычислительной эффективности линейных методов.
б) с сохранением преимуществ линейных методов(локальный оптимум является глобальным, нет локальных оптимумов=>меньше переобучение).
* Объекты для которых не существует векторныхпредставлений векторных представлений фиксированной длины.
* Ускоренное вычисление скалярных произведений для высоких значений размерностей.
* Случай, когда сложно представить объекты векторами фиксированной длины.
Такие , как строки, множества, картинки, тексты, графы,3D-структуры и т.д.
* Существование естественного определения скалярного произведения.
Такие , как строки(число совместно встречающихся подстрок) или множества(напр. для множеств $S_1$ и $S_2$ ядром будет являться $K(S_1, S_2) = 2^{|S_1\cap S_2|}$).
* Скалярное произведение может быть подсчитано эффективно.
Таким образом мы видим, что класс ядер достаточно широк.
Проверка неотрицательной определённости функции в реальных задачах может быть сложной. Чаще всего ограничиваются перебором конечного числа функций, про которые известно, что они являются ядрами. Среди них выбирается лучшая (обычно по критерию скользящего контроля). Такое решение не будет оптимальным, и на сегодняшний день проблема выбора ядра, оптимального для данной конкретной задачи, остаётся открытой, лучшие из известных на данный момент решений основываются на генетических алгоритмах<ref>[https://www.researchgate.net/publication/221080223_An_Evolutionary_Approach_to_Automatic_Kernel_Construction - T.Howley, M.G.Madden — An Evolutionary Approach to Automatic Kernel Construction]</ref>.
== Конструктивные способы построения ядер ==
0. '''Линейное''' (англ. linear) $K(x, x')= \langle x, x'\rangle$
 
Используется в алгоритме [[Метод опорных векторов (SVM) | SVM ]] по умолчанию.
1. '''Полиномиальное''' (англ. polynomial) $K(x, x') = (\langle x, x' \rangle + R)^d$<ref>https://en.wikipedia.org/wiki/Polynomial_kernel - Polynomial kernel</ref>
Используется когда необходимо получить полином $p(y)$, где в качестве $y$ выступает скалярное произведение $\langle x, x' \rangle$. Поскольку в конструктивных возможностях у нас есть умножение ядер, умножение на коэффициент и сложение, то любой многочлен так же является ядром.
2. '''Гаусово''' (англ. gaussian) ядро RBF (Radial basis function)<ref>[https://en.wikipedia.org/wiki/Radial_basis_function_kernel - RBF]</ref> $K(x, x') = exp(-\frac{\parallel x - x'\parallel^2}{2\sigma^2})$
Такое ядро соответсвует соответствует бесконечномерному пространству. Поскольку оно является пределом последовательности полиномиальных ядер при стремлении степени ядра к бесконечности.
3. '''Сигмоидальное''' (англ. sigmoid) ядро $tangh (\gamma \langle x, x'\rangle + r)$
В отличии отличие от предыдущих 3-х не является ядром Мерсера(не выполняет условие теоремы), но при этом на практике работает хорошо.
4. '''Строковое'''
Строковые ядра <ref>[https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D0%BE%D0%BA%D0%BE%D0%B2%D0%BE%D0%B5_%D1%8F%D0%B4%D1%80%D0%BE#%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5 - Строковое ядро]</ref> это различные ядерные функции для вычисления расстояний между двумя строками.
 
 
== Использование ядер в коде ==
 
В библиотеке языка Python {{---}} sklearn.clustering<ref>https://scikit-learn.org/stable/modules/classes.html#module-sklearn.cluster - sklearn.cluster</ref>, есть функции и классы которые используют ядра для кластеризации, например SVM(Support vector machines).
 
* Подключаем библиотеки:
'''import''' svm model
'''from''' sklearn '''import''' svm
 
* Создаём классификатор svm {{---}} Classifier. В данном случае используется линейное ядро. Так же можно использовать 'polynomial' и 'rbf' [[Ядро#Некоторые часто используемые ядра|(см. используемые ядра)]].
 
clf = svm.SVC(kernel='linear')
 
*Тренируем модель используя заданные сеты и смотрим на предсказанные ответы:
clf.'''fit'''(X_train, y_train)
y_pred = clf.'''predict'''(X_test)
 
Кроме того, у этой функции так же присутствует гипперпараметры {{---}} '''регуляризация''' (англ. regularization), который отвечает за размер штрафа и гамма, которая отвечает за приближенность результирующей функций к датасету. Здесь нужно помнить, что при больших значениях гамма возможно [[Переобучение|переобучение]].
== См. также ==
* [[Метод опорных векторов (SVM)]]
* [[Линейная регрессия]]
* [[Логистическая регрессия]]
* [[Регуляризация]]
== Примечания ==
#[https://ru.wikipedia.org/wiki/%D0%AF%D0%B4%D0%B5%D1%80%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4#%D0%9C%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0:_%D1%8F%D0%B4%D0%B5%D1%80%D0%BD%D1%8B%D0%B9_%D1%82%D1%80%D1%8E%D0%BA wikipedia.org — Ядерный метод]
#[http://www.machinelearning.ru/wiki/images/7/78/Kitov-ML-09-Kernel_methods.pdf www.machinelearning.ru — Виктор Китов Ядерные методы]
#[https://www.datacamp.com/community/tutorials/svm-classification-scikit-learn-python#kernels datacamp.com — Support Vector Machines with Scikit-learn]
[[Категория: Машинное обучение]]
[[Категория: Классификация]]
[[Категория: Регрессия]]
1632
правки

Навигация