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
имеет смысл для обучения ИИ.