-->

maandag 10 april 2017

4 op een rij (twee menselijke spelers)

Introductie

Een AI-agent is een combinatie van algoritmen dat er voor zorgt dat de best mogelijk beslissing wordt genomen gegeven bepaalde onzekerheid in de omgeving waarin de agent acteert.

Vier op een rij is een voorbeeld van het vinden van een oplossing in een adversarial-omgeving. M.a.w. een omgeving met een tegenspeler. Een veel gebruikt algoritme om in deze omgeving om de beste beslissing te nemen is het minmax-algoritme.

Uiteindelijk is het best een ingewikkeld programma om een goede 4 op een rij speler te programmeren. Daarom ga ik het programma stapsgewijs opzetten:

Stap 1. 4 op een rij met twee menselijke spelers. Dit lijkt mij de meest eenvoudige versie om te maken

Stap 2. 4 op een rij waarbij de gebruiker tegen een (zeer simpele) AI-agent speelt. De AI-agent weet enkel wat geldige zetten zijn (kies een kolom tussen 0 en 7 en die niet vol is). Als keuze voor de kolom gebruikt ie een randomize-functie.

Stap 3. 4 op een rij waarbij de gebruiker tegen een iets intelligentere agent speel. Deze agent kent ook de geldige zetten, maar kijkt ook naar de stand van het bord om zijn keuze te maken. Hierbij zijn twee varianten te maken. Een agent die alleen kijkt of hij bij de volgende stap 2,3, op 4 op een rij heeft of een agent die ook kijkt of hij kan voorkomen dat de gebruiker 4 op een rij krijgt.

Stap 4. De agent kijkt niet alleen naar geldige stappen en maakt een inschatting wat de beste volgende stap. Deze agent houdt bij zijn inschatting ook rekeing met 2 of meer toekomstige stappen van hem en zijn tegenstander.  Dit is in feite het minmax algoritme  in combinatie met een utitliteitsfunctie. Meestal worden deze agenten pas echt als enigzins intelligent gezien. Vooral als agenten meer dan twee of drie stappen vooruit kunnen redeneren. Stap 4 lijkt een recursieve versie van stap drie te zijn. 

Spelregels

  1. Vier op een rij wordt gespeeld op een (verticaal) bord van 8x6 vakken
  2. Er zijn twee spelers
  3. De spelers spelen om de beurt
  4. Een beurt bestaat uit het vullen van een vak met het symbool van de betreffende speler (rood, geel: hier kruisje, rondje)
  5. Een vak kan alleen gevuld worden als het op de bodem van het veld is of als het onderliggende vak gevuld is.
  6. Degene die als een eerste een reeks van vier dezelfde symbolen heeft horizontaal, verticaal of diagonaal, heeft gewonnen.

Stap 1: Java programma (twee menselijke spelers)


  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
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication9;
import java.util.Scanner;

/**
 *
 * @author gerard
 */

public class VierOpEenRij {
    private static final char[] spelers = new char[] { 'X', 'O' };

    private final int breedte, hoogte;
    private final char[][] bord;
    private int gekozenKolom = -1; // laatst gekozen kolom
    private int grensRij = -1;// hoogste rij (grensrij)bij deze kolom

    public VierOpEenRij(int pbreedte, int phoogte) {
        this.breedte = pbreedte;
        this.hoogte = phoogte;
        this.bord = new char[phoogte][pbreedte];
        char aChar = '.';

        for (int rij = 0; rij < this.bord.length; rij++)
          {
        for (int kolom = 0; kolom < this.bord[rij].length; kolom++)
        {
            this.bord[rij][kolom] = aChar;
        }
    }   
}   
        
    public String toString() {
        String BordBeeld = "";
        for (int rij = 0; rij < this.bord.length; rij++)
           {
           for (int kolom = 0; kolom < this.bord[rij].length; kolom++)
           {
            BordBeeld = BordBeeld + this.bord[rij][kolom];
           }
           BordBeeld = BordBeeld + "\n";
           }
       return BordBeeld; 
       
     }

    /**
     * geeft speler een keus tot een geldige keus is gemaakt
     */ 
    public void KiesKolom(char psymbol) {
        
           Scanner keyboard = new Scanner(System.in);
             
           
        
      do {           
            int kol = keyboard.nextInt();

            if (! (0 <= kol && kol < this.breedte)) {
                System.out.println("Kolom moeten tussen 0 and " +
                                   (this.breedte - 1) + " zijn");
                continue;
            }
            
            for (int h = this.hoogte - 1; h >= 0; h--) {
                               
                if (this.bord[h][kol] == '.') {// er is nog ruimte
                    this.gekozenKolom = kol;
                    this.grensRij = h;
                    this.bord[this.grensRij][this.gekozenKolom] = psymbol;
                    return;
                }
               
            }
             System.out.println("Kolom " + kol + " is vol.");
        } while (true);
    }

    /**
     * bekijk per zet of er een winnende reeks is gemaakt
     */
    public boolean WinnendeZet() {
     
        char sym = this.bord[this.grensRij][this.gekozenKolom];
        String reeks = String.format("%c%c%c%c", sym, sym, sym, sym);
        return bevat(this.horizontaal(), reeks) ||
               bevat(this.vertikaal(), reeks) ||
               bevat(this.slashDiagonaal(), reeks) ||
               bevat(this.backslashDiagonaal(), reeks);
    }

    /**
     * zit er een winnende reeks in de horizontale rij
     */
    private String horizontaal() {
        return new String(this.bord[this.grensRij]);
    }

    /**
     * zit er een winende reeks en ide verticale rij
     */
    private String vertikaal() {
        StringBuilder sb = new StringBuilder(this.hoogte);
        for (int h = 0; h < this.hoogte; h++) {
            sb.append(this.bord[h][this.gekozenKolom]);
        }
        return sb.toString();
    }

    /**
     *  
     * 
     */
    private String slashDiagonaal() {
        StringBuilder sb = new StringBuilder(this.hoogte);
        for (int h = 0; h < this.hoogte; h++) {
            int w = this.gekozenKolom + this.grensRij - h;
            if (0 <= w && w < this.breedte) {
                sb.append(this.bord[h][w]);
            }
        }
        return sb.toString();
    }

    /**
     *
     */
    private String backslashDiagonaal() {
        StringBuilder sb = new StringBuilder(this.hoogte);
        for (int h = 0; h < this.hoogte; h++) {
            int w = this.gekozenKolom - this.grensRij + h;
            if (0 <= w && w < this.breedte) {
                sb.append(this.bord[h][w]);
            }
        }
        return sb.toString();
    }

    private boolean bevat(String hooiberg, String naald) {
        return hooiberg.contains(naald);
    }

    public static void main(String[] args) {
        
        int speler = 0;
        VierOpEenRij bord = new VierOpEenRij(8, 6);
     
       
        System.out.println("Kies tussen 0 en 7 voor je kolom.");
             
            for (int maxzetten=6*8; maxzetten>0; maxzetten--) {
                char symbol = spelers[speler];
                             
                   
                   System.out.println(bord);
                   System.out.print("\nSpeler " + symbol + " aan zet: ");
                           
                   bord.KiesKolom(symbol);
                   
                   
                
                   if (bord.WinnendeZet()) {
                       System.out.println("Speler " + symbol + " wint!");
                      return;
                   }
                
                speler = 1 - speler;
              }  
           
            System.out.println("Remise.");
        }
    }



 


dinsdag 4 april 2017

Sudoku Solver

Veel AI-algoritmes gaan over het vinden van een oplossing en hoe je deze zo effectief en effcient mogelijk weet te vinden. Sudoko is bij uitstek een spelletje waar je dit soort zoekalgoritmen kunt toepassen.

Bij sudo moet je een combinatie van getallen vinden in een veld van 9x9 zodanig dat:
- in iedere rij een getal tussen 1 en 9 maar één keer voorkomt
- in iedere kolom een getal tussen 1 en 9 maar één keer voorkomt
- in iedere 3x3 box een getal tussen 1 en 9 maar één keer voorkomt.

Er zijn bij de start van het spel altijd al enkele getallen gegeven.

Een manier om een sudoku op te lossen is om alle combintatie uit te proberen en te checken welke aan de eisen voldoet. Deze manier werkt, maar er zijn nogal wat mogelijkheden 9 in ieder cel namelijk en we hebben 81 cellen, dus er zijn 9 tot de macht 81 mogelijkheden!


In het dit programma wordt een iets intelligentere (efficientere) strategie gebruikt.  Het is geschreven in Java. Het is een ingewikkeld stukje software omdat het gebruikt maakt van recursie en backtracking.  Verder is er wat gegoogeld met rij en kolom nummers in de vorm van 1x1 arrays omdat java deze by reference doorgeeft in niet zoals standaard by value.






De werking van het zoek-algoritme is als volgt:

 Find row, col of an unassigned cell
  If there is none, return true
  For digits from 1 to 9
    a) If there is no conflict for digit at row,col
        assign digit to row,col and recursively try fill in rest of grid
    b) If recursion successful, return true
    c) Else, remove digit and try another // backtracking gedeelte
  If all digits have been tried and nothing worked, return false


donderdag 23 maart 2017

Propositionele logica


Introductie

Logica heeft in de IT altijd al een grote rol gespeeld, maar in AI staat het logisch redeneren nog centraler. Kenmerkend voor AI-toepassingen ten opzichte van traditionele programma's is dat ze beter kunnen omgaan met onzekerheid. Waar in de traditionele automatisering onzekerheid zo veel mogelijk werd geëlimineerd, draait het er bij AI om dat, gegeven onzekerheid toch optimale beslissingen kunnen worden genomen.

Een van de bronnen van onzekerheid is dat het niet mogelijk is om een volledig beeld van de werkelijkheid te krijgen. We hebben een beperkt beeld van de werkelijkheid en die beschrijven we vaak met taal of met formules. (The language of logic) 

Het is wel mogelijk om iets nieuws van de werkelijk te ontdekken door al die zinnen slim te combineren. Met andere woorden door te redeneren.(logical reasoning). Redeneren is op basis van bepaalde uitspraken tot nieuwe inzichten komen via een aantal denkstappen.

De kunst is natuurlijk om de juiste denkstappen te nemen, anders maak je een beschrijving van de wereld die niet overeenkomt met de werkelijkheid. De propositielogica en relationele logica gaan hier over.

Een andere vraag is in hoeverre  je computers deze denkstappen kunt laten maken. Dit lijtk steeds beter te lukken. In veel AI-applicaties zie je rules-engines of theorem-provers terug. M.a.w. mechanismen die redeneren om op basis van bestaande dat iets nieuws te concluderen.

1. Syntax

Een atomaire propositie is een bewering die waar of niet waar is. Bijvoorbeeld: "2 is deelbaar", "Gerda is geweldig".

Een propositionele formule (of zin)  wordt samengesteld door het combineren van atomaire proposities en logische operatoren.

Er zijn verschillende logische operatoren:

\begin{align} \lnot&\; negatie (niet)\\ \land&\; conjunctie(en)\\ \lor&\; disjunctie(of)\\ \rightarrow&\; implicatie(als..dan)\\ \leftrightarrow&\; equivalentie (dan en slechts dan)\\ \end{align} Een voorbeeld van een propositione formule is: \begin{align} ((p \leftrightarrow r)\land (r \leftrightarrow q))\rightarrow& (p \leftrightarrow q) \end{align}
De syntax van propositielogica wordt in Backus Nauer Form als volgt gedefinieerd:

zin ::= <atomaire_propositie> | <formule>
<atomaire_propositie> := True | False | p | q | q | ... 
<formule> := $\lnot$ <formule>
| <formule> $\land$ <formule>
| <formule> $\lor$ <formule>
| <formule> $\rightarrow$ <formule>
| <formule> $\leftrightarrow$ <formule>
 
 De operatorvolgorde is haakjes, negatie, conjunctie, disjunctie, implicatie en equivalentie. Bij gelijke orde wordt er van links naar rechts gewerkt.

2. Semantiek

Een interpretatie houdt in dat aan een propositie een waarde wordt toegekend (Bijvoorbeeld: waar of niet waar, 0 of 1). Hieronder volgen twee voorbeelden van interpretaties  met drie proposities p, q, r.



Voorbeeld 1: 
\begin{align}
p^i = 1\\
q^i = 0 \\
r^i = 1\\
\end{align}
voorbeeld 2: 
\begin{align}
p^i = 0\\
q^i = 1 \\
r^i = 0\\
\end{align}

Uit de de interpretatie van de operators wordt met behulp van de interpretatie van de proposities vastgesteld. Aldus onstaat een waarheidstabel.




Het waarheidsgehalte van een formule kan worden afgeleid van de waarheidsgehaltes van de afzonderlijke atomaire proposities.

3. werken met één zin

Evaluatie is het vaststellen van het waarheidsgehalte van een samengestelde zin, gegeven een interpretatie (oftewel een truth assignment) van de propositionele constanten. Neem bijvoobeeld de zin  (p ∨ q) ∧ (¬q ∨ r) en interpretatie j:


pj = 0
qj = 1
rj = 0

(p ∨ q) ∧ (¬q ∨ r)
(0 ∨ 1) ∧ (¬1 ∨ 0)
1 ∧ (¬1 ∨ 0)
1 ∧ (0 ∨ 0)
1 ∧ 0
0

Met andere woorden deze zin is niet waar gegeven de interpretatie j.

Satisfactie is het tegenovergestelde van evaluatie. We starten met een samengestelde zin en we zoeken uit of er een bepaalde of er een interpretatie is waarvoor de zin waar is. Bekijk bijvoorbeeld de zin p ∨ q ⇒ q ∧ r. We kunnen een truth table van deze zin maken voor alle combinaties van p,q,r (alle interpretaties)


De rijen met de specifieke combinatie van p,q,r in regels 2,3,4,6 leveren een onware zin op. De overige interpretaties leveren wel een ware zin op. 

Eigenschappen van zinnen
Een zin is valid (geldig) wanneer deze waar geeft bij iedere interpretatie (combinaties van toewijzingen aan de proposities). (p ∨ ¬p) is valid omdat ogeacht de waarde van p altijd 1 (waar) terug geeft.

Een zin is unsatisfiable wanneer er geen interpretatie bestaat waarvoor de zin een waar oplevert. De zin (p ∧ ¬p) is unsatisfiable.

Een zin is contingent if wanneer er interepaties bestaan die 1 terug geven (satisfied) en er zijn interpretaties die 0 teruggeven (falsifies). (p ∧ q) is contingent.

 4. Werken met twee zinnen (relaties tussen zinnen)

Zoals gezegd gaat er bij logica erom dat we verbanden leggen tussen zinnen en als we dat goed doen kunne we iets nieuws leren over de wereld. Er zijn drie type verbanden tussen logische zinnen te leggen. Om die verbanden formeel te kunnen bespreken voegen we aan de proposilogica metavariabelen toe.

Een meta-variabele (bijv: is een symbool warmee je aangeeft dat daar alle mogelijke zinnen in de propositelogica kunne worden ingevuld, mits ze maar aan de syntax voldoen.  Een zin met meta-variabelen wordt ook wel schema genoemd


entailment-relatie
Een zin φ logically entails een zin ψ (φ ⊨ ψ) dan en slechts dan iedere interpretatie waarbij φ waar is ook waar bij ψ geeft.


the sentence p logically entails the sentence (p ∨ q). Since a disjunction is true whenever one of its disjuncts is true, then (p ∨ q) must be true whenever p is true.


Deduction Theorem: A sentence φ logically entails a sentence ψ if and only if (φ ⇒ ψ) is valid. -> dus bij ieder interpretatie van beide zinnen waar geeft. (is dit zo?)





equivalentie-relatie 
Een zin φ is logically equivalent taan zin ψ dan en slechts dan iedere interpretatie waarbij  φ waar is ook  ψ waar geeft en andersom.

The sentence ¬(p ∨ q) is logically equivalent to the sentence (¬p ∧ ¬q).

Equivalence Theorem: A sentence φ and a sentence ψ are logically equivalent if and only if the sentence (φ ⇔ ψ) is valid.

De equivalentie relatie leert ons op zich niet zoveel nieuws over de wereld, maar kan worden gebruikt om moeilijk geformuleerde zinnen te vervangen door eenvoudiger zinnen. Ze geven immers dezelfde uitkomsten van waar en niet waar bij iedere mogelijk interpretatie.




consitentie-relatie

Consistency Theorem: A sentence φ is logically consistent with a sentence ψ if and only if the sentence (φ ∧ ψ) is satisfiable.

5. Bewijsvoering (Waarheidstabel, Mendelson, Fitch en regressie)

Er zijn diverse manieren om entailment en equivalentie vast te stellen. Via het gebruik van waarheidstabellen en via bewijsvoering. Bij waarheidstabellen vullen we voor beide zinnen de waarheidstabellen is en kijken of die voldoen aan de eigenschappen zoals gedefinieerd bij entailment-relatie, equivalentie relatie en of de consitence relatie.
De tabelmethode werkt maar wordt snel omslachtig omdat je om de relatie tussen twee zinnen vast te stellen alle interpretaties van deze twee zinnen moet moet uitwerken. Een alternatief is door goed te kijken naar de vorm (structuur)  van de zin (zoals zit er een implicatie in een zin, komt dezelfde propositieconstente of delen van een zin bij verschillende zinnen terug. Het interessante is dat allen op basis van deze gegevens je ook nieuwe dingen kunt afleiden over de wereld. Overigens geen nieuw idee. Aristoteles heeft al het een en ander uitgewerkt op dit gebied.

5.1 Vaststellen entailment tussen zinnen mbv waarheidstabellen


Nu een voorbeeld van een entalment-relatie tussen drie zinnen
 

5.2 Vaststellen entailment op basis van de structuur van de zinnen
Een andere manier om iets nieuws te leren over de wereld (conclusies te trekken) is door uit bestaande zinnen via bepaalde omzettingsregels te komen tot nieuwe zinnen. We werken dus niet met waarheidstabellen, maar door het toepassen van de juiste omzettingsregels kunnen we wel de juiste conclusies trekken.
   
A rule of inference (omzettingsregel) bestaat uit verschillende schema's (premisen), en ééń of meerdere aanvullende schema's (conclusies).

 Een axioma-schema is een schema zonder premisen.



5.2.1 Het Mendelsonsysteem
Het Mendelsonsysteem is een bewijssysteem dat bestaat uit één Rule of inference en drie axioma's.



5.2.2 Het Fitch systeem
Het Fitch systeem is net als het Mendelsonsysteem een bewijssysteem. Het is uitgebreid met het gebruik van aannames en subbewijzen en maakt gebruik van de volgende schema's.




5.3.3 Regressie
Een derde manier om vast te stellen of de geldigheid nieuwe zinnen kunnen worden afgeleid uit een verzameling  bestaande zinnen betreft de regressie-methode.

Om deze methode toe te kunnen passen, zijn eerst twee extra begrippen nodig. Dit betreffen:
  1. Clausale vorm. Logische zinnen kunnen herschreven worden in een grammatica die clausale vorm wordt genoemd. De regessie methode werkt alleen met zinnen die volgens deze grammatica zijn opgesteld. Er is een procedure om zinnen in standaard propositiegrammatica om te zetten in clausale grammatica.
  2. Er is een verschil tussen aan afleiding en een bewijs  volgens de regressie methode. Met een afleding bedoelen we hetzelfde als wat we een bewijs noemen bij bijv.. Lineaire bewijsvoering. Een regressie-bewijs betreft een afleding met een extra bewerking. Daar komen we later op terug.

Omzetten naar Clausal Form (CNF)
De grammatica van de clausale vorm wordt als volgt gedefinieerd:

 
Een atom is een uitspraak weergegeven met een symbool. (p)
Een literal is een atom of de ontkenning ervan  p of -p

Een clausal sentence is een literal of een disjunctie (of-relatie) van literalen.

If p and q are logical constants, then the following are clausal sentences.
p
¬p
¬p ∨ q

Een clause is de verzameling literals in een clausal sentence.
{p}
{q}
{p,q}

Let op. De lege clause is ook een clause. {}. Die gaan we later wanneer we het verschil tussen tussen regressie-afleiding en regressie bewijs  bespreken weer tegenkomen.

Elke formule van de klassieke propositielogica kan omgezet worden naar CNF door herhaling van de volgende stappen.




  1. Elimineer \leftrightarrow (bi-implicatie) met behulp van:
    {\displaystyle P\leftrightarrow Q\equiv (P\rightarrow Q)\wedge (Q\rightarrow P)}
  2. Elimineer \rightarrow (implicatie) met behulp van:
    {\displaystyle P\rightarrow Q\equiv \neg P\vee Q}
  3. Verplaats \neg (negatie) naar binnen met behulp van:
    {\displaystyle \neg (\neg P)\equiv P} (elimineren van dubbele negatie)
    {\displaystyle \neg (P\wedge Q)\equiv \neg P\vee \neg Q} (wetten van De Morgan)
    {\displaystyle \neg (P\vee Q)\equiv \neg P\wedge \neg Q} (wetten van De Morgan)
  4. Distribueer \vee over \wedge:
    {\displaystyle (P\wedge Q)\vee R\equiv (P\vee R)\wedge (Q\vee R)}

voorbeeld:

g ∧ (r ⇒ f)
Ig ∧ (¬r ∨ f)
Ng ∧ (¬r ∨ f)
Dg ∧ (¬r ∨ f)
O{g}

{¬r, f}

Afleiden en bewijzen volgens de regressie-methode


Resolution Principle.
{φ1, ... , χ, ... , φm}
{ψ1, ... , ¬χ, ... , ψn}

{φ1, ... , φm, ψ1, ..., ψn}


Hierboven zie je dat de toepassing van het resolutie- principe twee stappen inhoudt:
  1. Samenvoegen van twee clauses
  2. Het verwijderen van de clausal sentence die in de eerste clause voorkoemt en de ontkenning er van in de tweede (of andersom)
 voorbeeld:

{p, q}
{¬q, r}

{p, r}



Vaak zie je dat de samengestelde zin minder elementen bevat dan de twee originele:

{¬p, q}
{p, q}

{q}

{p, q, r}
{¬p}

{q, r}

Dit kan zelfs leiden tot een lege clausule:

{p}
{¬p}

{}

Dit betekent dat de verzameling zinnen / clauses een contradictie bevatten. Een speciaal geval betreft het volgende:
{p, q}
{¬p, ¬q}

{p, ¬p}
{q, ¬q}

We zien hier dat we op twee manieren het resoltie principe kunnen toepassen.


Afleidbaarheid (blijft er een zin over)
 Then we can derive the conclusion {r} as shown below.
1.{¬p, r}Premise
2.{¬q, r}Premise
3.{p, q}Premise
4.{q, r}1, 3
5.{r}2, 4

As an example, consider the clauses {p, q}, {p, ¬q}, {¬p, q}, and {¬p, ¬q}. There is no truth assignment that satisfies all four of these clauses

On the other hand, we can be sure of one thing. If a set Δ of clauses is unsatisfiable, then there is guaranteed to be a resolution derivation of the empty clause from Δ. More generally, if a set Δ of Propositional Logic sentences is unsatisfiable, then there is guaranteed to be a resolution derivation of the empty clause from the clausal form of Δ.

As an example, consider the clauses {p, q}, {p, ¬q}, {¬p, q}, and {¬p, ¬q}. There is no truth assignment that satisfies all four of these clauses.

1.{p, q}Premise
2.{p, ¬q}Premise
3.{¬p, q}Premise
4.{¬p, ¬q}Premise
5.{p}1, 2
6.{¬p}3, 4
7.{}5, 6

A resolution proof of a sentence φ from a set Δ of sentences is a resolution derivation of the empty clause from the clausal form of Δ ∪ {¬φ}

We have three premises - p, (p ⇒ q), and (p ⇒ q) ⇒ (q ⇒ r). Our job is to prove r.

1.{p}Premise
2.{¬p, q}Premise
3.{p, ¬q, r}Premise
4.{¬q, r}Premise
5.{¬r}Premise
6.{q}1, 2
7.{r}4, 6
8.{}5, 7







maandag 29 augustus 2016

Klassieke Lineaire regressie

Een belangrijk onderdeel van AI is het vermogen van computers om onzekerheid om te zetten naar uitspraken die iets meer zekerheid bieden.

Het klassiek algoritme die dat ook doen betreft regressie-analyse. Dit algoritme, in ieder geval ideeën ervan, worden bij veel AI-programmatuur gebruikt. Simple Lineair Regession \begin{align} y_i& = \beta_0 + \beta_1 * x_i + \epsilon_i\\ \widehat y_i& = \hat\beta_0 + \hat\beta_1 * x_i\\ e_i& = y_i - \widehat y_i\\ R&SS = \sum_{i=1}^n (e_i)^2\\ M&inimize_{\beta_0 \beta_1} RSS\\ \end{align}

Minimaliseren, m.a.w. vaststellen wat de beste combinatie van $\beta_0$ en $\beta_1$ is kan op twee manieren:
  1. Aflleiden via  normaalvergelijkingen
  2. Uitrekenen via gradient-descent algoritme
De zo gevonden combinatie van parameters ( $\beta_0$ en $\beta_1$) zegt op zich niet zoveel. We moeten de analyseren of de gevonden parameters ook breder toe te passen zijn dan alleen op de set waarden waar we de regressie op hebben toegepast.
In statistics and machine learning, the bias–variance tradeoff (or dilemma) is the problem of simultaneously minimizing two sources of error that prevent supervised learning algorithms from generalizing beyond their training set:

The bias is error from erroneous assumptions in the learning algorithm. High bias can cause an algorithm to miss the relevant relations between features and target outputs (underfitting).

The variance is error from sensitivity to small fluctuations in the training set. High variance can cause overfitting: modeling the random noise in the training data, rather than the intended outputs.

zondag 28 augustus 2016

Handige linkjes


http://www.deconnectie.com/
https://en.wikipedia.org/wiki/Artificial_general_intelligence
http://kunstmatigeintelligentie.startpagina.nl/

https://en.wikipedia.org/wiki/Artificial_intelligence_in_fiction


https://www.mooc-list.com/tags/machine-learning
https://www.mooc-list.com/tags/artificial-intelligence



http://meta.math.stackexchange.com/questions/5020/mathjax-basic-tutorial-and-quick-reference
When $a \ne 0$, there are two solutions to \(ax^2 + bx + c = 0\) and they are $$x = {-b \pm \sqrt{b^2-4ac} \over 2a}.$$ http://hilite.me/
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
x <- c(1,3,2,5)
x
y = c(1,4,3)
x = c(1,6,2)
length(x)
length(y)
x+y

ls()
rm(x) 
ls()
rm(list=ls())
ls()

?matrix
x=matrix(data=c(1,2,3,4), nrow=2, ncol=2)
x
sqrt(x)
x^2
matrix(c(1,2,3,4),2,2,byrow=TRUE)
ls()

Wat is AI?

 AI als imitatiemens
De HAL-9000past hierbij. Uit de boeken van Arthur C. Clarke. HAL staat voor Heuristically   programmed ALgorithmic computer en is een computer die nauw samenwerkt met de bemanning van het ruimteschip Discovery One. HAL communiceert met en reageert op bijna menselijke wijze.
In ieder geval kunnen woorden uit de psychologie zonder al te veel problemen op HAL worden toegepast zoals: HAL is grondig is, HAL is slim, HAl weet veel, HAL kan eigenwijs kan zijn, HAL is  voorzichtig, HAL heeft zelfkennis,

Misschien is dat wel mijn definitie van mijn ideale AI-toepassing. Als een computer/machine  zich zo weet te gedragen dat ik hem als vriend kan zien.

AI als onzekerheidsreduceerder
AI is de verzameling routines die vanuit chaos, kosmos en logos creëren.

Chaos
Being without order (from the ancient Greek khaosmeaning abyss or void)
Stel dat we ons niet konden concentreren, dan zouden alle signalen die via onze zintuigen binnenkrijgen even veel invloed hebben. Ik denk dat we de wereld dan zoals in de tekening hiernaast zouden waarnemen. Een chaos waar we weinig wijs uit kunnen worden.






Cosmos
Ordered being (from the ancient Greek kosmosmeaning an orderly
arrangement
Wanneer we ons wel kunnen concentreren, op een gedeelte van het schilderij of bepaalde kleur bijvoorbeeld, dan ontstaat er een voor en een achtergrond. Dat wat opvalt in de wereld om ons heen is een teken. In deze definitie kan dus alles uit de werkelijkheid als een mogelijk teken worden opgevat. Een teken is dus meer dan alleen letters of cijfers.



Logos
literally, “the word” an account or theory or concept or idea or
reason(here, we use the ancient Greek word without translating it)
Tegelijkertijd met het onderscheiden van een teken, spelen twee aanvullende zaken een rol. Wanneer we iets zien zien met vleugels en veren dan kun je er van uitgaan dat het om hetzelfde dier gaat, een vogel. Een teken verwijst dus altijd naar iets. We zien dus niet de vogel, we zien een teken, een afbeelding, van de werkelijkheid en we redeneren dan dat het dat dat beeld verwijst naar een diertje dat we vogel noemen. Dit wordt ook wel de afwezige genoemd.

Een tweede zaak dat een rol speelt is wat het teken en datgene waar het naar verwijst oproept bij de ontvanger. Datgene wat wordt opgeroepen door het teken en en de verwijzing ernaar is de betekenis. Betekenis geven houdt dus in dat teken en verwijzing wordt gecombineerd met eerdere tekens en verwijzingen, waardoor er wetmatigheden zichtbaar kunnen worden

AI als rationele beslisser
 Nog een defintie van AI is AI is een combintatie van algoritmen die gegeven onzekerheid (bijvoorbeeld als gevolgd van beperkte waarneming of enorme aantal mogelijkheden)  de best mogelijke beslissing kunnen nemen. (rational agent-theory)


Beslissen op basis van een beschrijving/afbeelding van de wereld :-> wat is data https://www.slideshare.net/kidehen/understanding-29894555/11

Ik ben de AI-Idealist

Ik geloof in AI. Ik geloof dat  intelligentie niet meer is dan een woord is om bepaald gedrag van mens of van te benoemen. Ik zie geen enkele reden waarom we geen machines kunnen maken die datzelfde gedrag kunnen laten zien.

Ik geloof in vooruitgang, ik geloof in vrijheid, ik geloof in zorg voor elkaar.

Ik geloof dat AI ons onbegrensde mogelijkheden geeft om onszelf te ontwikkelen en om onze omgeving te verbeteren. Daarom maak ik deze blog. Ik weten wat AI is om zo te helpen de wereld een beetje beter te maken.