Базовые знания, необходимые для прочтения этой статьи: алгоритм обучения персептрона, немного знаний в области программирования.
Введение
В предыдущем разделе мы изучили серию алгоритмов машинного обучения (1) — Алгоритм обучения персептрона (PLA), который может идеально разделить набор данных на два типа, но есть предварительное условие, что набор данных предполагается линейно разделимым.
В процессе собственно сбора данных могут быть разные причины (например, на примере антиспама неправильно собраны почтовые слова или неверна ручная классификация, а неспам принимается за спам). данных, то набор данных может быть не линейно разделим, и алгоритм обучения персептрона не имеет возможности остановиться, поэтому люди разработали алгоритм, основанный на алгоритме обучения персептрона, который может иметь дело с линейной неразделимостью — Карманный алгоритм (Pocket Algorithm)
2. Введение в модель
Карманный алгоритм — это алгоритм бинарной классификации, который делит набор данных на два типа с помощью линейной комбинации. Как показано ниже
Этот алгоритм является усовершенствованием на основе алгоритма обучения персептрона. Его основная идея такая же, как у алгоритма обучения персептрона. Он также основан на ошибках. Если текущий результат лучше, чем результат в кармане, результат в кармане будет заменен.Для текущего результата лучший результат, наблюдаемый в настоящее время, хранится в кармане, и, наконец, находится относительно хороший ответ, поэтому он называется алгоритмом кармана.
3. Шаги алгоритма
Инициализировать вектор w, например, w инициализируется нулевым вектором
петля т = 0, 1, 2 ...
найти случайные неверные данные, т. е. h(x) не соответствует целевому значению y
Попробуйте исправить вектор w, если ошибочных точек обновленного w меньше, чем w до обновления, то обновить w, иначе войти в следующий цикл.
Выходить из цикла до тех пор, пока не будет достигнуто заданное максимальное количество циклов, а результирующий w будет решением системы уравнений
Как видно из приведенных выше шагов, поскольку мы не знаем, когда цикл должен остановиться, нам нужно определить максимальное количество циклов в качестве условия выхода, поэтому время работы карманного алгоритма будет медленнее, чем у алгоритма. алгоритм обучения персептрона. В цикле точки ошибки выбираются случайным образом, и окончательный результат вывода не является стабильным результатом при каждом его запуске.
В-четвертых, реализация кода
Реализуйте карманный алгоритм на Python:
import numpy as np
def errorIndexes(w, X, y):
"""
获取错误点的下标集合
args:
w - 权重系数
X - 训练数据集
y - 目标标签值
return:
errorIndexes - 错误点的下标集合
"""
errorIndexes = []
# 遍历训练数据集
for index in range(len(X)):
x = X[index]
# 判定是否与目标值不符
if x.dot(w) * y[index] <= 0:
errorIndexes.append(index)
return errorIndexes
def pocket(X, y, iteration, maxIterNoChange = 10):
"""
口袋算法实现
args:
X - 训练数据集
y - 目标标签值
iteration - 最大迭代次数
maxIterNoChange - 在提前停止之前没有提升的迭代次数
return:
w - 权重系数
"""
np.random.seed(42)
# 初始化权重系数
w = np.zeros(X.shape[1])
# 获取错误点的下标集合
errors = errorIndexes(w, X, y)
iterNoChange = 0
# 循环
for i in range(iteration):
iterNoChange = iterNoChange + 1
# 随机获取错误点下标
errorIndex = np.random.randint(0, len(errors))
# 计算临时权重系数
tmpw = w + y[errors[errorIndex]] * X[errorIndex]
# 获取临时权重系数下错误点的下标集合
tmpErrors = errorIndexes(tmpw, X, y)
# 如果错误点数量更少,就更新权重系数
if len(errors) >= len(tmpErrors):
iterNoChange = 0
# 修正权重系数
w = tmpw
errors = tmpErrors
# 提前停止
if iterNoChange >= maxIterNoChange:
break
return w
5. Демонстрация анимации
Простая классификация обучающих наборов данных:
Сложная классификация обучающих наборов данных:
6. Интеллект-карта
7. Ссылки
Нажмите для полной демонстрацииздесь
Примечание. Эта статья стремится быть точной и легкой для понимания, но поскольку автор также новичок и имеет ограниченный уровень, если в тексте есть ошибки или упущения, я призываю читателей критиковать и исправлять их, оставляя сообщение.
Эта статья была впервые опубликована на -карта ИИ, добро пожаловать, чтобы следовать