CVXPY: Eine Einführung in die konvexe Optimierung mit CVXPY in Python mit einfachen Beispielen 👓 | von Manoj Das | Juni 2023

0
135


Was ist die CVXPY-Bibliothek? Wie führt man eine Covex-Optimierung mit CVXPY in Python durch? Einfaches Beispiel für konvexe Optimierung mit CVXPY.

Foto von Kuu Akura An Unsplash

CVXPY ist eine Python-Bibliothek zur konvexen Optimierung. Es bietet eine einfache und intuitive Möglichkeit, konvexe Optimierungsprobleme zu formulieren und zu lösen. Die konvexe Optimierung ist ein Teilgebiet der mathematischen Optimierung, das sich mit der Optimierung konvexer Zielfunktionen über konvexe Mengen von Variablen befasst.

Das Hauptziel von CVXPY besteht darin, den Prozess der Lösung konvexer Optimierungsprobleme für Benutzer zugänglicher zu machen. Es bietet eine hochentwickelte Modellierungssprache, mit der Sie Optimierungsprobleme auf natürliche und mathematische Weise ausdrücken können. CVXPY kümmert sich dann um die zugrunde liegenden mathematischen Transformationen und Solver-Interaktionen, die zum Finden der optimalen Lösung erforderlich sind.

CVXPY ist in der Tat ein Gemeinschaftsprojekt, das von einem Group aus Forschern und Ingenieuren entwickelt und gepflegt wird. Es wurde im Laufe der Jahre durch die Beiträge verschiedener Personen geprägt. Zu den wichtigsten Mitwirkenden von CVXPY gehören Steven Diamond, Akshay Agrawal, Riley Murray, Philipp Schiele und Bartolomeo Stellato. Es gab jedoch auch viele andere, die bedeutende Beiträge geleistet haben, wie Stephen Boyd, Eric Chu, Robin Verschueren, Jaehyun Park, Enzo Busseti, AJ Pal, Judson Wilson, Chris Dembia und Philipp Schiele.

CVXPY fördert das Engagement der Gemeinschaft und freut sich über alle Beiträge. Wenn Sie daran interessiert sind, sich zu engagieren, können Sie sich den CVXPY-Beitragsleitfaden ansehen und der Group auf Discord beitreten.

Im Hinblick auf die jüngsten Updates wurde mit CVXPY 1.3 die Choice für Benutzer eingeführt, verschiedene Kanonisierungs-Backends anzugeben, was die Kanonisierungszeit erheblich verkürzen kann. Sie fügten ein zweites Backend hinzu, das auf dem SciPy-Sparse-Modul basiert. Weitere Informationen zu diesen neuen Backends finden Sie im Abschnitt „Kanonisierungs-Backends“. Darüber hinaus ist CVXPYgen verfügbar, ein ergänzender Codegenerierungsansatz. Seit der Veröffentlichung von CVXPY 1.3 folgt das Projekt der semantischen Versionierung, bei der alles, was aus dem cvxpy-Namespace importierbar ist, als Teil der öffentlichen API betrachtet wird.

Mehrere Schlüsselfunktionen machen es zu einem leistungsstarken Werkzeug zum Formulieren und Lösen von Optimierungsproblemen. Hier sind einige der wichtigsten Funktionen von CVXPY:

Intuitive Modellierung

CVXPY bietet eine Excessive-Stage-Modellierungssprache, die es Benutzern ermöglicht, Optimierungsprobleme auf natürliche und intuitive Weise auszudrücken. Die Syntax ähnelt stark der mathematischen Notation, die zur Beschreibung von Optimierungsproblemen verwendet wird, und erleichtert so die Formulierung von Problembeschränkungen und -zielen.

Vielseitige Optimierungsprobleme

CVXPY unterstützt eine breite Palette konvexer Optimierungsprobleme, einschließlich linearer Programmierung, quadratischer Programmierung, geometrischer Programmierung, semidefiniter Programmierung und mehr. Es bietet eine einheitliche Schnittstelle zum Formulieren und Lösen dieser Probleme und erleichtert so die Arbeit mit verschiedenen Optimierungsbereichen.

Automatische Transformation

CVXPY wandelt die Excessive-Stage-Problemformulierung automatisch in eine mathematische Darstellung um, die durch effiziente konvexe Optimierungslöser gelöst werden kann. Benutzer müssen sich nicht um die zugrunde liegenden mathematischen Transformationen kümmern; CVXPY geht clear damit um.

Mehrere Löser

CVXPY unterstützt verschiedene Löser, sodass Benutzer den für ihr Drawback am besten geeigneten auswählen können. Es lässt sich in gängige Solver wie ECOS, SCS, CVXOPT und viele mehr integrieren. Benutzer können problemlos zwischen verschiedenen Lösern wechseln, ohne ihren Problemformulierungscode ändern zu müssen.

Duale Variablen und Sensitivitätsanalyse

CVXPY bietet Zugriff auf duale Variablen (Lagrange-Multiplikatoren), die mit Einschränkungen verknüpft sind, und ermöglicht so eine Sensitivitätsanalyse und die Untersuchung der Auswirkungen von Einschränkungsänderungen auf die Lösung. Diese Informationen können hilfreich sein, um die Empfindlichkeit des Issues gegenüber Störungen zu verstehen.

Einschränkungszusammensetzung

Mit CVXPY können Benutzer komplexe Einschränkungen mithilfe von Standardarithmetikoperationen, logischen Operatoren und Sonderfunktionen erstellen. Dies macht es einfach, komplexe Einschränkungen auszudrücken, die mehrere Variablen und Bedingungen umfassen.

Mathematische Ausdrücke und Funktionen

CVXPY unterstützt mathematische Ausdrücke mit Variablen, Konstanten und Funktionen. Benutzer können standardmäßige mathematische Operationen wie Addition, Subtraktion, Multiplikation, Division, Potenzierung und mehr nutzen, um objektive Funktionen und Einschränkungen zu konstruieren.

Robustheit und numerische Stabilität

CVXPY nutzt fortschrittliche Techniken, um numerische Probleme im Zusammenhang mit der konvexen Optimierung zu bewältigen, wie z. B. schlechte Konditionierung, numerische Stabilität und Präzisionsfehler. Dies gewährleistet zuverlässige und präzise Lösungen auch bei anspruchsvollen Problemen.

Open-Supply und aktive Group

CVXPY ist ein Open-Supply-Projekt mit einer aktiven Group von Mitwirkenden. Benutzer können von der Group-Unterstützung profitieren, auf zusätzliche Ressourcen zugreifen und zur Entwicklung der Bibliothek beitragen.

Nahtlose Integration

CVXPY lässt sich intestine in das breitere Python-Ökosystem integrieren und erleichtert die Kombination der konvexen Optimierung mit anderen Bibliotheken und Instruments. Es kann in Verbindung mit NumPy, SciPy, matplotlib und anderen beliebten Python-Paketen verwendet werden.

Kleinsten Quadrate

# Import packages.
import cvxpy as cp
import numpy as np

# Generate knowledge.
m = 20
n = 15
np.random.seed(1)
A = np.random.randn(m, n)
b = np.random.randn(m)

# Outline and clear up the CVXPY drawback.
x = cp.Variable(n)
value = cp.sum_squares(A @ x - b)
prob = cp.Drawback(cp.Reduce(value))
prob.clear up()

# Print end result.
print("nThe optimum worth is", prob.worth)
print("The optimum x is")
print(x.worth)
print("The norm of the residual is ", cp.norm(A @ x - b, p=2).worth)

Ausgang

Lineares Programm

# Import packages.
import cvxpy as cp
import numpy as np

# Generate a random non-trivial linear program.
m = 15
n = 10
np.random.seed(1)
s0 = np.random.randn(m)
lamb0 = np.most(-s0, 0)
s0 = np.most(s0, 0)
x0 = np.random.randn(n)
A = np.random.randn(m, n)
b = A @ x0 + s0
c = -A.T @ lamb0

# Outline and clear up the CVXPY drawback.
x = cp.Variable(n)
prob = cp.Drawback(cp.Reduce(c.T@x),
[A @ x <= b])
prob.clear up()

# Print end result.
print("nThe optimum worth is", prob.worth)
print("An answer x is")
print(x.worth)
print("A twin resolution is")
print(prob.constraints[0].dual_value)

Ausgang

Quadratisches Programm

# Import packages.
import cvxpy as cp
import numpy as np

# Generate a random non-trivial quadratic program.
m = 15
n = 10
p = 5
np.random.seed(1)
P = np.random.randn(n, n)
P = P.T @ P
q = np.random.randn(n)
G = np.random.randn(m, n)
h = G @ np.random.randn(n)
A = np.random.randn(p, n)
b = np.random.randn(p)

# Outline and clear up the CVXPY drawback.
x = cp.Variable(n)
prob = cp.Drawback(cp.Reduce((1/2)*cp.quad_form(x, P) + q.T @ x),
[G @ x <= h,
A @ x == b])
prob.clear up()

# Print end result.
print("nThe optimum worth is", prob.worth)
print("An answer x is")
print(x.worth)
print("A twin resolution akin to the inequality constraints is")
print(prob.constraints[0].dual_value)

Ausgang

Kegelprogramm zweiter Ordnung

# Import packages.
import cvxpy as cp
import numpy as np

# Generate a random possible SOCP.
m = 3
n = 10
p = 5
n_i = 5
np.random.seed(2)
f = np.random.randn(n)
A = []
b = []
c = []
d = []
x0 = np.random.randn(n)
for i in vary(m):
A.append(np.random.randn(n_i, n))
b.append(np.random.randn(n_i))
c.append(np.random.randn(n))
d.append(np.linalg.norm(A[i] @ x0 + b, 2) - c[i].T @ x0)
F = np.random.randn(p, n)
g = F @ x0

# Outline and clear up the CVXPY drawback.
x = cp.Variable(n)
# We use cp.SOC(t, x) to create the SOC constraint ||x||_2 <= t.
soc_constraints = [
cp.SOC(c[i].T @ x + d[i], A[i] @ x + b[i]) for i in vary(m)
]
prob = cp.Drawback(cp.Reduce(f.T@x),
soc_constraints + [F @ x == g])
prob.clear up()

# Print end result.
print("The optimum worth is", prob.worth)
print("An answer x is")
print(x.worth)
for i in vary(m):
print("SOC constraint %i twin variable resolution" % i)
print(soc_constraints[i].dual_value)

Ausgang

Semidefinites Programm

# Import packages.
import cvxpy as cp
import numpy as np

# Generate a random SDP.
n = 3
p = 3
np.random.seed(1)
C = np.random.randn(n, n)
A = []
b = []
for i in vary(p):
A.append(np.random.randn(n, n))
b.append(np.random.randn())

# Outline and clear up the CVXPY drawback.
# Create a symmetric matrix variable.
X = cp.Variable((n,n), symmetric=True)
# The operator >> denotes matrix inequality.
constraints = [X >> 0]
constraints += [
cp.trace(A[i] @ X) == b[i] for i in vary(p)
]
prob = cp.Drawback(cp.Reduce(cp.hint(C @ X)),
constraints)
prob.clear up()

# Print end result.
print("The optimum worth is", prob.worth)
print("An answer X is")
print(X.worth)

Ausgang

— — —

Warum wurde das Optimierungsproblem in einen CVXPY-Kurs eingeschrieben?

Weil es den „optimalen“ Weg zur Lösung seiner Midlife-„Disaster“ finden wollte!

🙂🙂🙂



Source link

HINTERLASSEN SIE EINE ANTWORT

Please enter your comment!
Please enter your name here