7

単純な線形回帰関数を作成しようとしていますが、引き続き

numpy.linalg.linalg.LinAlgError:特異行列エラー

既存の関数(デバッグ出力付き):

def makeLLS(inputData, targetData):
    print "In makeLLS:"
    print "    Shape inputData:",inputData.shape
    print "    Shape targetData:",targetData.shape
    term1 = np.dot(inputData.T, inputData)
    term2 = np.dot(inputData.T, targetData)
    print "    Shape term1:",term1.shape
    print "    Shape term2:",term2.shape
    #print term1
    #print term2
    result = np.linalg.solve(term1, term2)
    return result

テストデータを含むコンソールへの出力は次のとおりです。

In makeLLS:
    Shape trainInput1: (773, 10)
    Shape trainTargetData: (773, 1)
    Shape term1: (10, 10)
    Shape term2: (10, 1)

次に、linalg.solve行でエラーが発生します。これは教科書の線形回帰関数であり、なぜ失敗するのか理解できないようです。

特異行列エラーとは何ですか?

4

2 に答える 2

18

他の回答で説明されているようにlinalg.solve、フルランクの行列が必要です。これは、すべてのランクで機能する線形回帰ではなく、行列方程式を解こうとするためです。

線形回帰にはいくつかの方法があります。私が提案する最も簡単な方法は、標準の最小二乗法です。numpy.linalg.lstsq代わりに使用してください。例を含むドキュメントはこちらです。

于 2010-10-13T07:44:46.757 に答える
8

特異行列は、行列式がゼロの行列です。これは、行列に線形独立ではない行があることを示しています。たとえば、行の1つが他の行から線形独立していない場合、他の行の線形結合によって構築できます。numpyのlinalg.solveの例を使用して説明します。ドキュメントの例は次のとおりです。

>>> import numpy as np
>>> a = np.array([[3,1], [1,2]])
>>> b = np.array([9,8])
>>> x = np.linalg.solve(a, b)
>>> x
array([ 2.,  3.])

今、私はaそれを単数にするために変更します。

>>> a = np.array([[2,4], [1,2]])
>>> x = np.linalg.solve(a, b)
...
LinAlgError: Singular matrix

最初の行は2番目の行の2倍であるため、これは非常に明白な例ですが、うまくいけばポイントが得られます。

于 2010-10-13T03:57:15.583 に答える