整数线性最小二乘法

时间:2017-04-02 01:19:51

标签: python numpy scipy

所以我必须找到一个x最小化norm(A.dot(x) - y, 2) A是一个矩阵,y是一个向量。

这可以通过scipy.optimize.lsq_linearnumpy.linalg.lstsq轻松完成,但我需要x才能成为整数。通常"整数编程"是NP完全的。 我确实找到了Routines for solving the standard integer least squares problem,但在我从matlab转换之前我想过要问。

是否有一个已建立的库可以解决python中的整数线性最小二乘?

2 个答案:

答案 0 :(得分:1)

您可以使用python可用的优化库之一,而不是处理(混合)整数编程。做谷歌搜索,你会发现很多。由于你的问题是凸的,cvxpy可以作为很多接口的一个很好的接口。这是一个使用内置整数编程求解器的玩具示例(对于大规模问题可能不是非常有效)

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.]]

答案 1 :(得分:0)

我确实提出了一个解决和(| Ax-y |)的相关解决方案,您可以将其转换为线性整数规划问题并使用PuLP求解。

基本思想是最小化受约束条件限制的目标函数和(err(i)):

Ax(i)-y(i)< = err(i)和Ax(i)-y(i)> = -err(i)。

与线性求解器兼容。