2017-02-17 5 views
0

Мне нужно ограничить мою потерю, чтобы предсказание всегда было положительным. Так у меня есть:scipy минимизировать функцию ограничения неравенства

x = [1.0,0.64,0.36,0.3,0.2] 
y = [1.0,0.5,0.4,-0.1,-0.2] 
alpha = 0 

def loss(w, x, y, alpha): 
    loss = 0.0 
    for y_i,x_i in zip(y,x): 
     loss += ((y_i - np.dot(w,x_i)) ** 2) 
    return loss + alpha * math.sqrt(np.dot(w,w)) 

res = minimize(loss_new_scipy, 0.0, args=(x, y, alpha)) 

Теперь я хочу, чтобы добавить ограничения, но я нашел в основном ограничения, что х находится между границами, а не np.dot(w,x)>= 0 Как бы такое ограничение выглядит?

EDIT: Я хочу использовать параметр ограничения в функции scipy.optimize.minimize, так что я думаю, что это должно выглядеть как-то так:

def con(w,x): 
    loss = 0.0 
    for i_x in x: 
     loss += (np.dot(w, i_x)) 
    return loss 


cons = ({'type': 'ineq', 'fun': con}) 
res = minimize(loss_new_scipy, 0.0, args=(x, y, alpha), constraints=cons) 

также я снял второе ограничение для простоты

EDIT2: Я изменил свою проблему на следующее: ограничение w * x должно быть больше 1, а также изменить цели на все негативы. Я также изменил арг, поэтому он работает в настоящее время:

x = np.array([1.0,0.64,0.36,0.3,0.2]) 
y = [-1.0,-0.5,-0.4,-0.1,-0.2] 
alpha = 0 

def con(w,x,y,alpha): 
    print np.array(w*x) 
    return np.array((w*x)-1).sum() 


cons = ({'type': 'ineq', 'fun': con,'args':(x,y,alpha)}) 

def loss_new_scipy(w, x, y, alpha): 
    loss = 0.0 
    for y_i,x_i in zip(y,x): 
     loss += ((y_i - np.dot(w,x_i)) ** 2) 
    return loss + alpha * math.sqrt(np.dot(w,w)) 

res = minimize(loss_new_scipy, np.array([1.0]), args=(x, y, alpha),constraints=cons) 
print res 

Но, к сожалению, результат для W 2.0, который на самом деле является положительным и выглядит как ограничение помогло, так как он находится далеко от установки функции для целей , но предсказания ш * й не все выше 1,0

EDIT3: я просто поняли, что сумма моих предсказаний - 1 равно 0, но я хочу, чтобы каждое предсказание должно быть больше 1,0 Так с ш = 2,0,

w*x = [ 2.00000001 1.28000001 0.72  0.6   0.4  ] 

и

(w*x) - 1 = [ 1.00000001 0.28000001 -0.28  -0.4  -0.6  ] 

, сумма которых равна 0,0, но я хочу, чтобы все предсказания w*x быть больше, чем 1,0, так что все 5 значений в w*x должно быть не менее 1,0

ответ

1

Если я правильно понял ваш edit2 правильно, вы пытаетесь свести к минимуму |y - w*x|^2 как функции действительного параметра w (где x и y векторы) с ограничением, что w*x имеет все компоненты больше 1.

сейчас , выражение |y - w*x|^2 квадратично в w, поэтому он имеет четко определенный глобальный минимум (коэффициент перед w^2 положителен). Однако ограничение на компоненты w*x эффективно налагает минимально допустимое значение w (поскольку фиксируется x), что в данном случае 5. Поскольку глобальный минимум (без ограничений) квадратической функции |y - w*x|^2 для вашего конкретного случая вокруг np.dot(y,x)/np.dot(x,x)=-0.919, функция монотонно возрастает при w>=5, таким образом, значение 5 представляет собой ограниченный минимум ...

Чтобы получить этот ответ с вашим кода, нужно исправить ограничение. В вашем случае вы суммируете все компоненты w*x, сдвинутые на 1. Здесь, однако, может случиться, что один конкретный компонент намного больше 1, и поэтому его вклад в сумму может маскировать другие компоненты, которые только немного меньше 1 (например, если x=[2, 0.25], w=2, то w*x-1=[3,-0.5], и сумма поэтому положительна, даже если ограничение нарушено).Чтобы исправить это, можно было бы суммировать только те компоненты w*x-1, которые являются отрицательными, то есть те, которые нарушают ограничение:

def con(w,x,y,alpha): 
    return np.minimum(w*x - 1, 0).sum()