Серия алгоритмов машинного обучения (2) — Карманный алгоритм

машинное обучение
Серия алгоритмов машинного обучения (2) — Карманный алгоритм

Базовые знания, необходимые для прочтения этой статьи: алгоритм обучения персептрона, немного знаний в области программирования.

Введение

   В предыдущем разделе мы изучили серию алгоритмов машинного обучения (1) — Алгоритм обучения персептрона (PLA), который может идеально разделить набор данных на два типа, но есть предварительное условие, что набор данных предполагается линейно разделимым.
В процессе собственно сбора данных могут быть разные причины (например, на примере антиспама неправильно собраны почтовые слова или неверна ручная классификация, а неспам принимается за спам). данных, то набор данных может быть не линейно разделим, и алгоритм обучения персептрона не имеет возможности остановиться, поэтому люди разработали алгоритм, основанный на алгоритме обучения персептрона, который может иметь дело с линейной неразделимостью — Карманный алгоритм (Pocket Algorithm)

2. Введение в модель

  Карманный алгоритм — это алгоритм бинарной классификации, который делит набор данных на два типа с помощью линейной комбинации. Как показано ниже

0.png

Этот алгоритм является усовершенствованием на основе алгоритма обучения персептрона. Его основная идея такая же, как у алгоритма обучения персептрона. Он также основан на ошибках. Если текущий результат лучше, чем результат в кармане, результат в кармане будет заменен.Для текущего результата лучший результат, наблюдаемый в настоящее время, хранится в кармане, и, наконец, находится относительно хороший ответ, поэтому он называется алгоритмом кармана.

3. Шаги алгоритма

Инициализировать вектор w, например, w инициализируется нулевым вектором
петля т = 0, 1, 2 ...
   найти случайные неверные данные, т. е. h(x) не соответствует целевому значению y

  sign(wtTxn(t))yn(t)\operatorname{sign}\left(w_{t}^{T} x_{n(t)}\right) \neq y_{n(t)}

   Попробуйте исправить вектор w, если ошибочных точек обновленного w меньше, чем w до обновления, то обновить w, иначе войти в следующий цикл.

  wt+1wt+yn(t)xn(t)w_{t+1} \leftarrow w_{t}+y_{n(t)} x_{n(t)}

Выходить из цикла до тех пор, пока не будет достигнуто заданное максимальное количество циклов, а результирующий 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. Демонстрация анимации

Простая классификация обучающих наборов данных:

1.gif

Сложная классификация обучающих наборов данных:

2.gif

6. Интеллект-карта

3.png

7. Ссылки

  1. Это.Wikipedia.org/wiki/%E6%84…
  2. woohoo.course RA.org/learn/NT UML…

Нажмите для полной демонстрацииздесь

Примечание. Эта статья стремится быть точной и легкой для понимания, но поскольку автор также новичок и имеет ограниченный уровень, если в тексте есть ошибки или упущения, я призываю читателей критиковать и исправлять их, оставляя сообщение.
Эта статья была впервые опубликована на -карта ИИ, добро пожаловать, чтобы следовать