【エラー解決方法】 JavaのCommons-mathを使った回帰分析でエラーが発生!? を解決する方法
目次
JavaでCommons-mathという分析ライブラリを使い回帰分析を行っていたところ、エラーとなりプログラムが中断してしまいました。
データを確認しましたが、特に問題はなさそうです。
◯分析をしたデータ
サンプル数:10
非説明変数
[8.0, 9.0, 8.0, 7.0, 8.0, 9.0, 8.0, 8.0, 9.0, 6.0]
説明変数
[11.0, 19.7, 36.0, 121.0, 157.0, 0.0, 4.0]
[12.0, 20.0, 36.0, 121.0, 157.0, 0.0, 5.0]
[11.0, 16.0, 36.0, 121.0, 157.0, 0.0, 6.0]
[10.0, 18.0, 36.0, 121.0, 157.0, 1.0, 7.0]
[11.0, 20.3, 36.0, 121.0, 157.0, 1.0, 1.0]
[11.0, 17.2, 36.0, 121.0, 157.0, 0.0, 2.0]
[11.0, 18.6, 36.0, 121.0, 157.0, 0.0, 3.0]
[11.0, 19.4, 36.0, 121.0, 157.0, 0.0, 4.0]
[13.0, 18.8, 36.0, 121.0, 157.0, 0.0, 5.0]
[9.0, 21.1, 36.0, 121.0, 157.0, 0.0, 6.0]
エラー内容
重回帰分析(OLSMultipleLinearRegressionクラス、 estimateRegressionParameters()メソッド)を実行時にエラーとなる。
org.apache.commons.math3.linear.SingularMatrixException: matrix is singular
at org.apache.commons.math3.linear.QRDecomposition$Solver.solve
(QRDecomposition.java:354)
at org.apache.commons.math3.stat.regression.OLSMultipleLinearRegression.
calculateBeta(OLSMultipleLinearRegression.java:257)
at org.apache.commons.math3.stat.regression.AbstractMultipleLinearRegression.
estimateRegressionParameters(AbstractMultipleLinearRegression.java:264)
APIには以下のような説明が書かれています。
Exception to be thrown when a non-singular matrix is expected.
日本語訳:非特異行列が予想される場合、例外がスローされます。— リファレンスより
エラー発生時の環境
エラー発生時の開発環境は以下のとおりです。
- 言語
- Java1.7.0_51
- ライブラリ
- Commons-math3-3.6.1.jar
原因
作成された目的変数・説明変数の関係性が非特異行列であった。
→逆行列を持つデータでこのメソッドを使うとエラーとなる。
サンプル数(分析対象の数)に比べてパラメータ(説明変数の数)が多すぎるとなるようです。
Excelで同じ分析をしてみる
エラーとはならず結果が出ました。
説明変数3、4、5が値:0となっています。
これが原因でJavaではエラーとなっているようなので、この説明変数を削除して再度実行してみます。
◯再度分析をしたデータ
サンプル数:10
非説明変数
[8.0, 9.0, 8.0, 7.0, 8.0, 9.0, 8.0, 8.0, 9.0, 6.0]
説明変数
[11.0, 19.7, 0.0, 4.0]
[12.0, 20.0, 0.0, 5.0]
[11.0, 16.0, 0.0, 6.0]
[10.0, 18.0, 1.0, 7.0]
[11.0, 20.3, 1.0, 1.0]
[11.0, 17.2, 0.0, 2.0]
[11.0, 18.6, 0.0, 3.0]
[11.0, 19.4, 0.0, 4.0]
[13.0, 18.8, 0.0, 5.0]
[9.0, 21.1, 0.0, 6.0]
エラーとならず実行できました。
切片:3.7734833526402096
X値1:0.6820583241332874
X値2:-0.1362948034666226
X値3:-0.215015834657611
X値4:-0.1525086087490735
Excelで分析した場合と少し値が違っていますね・・・
説明変数を入れなおしてエクセルでも再実行してみました。
同じ値になりました。
解決方法
説明変数が非特異行列であるかのチェックをしてから、分析を行う。
→ライブラリには入っていないようなので、自作するしかないようです。
パラメータの数はよくばらずほどほどにしておきましょう。
まとめ
持っているデータをすべて使ってデータ分析しようとしたのが間違いでした。
初めに実行したデータの説明変数3、4、5は10個のデータの値がすべて一緒になっていました。
これでは意味がないです。
分析をする際には、説明変数の意味も考えながら選択しないとダメですね。
Pythonでも分析をしているので、気をつけてやっていきたいと思います。