Programmation linéaire avec contraintes matricielles


10

J'ai un problème d'optimisation qui ressemble au suivant

minJ,Bij|Jij|s.t.MJ+BY=X

Ici, mes variables sont les matrices J et B , mais tout le problème est toujours un programme linéaire; les variables restantes sont fixes.

Lorsque j'essaie d'entrer ce programme dans mes outils de programmation linéaire préférés, je rencontre des problèmes. A savoir, si j'écris ceci sous forme de programme linéaire "standard", les matrices de paramètres M et Y finissent par être répétées une tonne de fois (une fois pour chaque colonne de X ).

Existe-t-il un algorithme et / ou un package pouvant gérer les optimisations du formulaire ci-dessus? En ce moment, je manque de mémoire car M et Y doivent être copiés tant de fois!


B est-il Bune matrice de paramètres, ou voulez-vous dire Y ? Quelles sont les formes des différentes matrices?
Geoffrey Irving le

[Salut Geoffrey!] J et B sont des variables, les autres sont des paramètres. B a relativement peu de colonnes mais toutes les dimensions restantes sont assez grandes (rien n'est carré).
Justin Solomon

[Bonjour!] Vous devriez éditer le message pour ne pas dire deux fois que B est un paramètre.
Geoffrey Irving

1
Fait intéressant mais probablement inutile, la version de ce problème avec au lieu depeut être résolu avec quelques SVD. | J i j |Jij2|Jij|
Geoffrey Irving

1
@Geoffrey, ce n'est pas un hasard :-)
Justin Solomon

Réponses:


12

Aperçu

Vous voudrez peut-être essayer une variante de la méthode des multiplicateurs de directions alternées (ADMM), qui s'est avérée converger étonnamment rapidement pour les problèmes de type lasso. La stratégie consiste à formuler le problème avec un lagrangien augmenté puis à faire une ascension en gradient sur le problème dual. C'est particulièrement agréable pour ce problème régularisé particulier car la partie non lisse de chaque itération de la méthode a une solution exacte que vous pouvez simplement évaluer élément par élément, tandis que la partie lisse implique la résolution d'un système linéaire.l 1l1l1

Dans ce post, nous

  • dériver une formulation ADMM globale pour une généralisation de votre problème,
  • dériver les sous-problèmes pour chaque itération ADMM et les spécialiser dans votre situation, puis
  • rechercher la résultante système linéaire qui doit être résolu chaque itération, et à développer un solveur rapide (ou préconditionneur) sur la base de précalculer les valeurs propres décompositions (ou des approximations de rang bas de ceux - ci) pour et .Y Y TMTMYYT
  • résumer avec quelques remarques finales

La plupart des grandes idées ici sont couvertes dans le superbe article de synthèse suivant,

Boyd, Stephen et al. "Optimisation distribuée et apprentissage statistique via la méthode des multiplicateurs de direction alternée." Foundations and Trends® in Machine Learning 3.1 (2011): 1-122. http://www.stanford.edu/~boyd/papers/pdf/admm_distr_stats.pdf

Avant d'entrer dans les détails, je tiens à noter qu'il s'agit d'une réponse de méthode / algorithme et non d'une réponse de code existante pratique - si vous souhaitez utiliser cette méthode, vous devez lancer votre propre implémentation.

Formulation ADMM

En général, supposons que vous vouliez résoudre

minxi|xi|s.t.Ax=b.

Le problème dans le message d'origine tombe dans cette catégorie après une vectorisation appropriée. (ce n'est qu'en principe - on verra que la vectorisation n'a pas besoin d'être réalisée en pratique)

Vous pouvez à la place résoudre le problème équivalent, qui a lagrangien L(x,z,λ,γ)=

minx,zi|xi|+α2||xz||2+β2||Azb||2s.t.Az=b&x=z,
L(x,z,λ,γ)=i|xi|+α2||xz||2+β2||Azb||2+λT(Azb)+γT(xz)=i|xi|+α2||xz+1αγ||2+β2||Azb+1βλ||2+α2||1αγ||2+β2||1βλ||2.

La méthode de direction alternée des multiplicateurs résout le problème double, par ascension en gradient sur les variables doubles, sauf avec projections alternées inexactes sur les sous-problèmes doubles. C'est-à-dire que l'on fait l'itération x k + 1

maxλ,γminx,zL(x,z,λ,γ),
xk+1=argminxL(x,zk,λk,γk)zk+1=argminzL(xk+1,z,λk,γk)γk+1=γk+α(xk+1zk+1)λk+1=λk+β(Azk+1b).

Dans certaines conditions douces sur les paramètres et (expliqués dans l'article Boyd & Parikh lié ci-dessus), la méthode ADMM convergera vers la vraie solution. Le taux de convergence est linéaire, car il s'agit au cœur d'une méthode de montée en gradient. Souvent, il peut être accéléré pour être super-linéaire en 1) modifiant les paramètres et fur et à mesure en fonction de l'heuristique, ou 2) en utilisant l'accélération de Nesterov. Pour des notes sur la modification des paramètres de pénalité, voir le document d'enquête Boyd, et pour utiliser l'accélération Nesterov avec ADMM, voir le document suivant,β α βαβαβ

Goldstein, Tom, Brendan O'Donoghue et Simon Setzer. "Méthodes d'optimisation rapide de la direction alternative." Rapport CAM (2012): 12-35. ftp://ftp.math.ucla.edu/pub/camreport/cam12-35.pdf

Cependant, même si le taux de convergence global n'est que linéaire, pour les problèmes , la méthode a été observée pour trouver le motif de rareté très rapidement, puis converger plus lentement sur les valeurs exactes. Étant donné que trouver le motif de rareté est la partie la plus difficile, c'est très fortuit! Les raisons exactes pourquoi semblent être un domaine de recherche actuel. Tout le monde voit le modèle de rareté converger rapidement, mais personne ne semble savoir exactement pourquoi cela se produit. Il y a quelque temps, j'ai interrogé Boyd et Parikh à ce sujet par courrier électronique et Parikh a pensé que cela pourrait être expliqué en interprétant la méthode dans un contexte de systèmes de contrôle. Une autre explication heuristique du phénomène se trouve en annexe de l'article suivant,l1

Goldstein, Tom et Stanley Osher. "La méthode split Bregman pour les problèmes régularisés en L1." SIAM Journal on Imaging Sciences 2.2 (2009): 323-343. ftp://ftp.math.ucla.edu/pub/camreport/cam08-29.pdf

Bien sûr, la difficulté réside maintenant dans la résolution des sous-problèmes de mise à jour et pour votre situation spécifique. Comme le lagrangien est quadratique en , le sous-problème de mise à jour nécessite simplement de résoudre un système linéaire. Le sous-problème semble plus difficile car il est non différenciable, mais il s'avère qu'il existe une formule exacte pour la solution qui peut être appliquée élément par élément! Nous discutons maintenant de ces sous-problèmes plus en détail et les spécifions au problème dans le message d'origine.z z z xxzzzx

Configuration du sous-problème de mise à jour (système linéaire)z

Pour la mise à jour , nous avons a r g m i n z L ( x k , z , λ k , γ k ) = a r g m i n z αz

argminzL(xk,z,λk,γk)=argminzα2||xz+1αγ||2+β2||Azb+1βλ||2.

Spécialisé dans votre problème, cela devient,

argminZJ,ZBα2||Jk+1ZJ+1αΓJ||Fro2+α2||Bk+1ZB+1αΓB||Fro2+β2||MZJ+ZBYX+1αΛ||Fro2,

où désigne la norme Frobenius (élément élément ). Il s'agit d'un problème de minimisation quadratique, où les conditions d'optimalité du premier ordre peuvent être trouvées en prenant des dérivées partielles de l'objectif par rapport à et et en les mettant à zéro. C'est-à-dire, l 2 Z J Z B 0||||Frol2ZJZB

0=α2(Jk+1ZJ+1αΓJ)+β2MT(MZJ+ZBYX+1βΛ),0=α2(Bk+1ZB+1αΓB)+β2(MZJ+ZBYX+1βΛ)YT.

Comme indiqué dans les commentaires de l'affiche originale Justin Solomon, ce système pour est symétrique, donc le gradient conjugué est une méthode sans matrice idéale. Une section ultérieure traite de ce système et comment le résoudre / le préconditionner plus en détail.ZJ,ZB

Résolution update sous - problème (solution de seuillage analytique)x

Passons maintenant au sous-problème , x

argminxL(x,zk,λk,γk)=argminxi|xi|+α2||xzk+1αγk||2

La première chose à voir est que la somme peut être décomposée élément par élément,

i|xi|+α2||xzk+1αγk||2=i|xi|+α2i(xizik+1αγik)2,

Nous pouvons donc résoudre le problème d'optimisation élément par élément en parallèle, donnant

xik+1=argminxi|xi|+α2(xizik+1αγik)2.

La forme générale de cette équation est,

mins|s|+α2(st)2.

La fonction de valeur absolue tente de tirer le point optimal vers , tandis que le terme quadratique tente de tirer le point optimal vers . la vraie solution se situe donc quelque part sur le segment entre les deux, avec une augmentation de tendant à tirer le point optimal vers , et une diminution de tirant le point optimal vers .s=0s=t[0,t)αtα0

C'est une fonction convexe mais elle n'est pas différenciable à zéro. La condition pour un point de minimisation est que la sous-dérivée de l'objectif à ce point contienne zéro. Le terme quadratique a une dérivée et la fonction de valeur absolue a une dérivée pour , une sous-dérivée à valeur définie comme intervalle lorsque et la dérivée pour . Ainsi, nous obtenons la sous-dérivée de la fonction objectif globale, α(st)1s<0[1,1]s=01s>0

s(|s|+α2(st)2)={1+α(st)s>0[1,1]+αt,s=0,1+α(st),s<0.

De cela, nous voyons que la sous-dérivée de l'objectif à contient si et seulement si , auquel cas est le minimiseur. D'un autre côté, si n'est pas le minimiseur, alors nous pouvons définir la dérivée à valeur unique égale à zéro et résoudre pour le minimiseur. Ce faisant, s=00|t|1αs=0s=0

argmins|s|+α2(st)2={t1α,t>1α,0,|t|1α,t+1α,t<1α

En spécialisant à nouveau ce résultat dans le problème réel que nous essayons de résoudre dans la question d'origine où donne, La mise à jour de est simplement t=Zijk1αΓijk

Jijk+1={Zijk1αΓijk1α,Zijk1αΓijk>1α,0,|Zijk1αΓijk|1α,Zijk1αΓijk+1α,Zijk1αΓijk<1α.
B
Bk+1=ZB1αΓB,

comme l'a noté l'affiche originale Justin Solomon dans les commentaires. Dans l'ensemble, faire la mise à jour pour nécessite simplement de parcourir les entrées de vos matrices et d'évaluer les formules ci-dessus pour chaque entrée.J,B

Complément de Schur pour le systèmeZJ,ZB

L'étape la plus coûteuse de l'itération est la résolution du système,

0=α2(Jk+1ZJ+1αΓJ)+β2MT(MZJ+ZBYX+1βΛ),0=α2(Bk+1ZB+1αΓB)+β2(MZJ+ZBYX+1βΛ)YT.

À cette fin, il vaut la peine de construire un bon solveur / préconditionneur pour ce système. Dans cette section, nous le faisons en vectorisant , en formant un complément de Schur , en faisant quelques manipulations de produits Krnoecker puis en ne vectorisant pas. Le système de complément Schur résultant est une équation de Sylvester légèrement modifiée .

Dans ce qui suit, les identités suivantes concernant la vectorisation et les produits Kronecker sont absolument essentielles:

  • vec(ABC)=(CTA)vec(B),
  • (AB)(CD)=ACBD ,
  • (AB)1=A1B1 , et
  • (AB)T=ATBT .

Ces identités sont valables chaque fois que les tailles de matrice et l'invertibilité sont telles que chaque côté de l'équation est une expression valide.

La forme vectorisée du système est,

(αI+β[IMTM(YM)TYMYYTI])[vec(ZJ)vec(ZB)]=[vec(αJ+βMTX+ΓJMTΛ)vec(αB+βXYT+ΓBΛYT)],

ou,

[I(αI+βMTM)β(YM)TβYM(αI+βYYT)I][vec(ZJ)vec(ZB)]=[vec(F)vec(G)],

où et sont des notations condensées pour le côté droit. Nous effectuons maintenant le complément élimination bloc-gaussien / Schur pour éliminer le bloc inférieur gauche de la matrice, dans le processus de condensation des produits Kronecker. C'est, FG

[I(αI+βMTM)β(YM)T0(αI+βYYT)Iβ2YYTM(αI+βMTM)1MT][vec(ZJ)vec(ZB)]=[vec(F)vec(G)βYM(αI+βMTM)1vec(F)].

Sans vecteur, les deux équations que nous devons résoudre en séquence sont,

  1. ZB(αI+βYYT)(βM(αI+βMTM)1MT)ZB(βYYT)=GβM(αI+βMTM)1FYT
  2. (αI+βMTM)ZJ=FβMTZBY.

Solution du système du complément de Schur lorsque sont carrés, de haut rangY,M

Dans cette section, nous résolvons le système du complément de Schur pour (équation 1. ci-dessus) en utilisant des SVD complets précalculés des matrices et en appliquant une version modifiée de l'algorithme de Bartels-Stewart pour le Sylvester équation. L'algorithme est légèrement modifié par rapport à la version standard pour tenir compte de l'extra sur le deuxième terme, ce qui en fait pas tout à fait l'équation de Sylvester. Une fois que est trouvé via la première équation, peut être trouvé facilement à partir de la deuxième équation. La deuxième équation est triviale à résoudre via n'importe quelle méthode que vous aimez.ZBYYT,MMT,MTMβYYTZBZJ

Cette méthode nécessite un coût initial pour précalculer deux SVD complets avant le démarrage du processus ADMM, mais est ensuite rapide à appliquer dans les itérations ADMM réelles. Comme la méthode traite des SVD complètes des matrices de contraintes, elle est appropriée lorsqu'elles sont proches du rang carré et élevé. Une méthode plus compliquée utilisant des SVD de bas rang est également possible, mais est présentée dans une section ultérieure.

La méthode évolue comme suit. Soit représentent précalculées Les décompositions de valeurs singulières complètes, et de condenser le côté droit d'être . Alors la première équation devient, Multiplication par les facteurs orthogonaux pour effacer la gauche et la droite et définir une nouvelle inconnue temporaire , cela devient encore,

QDQT=YYT,WΣWT=MMT,VTVT=MTM
H
ZBQ(αI+D)QTWβΣ(αI+Σ)1ΣWTZBQDQT=H.
A=WTZBQ
A(αI+D)βΣ(αI+Σ)1ΣAD=WHQT.

Maintenant, nous pouvons trouver en résolvant le système diagonal , A

((αI+D)I+DβΣ(αI+Σ)1Σ)vec(A)=vec(WHQT).

Après avoir trouvé , nous calculons , et connaissant nous résolvons la deuxième équation ci-dessus pour , ce qui est trivial puisque nous avons déjà la décomposition de valeurs propres pour .AZB=WAQTZBZJMTM

Le coût initial calcule deux décompositions de valeurs propres définies positives symétriques de et , puis le coût par itération pour une résolution complète est dominé par une poignée de multiplications matrice-matrice, qui est du même ordre de magnitude comme faisant 1 sous-titrage CG. Si les décompositions de valeurs propres initiales sont trop coûteuses, elles peuvent être calculées de manière inexacte, par exemple, en mettant fin à l' itération de Lanczos plus tôt et en conservant les plus grands vecteurs propres. Ensuite, la méthode peut être utilisée comme un bon préconditionneur pour CG plutôt que comme un solveur direct.MTMYYT

Méthode de la solution lorsque sont très rectangulaires ou ont une approximation de bas rangM,Y

Maintenant, nous tournons notre attention vers la résolution ou le préconditionnement des lorsque a) les matrices d'entrée sont très rectangulaires - ce qui signifie qu'elles ont beaucoup plus de lignes que de colonnes ou vice versa - ou b) qu'elles ont une approximation de bas rang. La dérivation ci-dessous implique une utilisation intensive de la formule de Woodbury, du complément de Schur et d'autres manipulations similaires.ZJ,ZBM,Y

Nous commençons avec notre système de complément Schur,

(αI+βYYT)Iβ2YYTM(αI+βMTM)1MT.

Quelques manipulations transforment ce système en une forme plus symétrique,

(αI+βIMMT+βYYTI)vec(ZB)=(I(I+βαMMT))vec(H).

Maintenant, nous apportons les approximations de bas rang. Soit soit les SVD réduits ou les approximations de bas rang de et ( est un espace réservé et n'est pas utilisé). La substitution de ceux-ci dans notre système donne l'inverse de matrice suivant que nous souhaitons appliquer,

QD1/2Q2T=YWΣ1/2VT=M
YMQ2
(αI+βIWΣWT+βYYTI)1.

Puisque la matrice que nous devons inverser est une mise à jour de bas rang de l'identité, la stratégie logique consiste à essayer d'utiliser la formule de Woodbury,

(A+UCUT)1=A1A1U(C1+UTA1U)1UTA1.

Cependant, un certain soin est nécessaire car les morceaux de bas rang et ne sont pas orthogonaux. Ainsi, pour appliquer la formule de Woodbury, nous collectons les deux mises à jour de bas rang en une seule grande mise à jour. Doint ainsi et en appliquant les rendements de formule Woodbury, Y IIWYI

(1αI+β[IWQI][IΣDY][IΣTQTI])1=αIβα2[IWQI][I(Σ1+βαI)βαQWTβαQTW(D1+βαI)Y]1[IΣTQTI].

L'inverse du noyau peut être calculé par la formule inverse 2x2 par blocs,

[ABBTC]1=[(ABC1BT)1A1B(CBTA1B)1C1BT(ABC1BT)1(CBTA1B)1].

Ce message est déjà assez long, donc je vais épargner les longs détails du calcul, mais le résultat final est que le fait de brancher les sous-matrices nécessaires dans l'inverse du bloc et de tout multiplier donne la forme explicite suivante pour l'inverse global,

(αI+βIMMT+βYYTI)1=1αIβα2(t11+s11+t12+s12+t21+s21+t22+s22),

t11=αβIWl1WTs11=(QWl1)D11(QTl1WT)t12=αβQh1QTWl1WTs12=(Qh1Wl1)D22(h1QTWT)t21=t12s21=(Qh1W)D22(h1QTl1WT)t22=αβQh1QTIs22=(Qh1W)D22(h1QTWT)D11=αβ(hIIl1)1D22=αβ(Ilh1I)1l=αβΣ1+Ih=αβD1+I.

Sous cette forme, nous pouvons appliquer l'inverse et trouver terme par terme à travers 8 sandwichs de multiplication de matrice gauche et droite. La formule générale pour appliquer la somme des produits Kronecker est, ZB

((A1B1)+(A2B2)+)vec(C)=vec(B1TCA1+B2TCA2+).

Notez que tous les inverses explicites avec lesquels nous nous sommes retrouvés sont diagonaux, il n'y a donc rien à "résoudre".

Code de solveur linéaire

J'ai implémenté les deux solveurs ci-dessus dans Matlab. Ils semblent bien fonctionner. Le code du solveur est ici.zJ,ZB

https://github.com/NickAlger/MeshADMM/blob/master/zkronsolve.m

Un script de test pour vérifier que les solveurs fonctionnent est ici. Il montre également par exemple comment appeler le code du solveur.

https://github.com/NickAlger/MeshADMM/blob/master/test_zkronsolve.m

Remarques finales

Les méthodes de type ADMM sont bien adaptées à des problèmes comme celui-ci, mais vous devrez rouler votre propre implémentation. La structure globale de la méthode est assez simple, donc l'implémentation n'est pas trop difficile dans quelque chose comme MATLAB.

La pièce manquante de ce message qui devrait être spécifiée pour définir complètement la méthode pour votre problème est un choix de paramètres de pénalité . Heureusement, la méthode est généralement assez robuste tant que les valeurs des paramètres ne sont pas folles. Le document Boyd et Parikh contient une section sur les paramètres de pénalité, tout comme les références, mais je voudrais simplement expérimenter les paramètres jusqu'à ce que vous obteniez des taux de convergence raisonnables.α,β

Les présentées sont très efficaces si les matrices de contraintes sont soit a) denses, carrées et de rang élevé, soit b) ont une bonne approximation de bas rang. Un autre solveur utile qui pourrait être un sujet de travaux futurs serait un solveur optimisé pour le cas suivant - la matrice de contrainte est clairsemée et squareish et un rang élevé, mais il existe un bon préconditionneur pour . Ce serait le cas si, par exemple, est un Laplacien discrétisé.ZJ,ZBMαI+MMTM


Mettre en œuvre cela maintenant! Pour vérifier, la résolution de la matrice pour et devrait être symétrique / positive définie car elle provient des moindres carrés, non? Cela semble empiriquement vrai :-). Alors, CG est-il une meilleure option que GMRES? ZBZJ
Justin Solomon

De plus, je pense que la mise à jour pour B est mauvaise? Je travaille sur cela plus en détail, mais rappelez-vous que B n'apparaît pas dans ma fonction d'énergie (pas de terme ), donc je ne suis pas sûr qu'il ne devrait prendre que des valeurs dans Suis-je penser à ce mal? Merci! |B|±(11/α).
Justin Solomon

1
[plutôt, ]B=ZBΓB/α
Justin Solomon

3
Incroyable! Après avoir mis mes propres formules pour et (probablement proche / équivalent à ce que vous avez publié mais quelque chose ne fonctionnait pas), cela surpasse de loin la méthode IRLS. Merci! JB
Justin Solomon

1
Bonne nouvelle. C'est tellement agréable de voir quand les contributions mènent à de vrais résultats.
Michael Grant

5

Vous voudrez probablement utiliser une méthode sans matrice pour la programmation linéaire. Je ne connais aucune méthode spécifiquement orientée vers la programmation linéaire, mais il existe des méthodes de point intérieur sans matrice pour les programmes quadratiques et pour les programmes non linéaires généraux. Le cas de programme quadratique correspond exactement à votre problème, où les coefficients de forme quadratique sont tous des zéros. (Vous pouvez également adapter des méthodes qui utilisent des solutions linéaires exactes à la structure de votre problème, mais ce type d'implémentation sur mesure peut ne pas en valoir la peine et est moins pratique que d'utiliser une méthode sans matrice.)

Je ne connais aucun package d'optimisation commerciale qui implémente des variantes sans matrice des méthodes de point intérieur. IPOPT est censé implémenter une méthode de point intérieur sans matrice pour la programmation non linéaire, mais je n'ai pas pu retrouver les appels d'API qui vous permettent de l'utiliser.

En plus de CVX, vous pouvez probablement utiliser GAMS ou AMPL pour entrer la matrice une fois et configurer vos contraintes dans le langage de modélisation pour utiliser cette matrice. Cependant, les méthodes utilisées par les backends du solveur pour CVX, GAMS et AMPL n'utilisent pas de solveurs sans matrice; tous nécessiteront la matrice de coefficients complète pour le programme linéaire sous forme standard, qui sera énorme (ce sera un produit de matrices Kronecker). Ce qui se passera probablement, c'est que vous entrez votre programme linéaire dans le formulaire ci-dessus en utilisant le langage de modélisation, puis le langage de modélisation traduira les données dans un formulaire utilisable par les solveurs backend. Ce formulaire nécessitera d'énormes matrices, et je soupçonne que vous rencontrerez les mêmes types d'erreurs (sauf si vous exécutez sur une machine avec suffisamment de mémoire).


On dirait que j'ai essayé toutes les bonnes choses! J'ai d'abord expérimenté avec CVX et il a échoué, alors je suis passé à IPOPT. Mais IPOPT avait le même problème. Je ne savais pas qu'il avait une option sans matrice, donc je vais voir si je peux le comprendre.
Justin Solomon

Je ne sais pas si GAMS / AMPL va aider mon problème. Je suis heureux de coder le problème sous quelque forme que ce soit pour aider le solveur à faire la bonne chose, mais comme vous le dites dans les coulisses, prendre un produit Kronecker ne fonctionnera pas.
Justin Solomon

4

Pouvez-vous vous permettre les SVD mentionnés par Geoffrey Irving? Si vous le pouvez, j'envisagerais une approche des moindres carrés itérativement repondérés (IRLS) . Cette approche résoudrait les problèmes de la forme où est une matrice de poids.

minimizeijWijJij2subject toMJ+BY=X
W

Les itérations commencent par comme matrice de tous; cela donne un optimal . Les itérations se poursuivent avec où est une petite constante qui empêche la division par zéro. Je ne suis pas totalement sûr des critères de convergence, mais peut-être que le lien Wikipedia que j'ai proposé ci-dessus peut vous donner des références.W(0)J(0)

Wij(k+1)=|max{Jij(k),ϵ}|1
ϵ

Vous pouvez également envisager une méthode de premier ordre lissée. TFOCS, que j'ai co-écrit, pourrait gérer cela en utilisant son solveur "dual conique lissé" (SCD), mais il ne sera pas aussi facile à utiliser.

Si vous voulez essayer une méthode de point intérieur sans matrice, lisez le travail de Jacek Gondzio.

EDIT: hmm, il se pourrait que IRLS ne puisse pas utiliser le SVD pour calculer des solutions. Si c'est le cas, je retomberais sur l'un des autres choix.


1
Je ne sais pas si je serais en mesure d'utiliser le SVD ici, mais IRLS est une excellente idée malgré tout! La vitesse n'est pas aussi préoccupante que la mémoire, et embarrassant, j'ai utilisé IRLS pour une recherche connexe il y a quelques mois et cela a très bien fonctionné (me donner un coup de pied pour ne pas avoir essayé auparavant!). Même sans le SVD pour IRLS, il devrait être possible de le faire en utilisant un solveur linéaire comme CG qui n'a pas besoin du système complet. En fait, CG peut probablement être arrêté avec des contraintes assez lâches avant d'ajuster comme vous le suggérez. Je me penche également sur une approche ADMM, mais j'ai moins d'expérience avec cela. Wij
Justin Solomon

Oui, ADMM serait génial aussi. J'ai en fait rédigé une section vous suggérant d'éliminer complètement Y, mais j'ai vu plus tard que n'était pas carré. M
Michael Grant

1
Implémentation de la stratégie IRLS - elle converge mais ne fait pas trop bien numériquement car le système linéaire qu'il doit résoudre est mal conditionné grâce à une large gamme de ; en utilisant GMRES pour résoudre le système. J'essaierai ADMM ensuite! w
Justin Solomon

2

Vous pouvez essayer d'utiliser CVX , ce qui vous permettrait de le coder exactement sous la forme que vous l'avez écrite (c'est-à-dire avec comme matrice plutôt que comme vecteur). Il serait probablement résolu en utilisant un solveur convexe plus général au lieu d'un solveur LP, mais si le solveur convexe réussit, je suppose que cela ne vous dérange pas.X

Autre possibilité: utilisez un solveur qui permet de stocker vos matrices de contraintes en tant que matrices clairsemées. Cela nécessitera toujours beaucoup plus de mémoire que ce dont vous auriez besoin, mais beaucoup moins que si vous les stockiez sous forme de matrices denses. Dans CVX, si vous utilisez, kronvous obtenez une matrice clairsemée, il serait donc trivial d'essayer ceci.


Si Python serait plus pratique que MATLAB pour une raison quelconque, alors il y a aussi cvxpy bien qu'il ne soit pas aussi poli que cvx.
k20

Je soupçonne que cette approche fonctionnera superficiellement, puis échouera après que le langage de modélisation CVX aura transformé les données d'entrée en une forme utilisable par ses solveurs d'arrière-plan (qui résoudra les programmes linéaires, les programmes quadratiques, les programmes à cônes de second ordre, les programmes semi-finis et programmes géométriques). J'explique pourquoi dans ma réponse. Le backend Gurobi est le meilleur solveur LP (parmi d'autres types), donc utiliser CVX avec cet algorithme est probablement le meilleur que vous puissiez faire en termes d'implémentation, à moins d'appeler CVX à partir d'une API de langage compilé.
Geoff Oxberry

1
Comme le dit Geoff, aucune couche de modélisation ne vous aidera ici. Le LP résultant contient les données répétées pour tout solveur générique standard. Pour contourner cela, vous devrez utiliser (développer) un solveur basé sur Oracle, c'est-à-dire un solveur qui, essentiellement, est basé sur le retour du résiduel pour une valeur donnée de et / ou certains coupe appropriée, puis travaillez avec cette description à la place. MJ+BYXJ,Y
Johan Löfberg

Oui, je rencontre exactement le problème mentionné par Geoff. En fait, j'ai utilisé CVX pour ma première supposition. J'ai également essayé d'appeler Gurobi directement, mais la seule façon dont je peux penser est de faire le même problème de déroulement.
Justin Solomon

1
Je pense que vous devriez rouler le vôtre
Johan Löfberg
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.