J'essaie essentiellement de résoudre la grande échelle Problème de moindres carrés de la variable délimitée sur des matrices clarses: p>
p>
EDIT: strong>
Dans CVX : p>
6 Réponses :
Votre matrice A ^ t A est positif semi-défini, votre problème est donc convexe; Assurez-vous de profiter de cela lors de la configuration de votre solveur. P>
La plupart des solvants QP Go-to to Fortran et / ou non libres; Cependant, j'ai entendu de bonnes choses sur OOQP ( http: //www.mcs.anl.gov/Research/projects/otc/tools/ooqp/ooqprequestform.html ), bien que ce soit un peu une douleur à obtenir une copie. P>
Oui, j'ai essayé de résoudre le formulaire quadratique également ( quadrachog code>) mais c'est trop gros. Je vais jeter un oeil à OOQP et j'espère que cela fonctionne pour des matrices clairsemées.
Votre problème est similaire à un problème $$ \ min_x || AX-B || _2 ^ 2 \ Text {Sujet à} x \ GE 0 $$, P>
pour lequel il semble exister de nombreux algorithmes. P>
En réalité, votre problème peut être plus ou moins converti en un problème NNLS, si, en plus de vos variables non négatives d'origine $ x $ x, vous créez des variables supplémentaires $ x '$ et liez-les avec des contraintes linéaires $ x_i + x_i' = N $. Le problème avec cette approche est que ces contraintes linéaires supplémentaires pourraient ne pas être satisfaites exactement dans la solution des moindres carrés - il pourrait être approprié d'essayer de les pondérer avec un grand nombre. P>
Le problème NNSL, qui est proche, mais pas exactement votre problème, peut par exemple être résolu à l'aide de la routine MATLAB LSQNONNEG.M en réalité, la boîte à outils d'optimisation comporte la routine LSQLIN.M qui peut résoudre votre problème exactement et même une grande échelle algorihm "; Peut-être que vous pourriez le tester sur votre matrice?
Autres boîtes à outils qui méritent d'essayer: TSNNLS (Cantarella et al) pour NNLS et SLS (par Adlers et al) pour votre problème
@Fanfan si NNLS peut utiliser pour la résolution de systèmes d'équation déterminée de la forme AX = B
@Fanfan J'ai besoin de votre guidage pour exécuter Tsnnls car je ne parviens pas à l'exécuter à l'aide de Linux. Bien qu'il compile bien, il ne crée pas d'exécutable. Je dois appeler à l'aide d'un script et je n'ai aucune idée de comment cela fonctionne-t-il. Depuis que je voudrais changer son code, j'aimerais que l'exécutable soit créée après la compilation plutôt que d'appeler à l'aide d'un script.
Vous essayez de résoudre les moindres carrés avec des contraintes de boîte. Les algorithmes des moindres carrés standard incluent LSQR et plus récemment, LSMR. Celles-ci ne nécessitent que vous souhaitez appliquer des produits de matrice-vectoriels. Pour ajouter les contraintes, réalisez que si vous êtes à l'intérieur de la boîte (aucune des contraintes n'est «active»), vous procédez à la méthode de la page intérieure que vous avez choisie. Pour toutes les contraintes actives, la prochaine itération que vous effectuez vous permettra de désactiver la contrainte, ou de vous contraindre à vous déplacer le long de l'hyperplan de contrainte. Avec des modifications appropriées (conceptuellement relativement simples) adaptées à l'algorithme que vous choisissez, vous pouvez implémenter ces contraintes. P>
Généralement Cependant, vous pouvez utiliser n'importe quel package d'optimisation convexe. J'ai personnellement résolu ce type de problème exact à l'aide du package MATLAB CVX, qui utilise SDTPT3 / Sedumi pour un backend. CVX est simplement un wrapper très pratique autour de ces solveurs de programme semi-riginite. P>
Oui, je me rends compte que c'est convexe. J'ai essayé CVX mais cela manque de mémoire. Puisque CVX a été recommandé, j'ai posté ma solution CVX.
Quelle est la taille de vos matrices?
J'ai utilisé de petites matrices denses (environ 100x100). Vous utilisez les matrices rares à Matlab à droite? Je crois que vous ne devez pas manquer de mémoire si vous utilisez SPConvert () pour construire la matrice.
Oui, mais certaines fonctions MATLAB ne prend pas en charge les matrices clairsemées. CVX semble également échouer pour de telles matrices.
Que diriez-vous de CVXOPT? Cela fonctionne avec des matrices clairsemées et il semble que certains des solveurs de programmation des cônes puissent aider:
http://abel.ee.uucle.edu/cvxopt/userguide/coneprog.html#quaDrac-cone-programs p>
C'est un simple Modification du code dans la DOC ci-dessus, pour résoudre votre problème: p>
from cvxopt import matrix, solvers A = matrix([ [ .3, -.4, -.2, -.4, 1.3 ], [ .6, 1.2, -1.7, .3, -.3 ], [-.3, .0, .6, -1.2, -2.0 ] ]) b = matrix([ 1.5, .0, -1.2, -.7, .0]) N = 2; m, n = A.size I = matrix(0.0, (n,n)) I[::n+1] = 1.0 G = matrix([-I, I]) h = matrix(n*[0.0] + n*[N]) print G print h dims = {'l': n, 'q': [n+1], 's': []} x = solvers.coneqp(A.T*A, -A.T*b, G, h)['x']#, dims)['x'] print x
Si vous avez MATLAB, c'est quelque chose que vous pouvez faire avec TFOCS . Ceci est la syntaxe que vous utiliseriez pour résoudre le problème:
x = tfocs( smooth_quad, { A, -b }, proj_box( 0, N ) );
Si vous reformulez votre modèle comme: p>
min
Sous réserve de:
p>
Ensuite, il s'agit d'un problème de programmation quadratique standard. Il s'agit d'un type de modèle commun qui peut être facilement résolu avec un solveur commercial tel que CPLEX ou GURROBI. (Disclaimer: Je travaille actuellement pour l'optimisation de Gurrobi et travaillé auparavant pour ILOG, qui a fourni CPLEX). P>
Je devrais ajouter: les variables Y ne sont pas strictement nécessaires. Vous pouvez élargir l'objectif et remplacer les variables y. Mais l'ajout des variables Y rend le modèle et le code plus facile à écrire et à comprendre, et ils ne feront pas le modèle plus difficile à résoudre.
Alors qu'est-ce qui ne va pas avec l'utilisation de cette solution particulière? N'est-ce pas performant ou cherchez-vous des choses à garder à l'esprit avant de mettre en œuvre la solution?
Je voudrais appliquer ces contraintes que j'ai mentionnées.
Peut-être que i i> ne comprend pas le problème, ce sont les contraintes qui ne sont pas applicables dans ce système? Quelle partie montre un problème? Où pensez-vous que les contraintes devraient être appliquées? Il semble que le solutionneur soit mis en œuvre à Boost, ce qui signifie que vous seriez vraiment en train de vous concentrer sur une bibliothèque de boost altérée, non? Désolé, je sais que je n'aide pas, mais c'est un problème intéressant.
Aucun problème. D'après ce que je peux voir, je ne peux pas appliquer des contraintes sur
x code>.
Pour ce que ça vaut la peine, j'ai transmis le lien avec d'autres personnes mathyes, peut-être qu'ils seront arsés à se lancer en ligne;) ~ Bonne chance ...
Pourquoi regardez-vous cela comme un problème de minimisation des moindres carrés? N'est-ce pas un problème de programmation linéaire standard, que vous devriez pouvoir résoudre avec un Simplex?