IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Multiple Regression Linéaire utilisant la librairie Math.Net


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Trader / Formateur / Développeur Options CBOE
    Inscrit en
    Septembre 2018
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afrique Du Sud

    Informations professionnelles :
    Activité : Trader / Formateur / Développeur Options CBOE
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2018
    Messages : 86
    Par défaut Multiple Regression Linéaire utilisant la librairie Math.Net
    Bonjour,

    J'essaie de répliquer l'exemple fourni dans la doc succincte de Math.Net, plus orientée C#...
    Lien: https://numerics.mathdotnet.com/Regression.html
    J'ai donc essayé de coder mes vecteurs d'entrées et sortie en utilisant un "jagged array", mais j'ai encore un souci avec l'opérateur lambda (inline functions).
    Je ne dois pas être loin du but mais ça a l'air vraiment plus simple en C# !

    Voici mon bout de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
            Dim impvol(IV(0).Count) As Double
            Dim predictors1 As Double()() = New Double(2)() {} ' MN,DTE
            Dim predictors2 As Double()() = New Double(2)() {} ' STRIKE,DTE 
     
            Try
                For i = 1 To MN(0).Count
                    predictors1(i) = New Double() {CType(MN(0).Item(i), Double), CType(IV(0).Item(i), Double)}
                Next
                For i = 1 To Strike(0).Count
                    predictors2(i) = New Double() {CType(Strike(0).Item(i), Double), CType(IV(0).Item(i), Double)}
                Next
                For i = 1 To UBound(impvol)
                    impvol(i) = CType(IV(0).Item(i), Double)
                Next
     
            Catch exc As Exception
                MessageBox.Show("Conversion Error (Vol Surface)")
                Exit Sub
            End Try
     
            ' Model Surface is Y = a + bX1 + cX2 + dX1X2 + eX1^2 + fX2^2
            ' The following inline model functions are needed here to regress the 3D surface
     
            'Dim p0 As Func(Of Double, Double) = Function(x) 1
            'Dim p1 As Func(Of Double, Double) = Function(x) x
            'Dim p2 As Func(Of Double(), Double) = Function(x) x(1) * x(2)
            'Dim p3 As Func(Of Double, Double) = Function(x) x ^ 2
            Dim p0 = Function(x As Double) 1
            Dim p1 = Function(x As Double) x
            Dim p2 = Function(x As Double, y As Double) x * y
            Dim p3 = Function(x As Double) x ^ 2
     
     
            Dim regparams1() As Double = MathNet.Numerics.Fit.LinearMultiDim(predictors1, impvol,
                                       p0, p1(predictors1(0)), p1(predictors1(1)), p2(predictors1(0), predictors1(1)), p3(predictors1(0)), p3(predictors1(1)))
     
            Dim regparams() As Double = MathNet.Numerics.Fit.LinearMultiDim(predictors1, impvol, Numerics.LinearRegression.DirectRegressionMethod.QR)
    J'ai essayé deux façons pour définir les pointeurs de fonction (p1, p2, p3 et p4) mais le premier exemple (regparams1) refuse de compiler, ce que je comprends, mais je ne sais pas comment transcrire ce qui a l'air de fonctionner en C# (voir lien Math.Net ci-dessus)

    Merci par avance
    Bruno

  2. #2
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bpnjour

    La déclaration de l’opérateur lambda "inline" dans l'appel à la fonction Fit.LinearMultiDim n(est pas possible en VB.Net mais ce problème est surmontable ..
    Note d'abord que tu as affaire à une régression multilinéaire portant sur un vecteur à 2 dimensions v(x1 , x2) et par suite la fonction la plus appropriee en .Net est :
    -Func(Of Double(), Double) ou
    - 1er paramétré spécifie le type du paramétré d'appel,
    - 2eme paramètre spécifie le type du paramètre de retour

    Note ensuite que ton 2eme appel à Fit.LinearMultiDim même s'il compile lèvera exception à l’exécution
    car Fit.LinearMultiDim ,ne comporte aucune signature sans les "basis functions"

    Pour le reste voici ton code modifie qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    ' Model Surface is Y = a + bX1 + cX2 + dX1X2 + eX1^2 + fX2^2
    Imports MathNet
    Imports MathNet.Numerics
    Imports MathNet.Numerics.LinearRegression
    Imports System.Text
    Public Class FormModelSurface
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Solve()
        End Sub
        Private Sub Solve()
            ' coeff constants ,a,b,c,d,e,f
            ' Nota Bene :6 coeffs
            Dim impvol(5) As Double
            impvol = New Double() {10.0, 15.0, -7.0, 5.0, 9.0, -9.0}
     
            ' Nota Bene : 6 variables explicatives (xi,yi)
            ' STRIKE  & DTE
            ' ces longues lignes de code  sont données à des fins explicatives
            Dim predictorsX1X2(5)() As Double
            predictorsX1X2(0) = New Double() {2.0, 5.0} ' MN
            predictorsX1X2(1) = New Double() {2.0, 5.0}
            predictorsX1X2(2) = New Double() {2.0, 5.0}
     
            predictorsX1X2(3) = New Double() {4.0, 7.0} ' STRIKE
            predictorsX1X2(4) = New Double() {4.0, 7.0}
            predictorsX1X2(5) = New Double() {4.0, 7.0}
     
            ' l'initiation de predictorsX1X2 peut se faire ainsi
            'Dim predictorsX1Y1()() As Double =
            '    {
            '        New Double() {2.0, 5.0}, New Double() {2.0, 5.0}, New Double() {2.0, 5.0},
            '        New Double() {4.0, 7.0}, New Double() {4.0, 7.0}, New Double() {2.0, 7.0}
            '    }
            'les basis functions
            Dim p00 = Function(x() As Double) 1.0         'constante a
            Dim p11 = Function(x() As Double) x(0)        'bX1
            Dim p12 = Function(x() As Double) x(1)        'cX2
            Dim p22 = Function(x() As Double) x(0) * x(1) 'dX1X2
            Dim p31 = Function(x() As Double) x(0) ^ 2    'eX1¨2
            Dim p32 = Function(x() As Double) x(1) ^ 2    'fX2^2
            Dim ss As Func(Of Double(), Double)
            'l'appel de l'API se fait simplement ainsi 
            ' et Dieu reconaitra les siens
            Dim regparams1() As Double =
                    Fit.LinearMultiDim(
                        predictorsX1X2,
                        impvol,
                        p00,
                        p11,
                        p12,
                        p22,
                        p31,
                        p32
                        )
     
            Me.TextBox1.Text = PrintResult(regparams1)
     
            Try
                'quant à ce code ,sans les "basis functions" 
                's'il compile ;il leve une exception à l'éxecution 
                ' car Fit.LinearMultiDim ,ne comporte aucune signature
                ' sans les "basis functions"
                Dim regparams2() As Double =
                    Fit.LinearMultiDim(
                        predictorsX1X2,
                        impvol,
                        DirectRegressionMethod.QR,
                        p00,
                        p11,
                        p12,
                        p22,
                        p31,
                        p32)
     
                Me.TextBox2.Text = PrintResult(regparams2)
            Catch ex As Exception
                MessageBox.Show("Conversion Error (Vol Surface)")
                Exit Sub
            End Try
     
        End Sub
        Private Function PrintResult(arr() As Double) As String
            Dim sb As New StringBuilder()
            For i As Integer = 0 To arr.Length - 1
                sb.AppendLine(arr(i).ToString())
            Next
            Return sb.ToString()
        End Function
    End Class
    bon code...

  3. #3
    Membre confirmé
    Homme Profil pro
    Trader / Formateur / Développeur Options CBOE
    Inscrit en
    Septembre 2018
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afrique Du Sud

    Informations professionnelles :
    Activité : Trader / Formateur / Développeur Options CBOE
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2018
    Messages : 86
    Par défaut
    Merci Mabrouki !!!
    Mon exemple était un peu confus ce qui fait que le calcul que tu proposes serait pour le moins bizarre :-)
    En tout cas j'ai compris ta résolution du problème. Merci encore !!!
    Je ne sais pas si Dieu reconnaîtra les siens.
    C'est une locution que j'évite puisque c'est celle qui fut utilisée dans la croisade contre les Cathares.
    Je préfère penser que le monde est toujours meilleur dans sa diversité.
    En tout cas, dans ton code, je reconnaîtrai les miens.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Regression linéaire multiple
    Par Newenda dans le forum Bibliothèques d'apprentissage automatique
    Réponses: 0
    Dernier message: 12/05/2017, 18h11
  2. Connexion SSL multiple - Librairie SSH-net/Multi
    Par Invité dans le forum Ruby
    Réponses: 2
    Dernier message: 18/01/2015, 12h16
  3. Réponses: 3
    Dernier message: 14/02/2012, 11h57
  4. [.NET] Comment utiliser une librairie .Jar ?
    Par joKED dans le forum Framework .NET
    Réponses: 6
    Dernier message: 05/10/2006, 12h17
  5. Utilisation de librairies .net c++ au sein de python
    Par petitmatin dans le forum Interfaçage autre langage
    Réponses: 3
    Dernier message: 15/02/2006, 09h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo