SVM, использующая функцию потери шарнира для максимизации запаса с градиентным спуском, не сходится

Я реализую SVM и, чтобы найти наибольшую прибыль, я использую функцию стоимости потерь шарнира, подобную этой, из этой статьи , но я реализую ее сам. До сих пор я придумал это, которое дает нечетные значения при прогнозировании на основе моего набора данных, который действительно линейно разделим (мой x_train — это 2D-массив, а y_train — это 1D-массив с двоичным разделением на -1 или 1)

      def SVM(x_train, y_train, w="RANDOM", epochs=1000000, learning_rate=0.00001):
    if w == "RANDOM":
        w = []
        for i in range(len(x_train[0])):
            w.append(random.random())
        w = np.array(w)

    for i in range(epochs):
        y_pred = w.dot(x_train[0])
        prod = y_pred * y_train

        l = 0
        for val in prod:
            if val >= -1:
                for n in range(len(w)):
                    w[n] = w[n] - learning_rate * 2 * 1/epochs * w[n]
            else:
                for n in range(len(w)):
                    w[n] = w[n] + learning_rate * (y_train[l] * x_train[l][n] - 2 * 1/epochs * w[n])
            l += 1
    return w


def cost_function(y, y_pred):
    return 1 - y * y_pred

Я подозреваю, что моя проблема заключается в прогнозировании, а не в коррекции, поскольку я думаю, что достаточно хорошо понял градиентный спуск, чтобы реализовать его.prod = y_pred * y_train— это часть, которую вы вычитаете из 1 в функции стоимости без мягкой маржи, но почему нам нужно перебирать ее элементы? Это то, что статья делает в своем коде. Кроме того, я не уверен, можно ли прогнозировать y на основе только одного элемента изx_trainимеет смысл для обучения ИИ.

0 ответов

Другие вопросы по тегам