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