Nederlog        

 

11 mei 2007

                                                                 

Basic Bayes in basic Basic

 



Ik heb het op deze plaats eerder over waarschijnlijkheid en Bayes gehad, en ook over programmeren en FreeBayes.

Wel, hier komen de themaas samen: Hieronder staat wat programmacode in Basic, geschreven in FreeBasic (maar zo elementair dat het waarschijnlijk nog in GWBasic werkt), dat de fundamenten van Bayesiaans redeneren verduidelijkt - ofwel: "Hoe mensen kunnen leren uit ervaring middels waarschijnlijkheden" - en dat eenvoudige experimenteren mogelijk maakt met het programmaatje Bayes.exe.

Het experimenteren bestaat eruit dat men zelf kan uitvinden wat er gebeurt voor gegeven F|T en F|~T - die de waarschijnlijkheden van F als T en van F als niet-T (= ~T) aangeven - met de waarschijnlijkheid van T wanneer men wel of niet verifieert en falsificeert in een frequentie evenredig aan F|T. (Meer gebruikelijke notaties zijn "pr(F|T)" en "pr(T)", maar ikzelf pleeg "pr(  )" weg te laten als het duidelijk is dat ik het over waarschijnlijkheden heb.)

Ik zou hier nog veel kunnen zeggen over Bayes en Bayesiaans redeneren, of over waarschijnlijkheid, maar u kunt dat ook op het internet nakijken, en op mijn site.

En ik zou ook veel kunnen zeggen over programmeren en Basic, maar als u echt geïnteresseerd bent kunt mijn stukje over FreeBasic nalezen en e.e.a. zelf ophalen en uitproberen.

Hieronder staat de code, die in FreeBasic compileert en werkt. Paars gekleurde tekst zijn commentaren. De rest is code, die er overigens veel fraaier uitziet in FBEdit, een fraaie gratis ontwikkelomgeving voor FreeBasic. (Deze laatste link laadt deze fraaie ontwikkel-omgeving.)

E.e.a. is ter illustratie, om te laten zien hoe programma-code in Basic er uit ziet.

Wie het programmaatje zelf wil uitproberen en geen FreeBasic heeft of wil kan het hier vinden, gezipt en al.

E.e.a. bestaat uit drie bestanden, Bayes.bas met de programma-code, Bayes.txt met een korte toelichting, en Bayes.exe met het gecompileerde programma.

Bayes.exe behoort gewoon te werken op een computer die Windows draait, en doet niets dan de onderstaande code.

Het is allemaal héél eenvoudig - maar de ideeën die het illustreert werden pas helder geformuleerd door Bayes in de 18e eeuw, en verklaren in beginsel veel over leren uit ervaring, en zijn het waard grondig overdacht te worden.

Programmacode voor Bayes.exe:


'' Bayesian reasoning illustrated

Dim Shared As Double h, i, j, f, g, a, b, c, d
Dim Shared As Integer nt, nf

Declare Sub GetProbabilities
Declare Sub ShowProbabilities
Declare Sub DoIfTrue
Declare Sub DoIfFalse

''------------------
'' Get probabilities from the user
Sub GetProbabilities

Input "F|T = ", h   ''Three necessary values from the user
Input "F|~T = ", i  ''to calculate the fundamental table in
Input "T = ", j       " ShowProbabilities

End Sub

''------------------
'' Display nicely
Sub ShowProbabilities

a = h*j ''Cell-values
b = (1-h)*j
c = i*(1-j)
d = (1-i)*(1-j)

Locate 7,5                   ''Labels
Print " F"
Locate 8,5
Print "~F"
Locate 6,12
Print " T"
Locate 6,22
Print "~T"

Locate 7,10
Print Using "#.####"; a  ''This nicely formats the output
Locate 8,10                  ''a,b,c,d are the cell-values
Print Using "#.####"; b
Locate 7,20 Print Using "#.####"; c
Locate 8,20
Print Using "#.####"; d

Locate 9,10
Print Using "#.####"; a+b ''The sums
Locate 9,20
Print Using "#.####"; c+d
Locate 7,30
Print Using "#.####"; a+c
Locate 8,30
Print Using "#.####"; b+d

Locate 11,10
Print "T = "                      ''Present value of T
Locate 11,18
Print Using "#.####"; a+b

Locate 12,10
Print "F = "                       ''Present value of F
Locate 12,18
Print Using "#.####"; a+c

f = a/(a+c)                       ''This is T|F for current cell-values
g = b/(b+d)                       ''This is T|~F        ,,

Locate 13,10
Print "T|F = "                     ''What T is in case F is true
Locate 13,18
Print Using "#.####"; f

Locate 14,10
Print "T|~F =  "                  ''What T is in case ~F is true
Locate 14,18
Print Using "#.####"; g

''The following is useful for longer experiments

Locate 11,30
Print "fr(t) = "        ''Frequency of verifications of F
Locate 11,44
Print Using "#.####"; nt / (nt+nf)

Locate 12,30
Print "nr(t) = "      ''Number of verifications of F (User Input = t)
Locate 12,44
Print nt

Locate 13,30
Print "nr(f) = "      ''Number of falsifications of F (User Input = f)
Locate 13,44
Print nf

Locate 14,30
Print "nr(tests) = "   ''Number of tests
Locate 14,44
Print (nt+nf)

End Sub
''------------------

'' If T(rue) update
Sub DoIfTrue
Dim count As Integer

j = f                    ''f is the new value for T if F
count = nt+1
nt = count           ''Add 1 verification of F

Locate 3,1
Print "T = "
Locate 3,10
Print Using "#.####"; j
ShowProbabilities

End Sub
''------------------

'' If F(alse) update
Sub DoIfFalse
Dim count2 As Integer

j=g                       ''g is the new value for T if ~F
count2 = nf+1
nf = count2            ''Add 1 falsification of F

Locate 3,1
Print "T = "
Locate 3,10
Print Using "#.####"; j
ShowProbabilities

End Sub
''------------------

'' Programstart
''=======================
nt = 0                    ''Initial values for nt = nr of verifications
nf = 1                    ''and nf = nr of falsifications

GetProbabilities        '' Get userInput
ShowProbabilities     '' Show calculated probabilities

Dim As String key     ''For the following Do-Loop

Do                         '' Do-Loop until exit

Locate 16,5             '' Dogsimple user-interface
Input "Enter N(ew), T(rue), F(alse) or eXit : ", key
key = LCase(key)

If key = "n" Then      ''A new start
Cls
nt = 0
nf = 1
GetProbabilities
ShowProbabilities
EndIf

If key = "t" Then       ''Update T and the table
DoIfTrue
EndIf

If key = "f" Then        ''Update T and the table
DoIfFalse
EndIf

If key = "x" Then        ''End program
Exit Do
End If

Loop

''=======================
'' Programend
'' NB: Printing problems for very small values.
'' Needs no cure in this program..


Opmerking over de code:

E.e.a. doet het probleemloos in Windows, maar als u waarschijnlijkheden invoert of bereikt die kleiner zijn dan 0.0001 dan komt er onschadelijk onzin op het scherm. Dit is omdat het programmaatje getallen kleiner dan dat niet meer korrekt formatteert. (Met "n" voor nieuw krijgt u een nieuw begin in Bayes.exe. Met "x" verlaat u Bayes.exe.)

Dit is heel makkelijk te repareren voor wie een beetje Basic kan programmeren, maar zou de code alleen langer en dus minder duidelijk maken. De bovenstaande code behoort redelijk duidelijk te zijn ook voor wie nooit in Basic codeerde, althans voor wie Bayes.exe uitprobeert met een oogje op de bovenstaande programma-code.

P.S. Over virussen e.d.:

Ik heb geheel niets verstopt in Bayes.exe en Bayes.zip, maar als u mij niet vertrouwt moet u het niet gebruiken. De versie van Bayes.exe in de zip die ikzelf gecompileerd heb is van 11 mei 2007, 15.36 en is 41,984 bytes groot. En e.e.a. staat op c.q. behoort te komen van maartensz.org.

P.P.S. 12 mei: Zie 12 mei voor een update.

Maarten Maartensz

 

        home - index - top - mail