【问题标题】:Solving linear vector addition for positive integer coefficients求解正整数系数的线性向量加法
【发布时间】:2021-01-02 03:25:44
【问题描述】:

假设我有多个相同长度的不同向量

例子:

1: [1, 2, 3, 4]
2: [5, 6, 7, 8]
3: [3, 8, 9, 10]
4: [6, 9, 12, 3]

我想找出这些向量的最佳整数系数,使向量的总和最接近相应的指定目标向量。

目标向量:[55,101,115,60]

假设组合只涉及将数组相加(没有减法),我该怎么做呢?是否有任何 Python 库(numpy、scikit 等)可以帮助我做到这一点?我怀疑这是一个线性代数解决方案。

示例组合答案:[3, 3, 3, 1, 2, 4, 1, 1, 1, 2, 3, 4] 其中每个值都是这些数组之一。 (这只是一个随机的例子)

【问题讨论】:

  • 我会将其视为向量加法问题。我的建议是从一个维度的同一个问题开始,然后是两个......这应该会给你一些关于问题的直觉,这将使编码这个问题的方式更加清晰。我当然不会直接尝试编写此代码。它还将帮助您更好地定义问题。例如,只允许加法,还是可以减去“向量”?
  • @SimonR 感谢您的回复。我假设在这种情况下只允许添加。

标签: python arrays numpy linear-algebra


【解决方案1】:

你可以把你的问题写成一个线性方程组:

arr1[0] + b*arr2[0] + c*arr3[0] + d*arr4[0] = res[0]
a*arr1[1] + b*arr2[1] + c*arr3[1] + d*arr4[1] = res[1]
a*arr1[2] + b*arr2[2] + c*arr3[2] + d*arr4[2] = res[2]
a*arr1[3] + b*arr2[3] + c*arr3[3] + d*arr4[3] = res[3]
#For all positive a,b,c,d.

如果有确切的解决方案,您可以解决。

如果没有精确解,可以使用scipy 方法计算线性矩阵方程的非负最小二乘解,称为scipy.optimize.nnls

from scipy import optimize
import numpy as np

arr1 = [1, 2, 3, 4]
arr2 =  [5, 6, 7, 8]
arr3 = [3, 8, 9, 10]
arr4 = [6, 9, 12, 3] 

res = [55,101,115,60]

a = np.array([
    [arr1[0], arr2[0], arr3[0], arr4[0]],
    [arr1[1], arr2[1], arr3[1], arr4[1]],
    [arr1[2], arr2[2], arr3[2], arr4[2]],
    [arr1[3], arr2[3], arr3[3], arr4[3]]
])

solution,_ = optimize.nnls(a,res)

print(solution)

print('Coefficients before Rounding', solution)
solution = solution.round()
print('Coefficients after Rounding', solution)
print('Resuls', [arr1[i]*solution[0] + arr2[i]*solution[1] + arr3[i]*solution[2] + arr4[i]*solution[3] for i in range(4)])

这会打印出来

Coefficients before Rounding [0.         0.1915493  3.83943662 6.98826291]
Coefficients after Rounding [0. 0. 4. 7.]
Resuls [54.0, 95.0, 120.0, 61.0]

很接近,不是吗?

这确实可能不是完美的解决方案。但正如this thread 中所讨论的那样,“整数问题甚至都不容易解决”(@seberg)

【讨论】:

    猜你喜欢
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多