7

numpy を使用して過決定線形連立方程式を解こうとしています。現在、私は次のようなことをしています(簡単な例として):

a = np.array([[1,0], [0,1], [-1,1]])
b = np.array([1,1,0])

print np.linalg.lstsq(a,b)[0]
[1.1.]

これは機能しますが、フロートを使用します。整数のみでシステムを解決する方法はありますか? 私はの線に沿って何かを試しました

print map(int, np.linalg.lstsq(a,b)[0])
[0, 1]

ソリューションをintの配列に変換するために、期待しています[1, 1]が、明らかに何かが欠けています。誰かが私を正しい方向に向けることができますか?

4

8 に答える 8

7

特殊な整数問題ソルバーを使用する必要があります(整数問題の解決は簡単ではないことに注意してください)。openoptは、たとえば、実行しているような整数2次最適化のための優れたラッパーを提供するパッケージです。線形代数を使おうとすると、直接正しい解が得られません。

あなたの問題は二次計画法のように書くことができますが、それは整数のものなので、それのためにopenoptまたは他のモジュールを使用してください。これは非常に単純で制約のないものなので、他のアプローチがあるかもしれません。しかし、初心者にとっては、最初は単純な問題ではなく、openoptなどにこの種の問題を効率的に解決する準備ができているプログラムがあります。

于 2012-12-16T10:45:28.180 に答える
4

線形ディオファントス方程式のシステムを見ています。Google ですばやく検索すると 、Felix Lazebnik によるSystems of Linear Diophantine Equationsが表示されます。その論文で、著者は次の質問を検討します。

線形方程式系 Ax = b が与えられた場合、ここで A = a(i,j) は整数エントリをもつ m × n 行列であり、b は整数成分をもつ m × 1 列ベクトルであり、系は整数解を持ちますか?つまり、整数成分を持つ n × 1 解ベクトル x ですか?

于 2012-12-16T12:43:36.857 に答える
2

When you convert to int, the decimal part of the elements gets truncated, so it is rounded down.

a = np.array([[1,0], [0,1], [-1,1]])
b = np.array([1,1,0])

x = np.linalg.lstsq(a,b)[0]

Result:

>>> x
array([ 1.,  1.])
>>> x[0]
0.99999999999999967
>>> x[1]
1.0000000000000002
>>> x.astype(int)
array([0, 1])
>>> map(int, x)
[0, 1]
>>> np.array([1.,1.]).astype(int) # works fine here
array([1, 1])
于 2012-12-16T03:18:02.177 に答える
1

私はあなたの問題を誤解しているかもしれませんが、 と の組み合わせが必要だと思いroundますastype(int)?

例えば

a = np.array([[1,0], [0,1], [-1,1]])
b = np.array([1,1,0])

x = np.linalg.lstsq(a,b)[0]
print x.round().astype(int)
于 2012-12-16T03:20:01.617 に答える
1

セバーグに+1してください。これは、ラウンドをマップするべきではないことを示す反例です:(
申し訳ありませんが、これはmatlabスタイルですが、簡単にPython化できます)

a =
     3     0
     0     3
     1     1
b = 
    2.71
   11.7
    0.5
x = a\b =
    0.5121
    3.5088
round(x) =
    1
    4
norm(a*round(x)-b) = 4.5193
norm(a*[0;4]-b) = 4.4367
norm(a*[1;3]-b) = 4.4299
于 2012-12-16T17:00:41.473 に答える