es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

CVXPY, optimización de mínimos cuadrados, formulación incorrecta de restricciones.

En primer lugar, lamento si mis preguntas no tienen sentido, soy nuevo usando la biblioteca CVXPY y no entiendo todo :/

Estoy tratando de resolver un problema de minimización que pensé que sería fácil de manejar.
Tengo una matriz S de dimensiones (9,7) con coeficientes conocidos, B de dimensiones (1,7) con coeficientes conocidos, Alpha de dimensiones (1,7) que necesito encontrar, con varias restricciones:

  • Alpha debe ser positivo
  • La suma de todos los coeficientes de Alpha debe ser igual a 1

Necesito optimizar Alpha de tal manera que: A @ Alpha-B=0.
Descubrí CVXPY y pensé que la optimización de cuadrados mínimos era perfecta para este problema.

Este es el código que escribí:

Alpha = cp.Variable(7)
objective = cp.Minimize(cp.sum_squares(S @ Alpha - B))
constraints = [0 <= Alpha, Alpha <= 1, np.sum(Alpha.value) == 1]
prob = cp.Problem(objective, constraints)
result = prob.solve()
print(Alpha.value)

con

S= np.array([[0.03,0.02,0.072,0.051,0.058,0.0495,0.021 ],
 [0.0295, 0.025 , 0.1  ,  0.045 , 0.064 , 0.055 , 0.032 ],
 [0.02  , 0.018 , 0.16  , 0.032 , 0.054 , 0.064 , 0.025 ],
 [0.0195, 0.03  , 0.144 , 0.027 , 0.04  , 0.06  , 0.04  ],
 [0.02  , 0.0315, 0.156 , 0.0295 ,0.027 , 0.0615 ,0.05  ],
 [0.021 , 0.033 , 0.168 , 0.03  , 0.0265 ,0.063 , 0.09  ],
 [0.02  , 0.05  , 0.28  , 0.039 , 0.035 , 0.055 , 0.04  ],
 [0.021 , 0.03 ,  0.22  , 0.0305, 0.0255, 0.057 , 0.009 ],
 [0.0195, 0.008 , 0.2 ,   0.021 , 0.01 ,  0.048 , 0.0495]])
B=np.array([0.1015, 0.0888, 0.0911, 0.0901, 0.0945, 0.0909, 0.078 , 0.0913, 0.0845])

Mi problema es el siguiente:

  • Sin la restricción np.sum(Alpha.value)==1, el código me devuelve resultados; pero cuando agrego la restricción me devuelve None.

Presumo que la formulación no es correcta, pero no tengo idea de cómo escribirla de otra manera.
¿O tal vez el problema no tiene solución?
Gracias por tu tiempo.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Es posible que el problema no sea factible con las restricciones proporcionadas. En este caso, CVXPY devolverá “None” como valor óptimo. Para comprobar si el problema es factible, puedes utilizar los métodos prob.is_dcp() y prob.is_dcp_atom() para asegurarte de que el problema es convexo, y el método prob.is_feasible() para comprobar la factibilidad.

    Adicionalmente, en lugar de utilizar np.sum(Alpha.value)==1 como restricción, puedes utilizar cp.sum(Alpha)==1. Esto asegura que la suma de los valores de Alpha sea igual a 1, en lugar de la suma de sus valores después de que el solucionador haya devuelto una solución.

    Aquí está el código actualizado con estos cambios:

    Alpha = cp.Variable(7)
    objective = cp.Minimize(cp.sum_squares(S @ Alpha - B))
    constraints = [0 <= Alpha, Alpha <= 1, cp.sum(Alpha) == 1]
    
    prob = cp.Problem(objective, constraints)
    
    if prob.is_dcp() and prob.is_dcp_atom():
        if prob.is_feasible():
            result = prob.solve()
            print(Alpha.value)
    else:
        print("El problema no es DCP.")
    

    Esto verificará que el problema sea convexo y factible antes de intentar resolverlo. Si el problema no es factible, puede ser necesario relajar las restricciones o ajustar la función objetivo para que el problema sea factible.

Comments are closed.