Метод улучшения интеллектуального алгоритма

машинное обучение искусственный интеллект глубокое обучение Java
Метод улучшения интеллектуального алгоритма

Метод подъема

Основная идея метода повышения состоит в том, чтобы объединить несколько классификаторов (слабых классификаторов) с очень общими эффектами для получения лучшего классификатора, что похоже на «три сапожника победили Чжугэ Ляна». Эффект обучения слабых учеников может быть лишь немного лучше, чем у случайных классификаторов, поэтому некоторые люди предлагают использовать набор слабых классификаторов для создания сильного классификатора.

Поскольку слабый классификатор повышается до сильного классификатора, он называется методом подъема.

这里写图片描述

AdaBoost

Существует множество алгоритмов повышения, наиболее типичным из которых является AdaBoost. AdaBoost - это аббревиатура адаптивного повышения, Основная идея состоит в том, чтобы увеличить вес образцов, которые были неправильно классифицированы слабой классификацией в предыдущем раунде, и в то же время уменьшить вес правильно классифицированных образцов, чтобы неправильные образцы могут привлечь больше внимания в следующем раунде. Кроме того, конечный классификатор AdaBoost представляет собой линейную комбинацию нескольких слабых классификаторов, а линейный коэффициент — это вес каждого слабого классификатора, наоборот, вес с большей частотой ошибок должен быть меньше.

Основные шаги AdaBoost

  1. набор образцовT=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N) \},y\in\{+1,-1\}.
  2. Инициализируйте вес для каждой выборки в наборе выборочных данных,D_1 = (w_{11},w_{12},...,w_{1N}),w_{1i}=\frac{1}{N},i=1,2,..,N.
  3. Предположим, что всего имеется M классификаторов,G_m, \quad 1,2,...,M.
  4. Обучите первый классификатор, используя данные набора обучающей выборки и его начальные веса.G_1.
  5. Рассчитайте частоту ошибок первого классификатора,e_1=P(G_1(x_i)\neq y_i)=\sum _{i=1}^N w_{1i}I(G_1(x_i)\neq y_i).
  6. Рассчитайте вес, присвоенный первым классификатором, на основе частоты ошибок на предыдущем шаге,\alpha_1=\frac{1}{2}\ln (\frac{1-e_1}{e_1}).
  7. Вес добавляется к неправильно классифицированному образцу первым классификатором, а вес правильного образца уменьшается.Формула обновления удельного веса:D_2=(w_{21},w_{22},..,w_{2i},..,w_{2N})w_{2i}=\frac{w_{1i}}{Z_1}\exp(-\alpha _1 y_i G_1(x_i)),\quad i = 1,2,...,N,ТотZ_1=\sum _{i=1}^Nw_{1i}\exp(-\alpha _1 y_i G_1(x_i)).
  8. Продолжайте обучать второй классификатор с новыми весами выборки.G_2, а затем вычислить частоту ошибок второго классификатораe_2и веса, присвоенные вторым классификатором\alpha_2, и продолжайте обновлять веса, чтобы получитьD_3.
  9. Повторяйте вышеуказанные операции до тех пор, пока частота ошибок классификатора не станет равной 0 или не будет достигнуто заданное количество итераций.
  10. Взвешенное суммирование всех слабых классификаторов, т.е. линейная комбинация,f(x)=\sum_{m=1}^M \alpha _mG_m(x), окончательный классификаторG(x)=sign(f(x)).

О слабых классификаторах

Не существует определенного стандарта для слабого классификатора adaboost.Пока классификатор, который может достичь классификации, может использоваться как слабый классификатор, общие могут быть следующими:

  • логистическая регрессия
  • простая нейронная сеть
  • SVM

Слабые классификаторы adaboost должны быть одним и тем же классификатором и не могут использовать разные классификаторы.

О весах

В процессе adaboost задействованы два типа весов: один — это вес выборки, а другой — вес слабого классификатора. Вес выборки используется для обозначения веса каждой выборки.Отмеченная выборка имеет разное значение в обучении, и сумма всех весов ее выборок равна 1. Вес слабого классификатора используется для обозначения веса каждого классификатора Фактически это коэффициент линейной комбинации конечного классификатора, указывающий вклад каждого слабого классификатора в результат Сумма весов слабых классификаторов не обязательно 1. .

github

https://github.com/sea-boat/MachineLearning_Lab

demo

import numpy as np

def weak_model(data, Dt):
    m = data.shape[0]
    pred = []
    pos = None
    mark = None
    min_err = np.inf
    for j in range(m):
        pred_temp = []
        sub_mark = None
        lsum = np.sum(data[:j, 1])
        rsum = np.sum(data[j:, 1])
        if lsum < rsum:
            sub_mark = -1
            pred_temp.extend([-1.] * (j))
            pred_temp.extend([1.] * (m - j))
        else:
            sub_mark = 1
            pred_temp.extend([1.] * (j))
            pred_temp.extend([-1.] * (m - j))
        err = np.sum(1 * (data[:, 1] != pred_temp) * Dt)
        if err < min_err:
            min_err = err
            pos = (data[:, 0][j - 1] + data[:, 0][j]) / 2
            mark = sub_mark
            pred = pred_temp[:]
    model = [pos, mark, min_err]
    return model, pred


def adaboost(data):
    models = []
    N = data.shape[0]
    D = np.zeros(N) + 1.0 / N
    M = 3
    y = data[:, -1]
    for t in range(M):
        Dt = D[:]
        model, y_ = weak_model(data, Dt)
        errt = model[-1]
        alpha = 0.5 * np.log((1 - errt) / errt)
        Zt = np.sum([Dt[i] * np.exp(-alpha * y[i] * y_[i]) for i in range(N)])
        D = np.array([Dt[i] * np.exp(-alpha * y[i] * y_[i]) for i in range(N)]) / Zt
        models.append([model, alpha])
    return models


def predict(models, X):
    pred = []
    for x in X:
        result = 0
        for base in models:
            alpha = base[1]
            if x[0] > base[0][0]:
                result -= base[0][1] * alpha
            else:
                result += base[0][1] * alpha
        pred.append(np.sign(result))
    return pred


if __name__ == "__main__":
    data = np.array([[0, 1], [1, 1], [2, 1], [3, -1], [4, -1], [5, -1], [6, 1], [7, 1], [8, 1], [9, -1]],
                    dtype=np.float32)
    models = adaboost(data)
    X = data
    Y = data[:, -1]
    Y_ = predict(models, X)
    acc = np.sum(1 * (Y == Y_)) / float(len(X))
    print(acc)

------------- Рекомендуем прочитать ------------

Резюме моей статьи за 2017 год — машинное обучение

Краткое изложение моих статей за 2017 год — Java и промежуточное ПО

Резюме моих статей 2017 года — глубокое обучение

Краткое изложение моих статей за 2017 год — исходный код JDK

Резюме моей статьи за 2017 год — обработка естественного языка

Резюме моих статей 2017 года — Java Concurrency

------------------рекламное время----------------

Поговори со мной, задай мне вопросы:

这里写图片描述

Меню официальной учетной записи было разделено на «Распределенное», «Машинное обучение», «Глубокое обучение», «НЛП», «Глубина Java», «Ядро параллелизма Java», «Исходный код JDK», «Ядро Tomcat», и т.д. Там может быть один стиль, чтобы удовлетворить ваш аппетит.

Зачем писать «Анализ проектирования ядра Tomcat»

Добро пожаловать, чтобы следовать:

这里写图片描述