2017-04-02 5 views
0

Also muss ich ein x finden, das minimiert norm(A.dot(x) - y, 2) A ist eine Matrix und y ist ein Vektor.Integer Linear Least Squares

Dies könnte leicht mit scipy.optimize.lsq_linear oder numpy.linalg.lstsq erreicht werden, aber ich brauche x ganze Zahlen. Im Allgemeinen ist "Integer-Programmierung" NP-vollständig. Ich habe Routines for solving the standard integer least squares problem gefunden, aber ich dachte, ich würde fragen, bevor ich es von Matlab konvertieren.

Gibt es eine etablierte Bibliothek, die Integer Linear Least Squares in Python lösen kann?

+0

@ruakh, danke vergaß das. lol. – Jacob

+0

Ist das wonach Sie suchen? https://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.linalg.lsts.html – wave5459

+0

@ sinewaver, lstsq gibt floats zurück. Ich hatte gehofft, die beste Ganzzahllösung zu finden. – Jacob

Antwort

1

Sie könnten eine der Optimierungsbibliotheken verwenden, die für Python verfügbar sind, als mit (gemischter) Ganzzahlprogrammierung umgehen kann. Machen Sie eine Goggle Suche und Sie werden viele finden. Da Ihr Problem konvex ist, kann cvxpy als eine nette Schnittstelle zu vielen von ihnen verwendet werden. Hier ist ein Spielzeug Beispiel eine eingebaute in ganzzahligen Programmierung Solver (was nicht sehr effizient sein kann für große Probleme)

import numpy as np 
import cvxpy 

np.random.seed(123) # for reproducability 

# generate A and y 
m, n = 10, 10 
A = np.random.randn(m,n) 
y = np.random.randn(m) 

# declare the integer-valued optimization variable 
x = cvxpy.Int(n) 

# set up the L2-norm minimization problem 
obj = cvxpy.Minimize(cvxpy.norm(A * x - y, 2)) 
prob = cvxpy.Problem(obj) 

# solve the problem using an appropriate solver 
sol = prob.solve(solver = 'ECOS_BB') 

# the optimal value of x is 
print(x.value) 
[[-13.] 
[ -3.] 
[ 3.] 
[ 6.] 
[ 1.] 
[ -5.] 
[ -1.] 
[ -3.] 
[ -2.] 
[ -6.]] 
0

Ich habe mit einer ähnlichen Lösung zu lösen Summe kommen (| Ax-y |), das Sie in ein lineares ganzzahliges Programmierproblem umwandeln und mit PuLP lösen können.

Die Grundidee ist es, die Zielfunktionssumme (err (i)) unter den Randbedingungen zu minimieren:

Ax (i) - y (i) < = err (i) und Ax (i) - y (i)> = -err (i).

, die mit linearen Lösern kompatibel ist.

+0

Dies beantwortet nicht wirklich die Frage. Wenn Sie eine andere Frage haben, können Sie sie durch Klicken auf [Frage stellen] (https://stackoverflow.com/questions/ask) stellen. Sie können auch [Kopfgeld hinzufügen] (https://stackoverflow.com/help/privileges/set-bounties) hinzufügen, um mehr Aufmerksamkeit auf diese Frage zu lenken, sobald Sie genug [Reputation] haben (https://stackoverflow.com/help/ Whats-Reputation). - [Aus Bewertung] (/ review/low-quality-posts/17681585) – LaundroMat