Как сделать линейно отделимую двоичную классификацию?
Я хочу решить следующую задачу оптимизации -
Функция стоимости: 1/2 || W || ^ 2
Подлежит: Y_i (w.X_i - b)> = 1
куда X
матрица 700x3, Y
вектор хранит метку классов для этих экземпляров (оценивается как 1/-1) и w.X_i
является точечным произведением w
а также X_i
,
Я использую CVX -
cvx_begin
variable W(3);
variable B;
minimize (0.5*W'*W)
subject to
Y'*(X*W - B) >= 1;
cvx_end
тогда я планирую, w1.x1 + w2.x2 - b
которая, кажется, не разделяет гиперплоскость?
Что я делаю не так?
1 ответ
Короче говоря: когда вы делаете w1.x1 + w2.x2 - b
Вы пытаетесь указать гиперплоскость в определенном месте, что также совпадает с указанием конкретной точки на векторе. Чтобы сделать что-либо в трехмерном пространстве, вам нужно использовать все три измерения, поэтому: w1.x1 + w2.x2 +w3.x3 - b
Более подробно: при выполнении линейной классификации, подобной этой, задачу можно рассматривать двумя способами:
Нахождение разделяющей гиперплоскости таким образом, чтобы все выборки одного класса находились на одной стороне, а все выборки другого класса - на другой стороне.
Нахождение проекции многомерного пространства, в котором находятся образцы, в одну размерную линию, так что на линии есть точка, которая четко разделяет их.
Это идентичные задачи, так как одно измерение в 2, по сути, определяет, как далеко каждый образец находится от разделяющей гиперплоскости (и на какой стороне находится указанный образец). Я считаю, что это помогает помнить обе эти точки зрения, особенно потому, что разделяющая гиперплоскость - это плоскость, ортогональная одномерному вектору.
Итак, в случае, если вы имеете дело, вектор веса w
предоставленная модель используется для проецирования образцов в матрицу X
на одну размерную линию и смещение b
указывает, в какой точке вдоль этого вектора возникает разделяющая гиперплоскость. Вычитая b
из проецируемых значений они сдвигаются так, что эта гиперплоскость является той, которая ортогональна линии в точке 0, что обеспечивает простое пороговое значение.