← All NMath Code Examples
Imports System
Imports CenterSpace.NMath.Core
Namespace CenterSpace.NMath.Examples.VisualBasic
A .NET example in Visual Basic demonstrating the features of the classes for solving iteratively reweighted
least squares problems.
Module IterativelyReweightedLeastSqExample
Sub Main()
Set up a least squares problem, Ax = b, with random data.
Dim RNG As New RandGenUniform(-2, 2, 124)
Dim Rows As Integer = 10
Dim Cols As Integer = 2
Dim A As New DoubleMatrix(Rows, Cols, RNG)
Dim X As New DoubleVector(Cols, RNG)
Fix up the right hand side b so that x
is the exact solution, then throw in some outliers.
Dim B As DoubleVector = NMathFunctions.Product(A, X)
Throw in a few outliers...
B(1) = 23
B(4) = -10
Create an iteratively reweighted least squares instance
and use it to solve the problem using the default settings.
The default weighting is DoubleBisquareWeightingFunction which
uses the bisquare weighting algorithm.
Dim Irls As New DoubleIterativelyReweightedLeastSq()
Solve. The third parameter below specifies prepending a column of ones to the
data in A representing a constant term in the model (which should come out
to be zero in the solution from the way we cooked the data). Note that our
input matrix A will not actually be changed.
Dim Solution As DoubleVector = Irls.Solve(A, B, True)
Console.WriteLine()
Console.WriteLine("Solution with bisquare weighting")
Console.WriteLine(Solution.ToString("G5"))
Console.WriteLine()
Console.WriteLine("||residuals|| = " & Irls.Residuals.TwoNorm())
Console.WriteLine()
If (Irls.Iterations >= Irls.MaxIterations) Then
Console.WriteLine("The algorithm did not converge in {0} iterations.", Irls.MaxIterations)
Else
Console.WriteLine("Algorithm converged in {0} iterations.", Irls.Iterations)
End If
Change some of the settings that control the iteration.
Irls.MaxIterations = 300
Irls.Tolerance = 0.0000001
The convergence function is a delegate that may specified by the user for
determining if the algorithm has converged and iteration terminated. The
delegate takes as arguments the previous and current solutions and residuals
and the tolerance and returns a bool. See the ResidualsChanged function
below.
Dim ResidualsUnchanged As New DoubleIterativelyReweightedLeastSq.ToleranceMetFunction(AddressOf ResidualsUnchangedFunction)
Irls.ConvergenceFunction = ResidualsUnchanged
Change the weighting function used from the default bisquare weighting to the
fair weighting function. See the class DoubleFairWeightingFunction for
particulars.
Irls.WeightsFunction = New DoubleFairWeightingFunction()
Solve the problem with the new settings.
Solution = Irls.Solve(A, B, True)
Console.WriteLine()
Console.WriteLine("Solution with fair weighting")
Console.WriteLine(Solution.ToString("G5"))
Console.WriteLine()
Console.WriteLine("||residuals|| = " & Irls.Residuals.TwoNorm())
Console.WriteLine()
If (Irls.Iterations >= Irls.MaxIterations) Then
Console.WriteLine("The algorithm did not converge in {0} iterations.", Irls.MaxIterations)
Else
Console.WriteLine("Algorithm converged in {0} iterations.", Irls.Iterations)
End If
Console.WriteLine()
Console.Write("Press Enter Key")
Console.Read()
End Sub
Convergence function for use in the iteratively reweighted least squares
algorithm. This particular convergence function returns true when the residuals
from the current iterations are relatively the same as the residuals in the
previous iteration.
Private Function ResidualsUnchangedFunction(ByVal Tolerance As Double, ByVal LastSolution As DoubleVector, _
ByVal CurrenSolution As DoubleVector, ByVal LastResiduals As DoubleVector, ByVal CurrentResiduals As DoubleVector) As Boolean
Dim MaxAbsDiff As Double = NMathFunctions.MaxAbsValue(CurrentResiduals - LastResiduals)
Return (MaxAbsDiff / NMathFunctions.MaxAbsValue(CurrentResiduals)) < Tolerance
End Function
End Module
End Namespace
← All NMath Code Examples