Least Squares in Visual Basic QuickStart Sample

Illustrates how to solve least squares problems using classes in the Numerics.NET.LinearAlgebra namespace in Visual Basic.

View this sample in: C# F# IronPython

Option Infer On

' The DenseMatrix and DoubleVector classes resides in the 
' Numerics.NET.LinearAlgebra namespace.
Imports Numerics.NET
Imports Numerics.NET.LinearAlgebra

' Illustrates the use of matrix decompositions for solving systems of
' simultaneous linear equations and related operations using the 
' Decomposition class and its derived classes from the
' Numerics.NET.LinearAlgebra namespace of Numerics.NET.
Module LeastSquares

    Sub Main()
        ' The license is verified at runtime. We're using
        ' a 30 day trial key here. For more information, see
        '     https://numerics.net/trial-key
        Numerics.NET.License.Verify("64542-18980-57619-62268")

        ' A least squares problem consists in finding
        ' the solution to an overdetermined system of
        ' simultaneous linear equations so that the
        ' sum of the squares of the error is minimal.
        '
        ' A common application is fitting data to a
        ' curve. See the CurveFitting sample application
        ' for a complete example.

        ' Let's start with a general matrix. This will be
        ' the matrix a in the left hand side ax=b:
        Dim a = Matrix.CreateFromArray(6, 4, New Double() _
             {
              1, 1, 1, 1, 1, 1,
              1, 2, 3, 4, 5, 6,
              1, 4, 9, 16, 25, 36,
              1, 2, 1, 2, 1, 2
             }, MatrixElementOrder.ColumnMajor)
        ' Here is the right hand side:
        Dim b = Vector.Create(New Double() {1, 3, 6, 11, 15, 21})
        Dim b2 = Matrix.CreateFromArray(6, 2, New Double() _
             {
              1, 3, 6, 11, 15, 21,
              1, 2, 3, 4, 5, 7
             }, MatrixElementOrder.ColumnMajor)
        Console.WriteLine($"a = {a:F0}")
        Console.WriteLine($"b = {b:F0}")

        '
        ' The LeastSquaresSolver class
        '

        ' The following creates an instance of the
        ' LeastSquaresSolver class for our problem:
        Dim solver = New LeastSquaresSolver(Of Double)(a, b)
        ' We can specify the solution method: normal
        ' equations or QR decomposition. In most cases,
        ' a QR decomposition is the most desirable:
        solver.SolutionMethod = LeastSquaresSolutionMethod.QRDecomposition
        ' The Solve method calculates the solution:
        Dim x = solver.Solve()
        Console.WriteLine($"x = {x:F4}")
        ' The Solution property also returns the solution:
        Console.WriteLine($"x = {solver.Solution:F4}")
        ' More detailed information is available from
        ' additional methods.
        ' The values of the right hand side predicted 
        ' by the solution:
        Console.WriteLine($"Predictions = {solver.GetPredictions():F4}")
        ' The residuals (errors) of the solution:
        Console.WriteLine($"Residuals = {solver.GetResiduals():F4}")
        ' The total sum of squares of the residues:
        Console.WriteLine("Residual square error = {0:F4}",
                solver.GetResidualSumOfSquares())

        '
        ' Direct normal equations
        '

        ' Alternatively, you can create a least squares
        ' solution by providing the normal equations
        ' directly. This may be useful when it is easy
        ' to calculate the normal equations directly.
        ' 
        ' Here, we'll just calculate the normal equation:
        Dim aTa = SymmetricMatrix(Of Double).FromOuterProduct(a)
        Dim aTb = Matrix.Multiply(a, TransposeOperation.Transpose, b)
        ' We find the solution by solving the normal equations
        ' directly:
        x = aTa.Solve(aTb)
        Console.WriteLine($"x = {x:F4}")
        ' However, properties of the least squares solution, such as
        ' error estimates and residuals are not available.

        Console.Write("Press Enter key to exit...")
        Console.ReadLine()
    End Sub

End Module