[VB.NET] 回帰分析

2013年7月23日

 引き続き、回帰分析。
 プロットしたデータから、n次の関数の係数を求めます。
 y(),x() がプロットデータ、degree が関数の次数。
 行列の演算には、http://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





カテゴリー: Program, VB.NET

Follow comments via the RSS Feed | Leave a comment | Trackback URL

コメントを投稿する

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


«   »
 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org