引き続き、回帰分析。
プロットしたデータから、n次の関数の係数を求めます。
y(),x() がプロットデータ、degree が関数の次数。
行列の演算には、https://ooltcloud.sakura.ne.jp/blog/201307/article_22014635.html で作成したクラスを使用しています。
例によってエラー処理はしてません。(たとえば、x() と y() の要素数が一致しているかとか確認してません)
Public Class Regression
''' <summary>
''' 係数の取得
''' </summary>
Public Shared Function GetPolynomialCoefficients(y As Double(), x As Double(), degree As Integer) As Double()
Dim Ymax = y.GetUpperBound(0)
Dim Xmax = x.GetUpperBound(0)
Dim N = degree
' 二次元配列に移し替え
Dim matY(Ymax, 0) As Double
For i = 0 To Ymax
matY(i, 0) = y(i)
Next
' 次数に応じた x() の行列を作成
Dim matX(Xmax, N) As Double
For i = 0 To Xmax
For j = 0 To N
matX(i, j) = x(i) ^ j
Next
Next
' 回帰分析
Dim r = Analyze(matY, matX)
Return r
End Function
''' <summary>
''' 回帰分析
''' </summary>
Public Shared Function Analyze(matY As Double(,), matX As Double(,)) As Double()
Dim mat1 = Matrix.Transpose(matX)
Dim mat2 = Matrix.Multiply(mat1, matX)
Dim mat3 = Matrix.Multiply(mat1, matY)
Dim mat4 = Matrix.Inverse(mat2)
Dim mat5 = Matrix.Multiply(mat4, mat3)
Dim N = mat5.GetUpperBound(0)
Dim r(N) As Double
For i = 0 To N
r(i) = mat5(i, 0)
Next
Return r
End Function
End Class
使い方的には以下。
' プロットデータ
Dim x() As Double = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
Dim y() As Double = {5, 8, 7, 8, 9, 11, 9, 11, 13, 12}
' 回帰分析 (プロットデータから2次式の各係数を求める)
Dim r = Regression.GetPolynomialCoefficients(y, x, 2)
' 結果
Console.WriteLine("{2}x^2 + {1}x + {0}", r(0), r(1), r(2))
結果出力
-0.0189393939393945x^2 + 0.953787878787864x + 4.78333333333336