background image

Informatyka - Podstawy Programowania w Języku C++ 

prow. Sławomir Czarnecki 

 

Zadania na laboratorium nr. 10 

 
1. Zdefiniuj funkcję 

 

void

 point(

double

** T

int

 m

int

 n

int

a

int

b

inicjalizującą  składowe  kaŜdego  wiersza 

(

)

0,1,...,

1

i

i

m

=

T

  macierzy 

m n

M

×

T

  o 

wymiarach 

m n

×

  całkowitymi  liczbami  pseudolosowymi  z  przedziału  domkniętego 

[

]

(

)

,

0,1,...,

1

i

i

a b

i

n

=

  będącymi  składowymi  wektorów 

,

n

a b

(

)

i

i

a

b

<

.  Parametr  m 

oznacza  Ŝądaną  liczbę  punktów  w  przestrzeni 

n

ℝ .  Funkcja  point(...)  generuje  zatem  m 

punktów  w  n  wymiarowej  przestrzeni  Euklidesowej,  których  współrzędne  kartezjańskie 
zapisywane są do macierzy T (por. rys.1a). 
 
2.

 Zdefiniuj funkcję 

 

double

 scalar(

double

a

double

b

int

 n

która zwraca iloczyn skalarny dwóch wektorów 

[

]

[

]

0

1

1

0

1

1

, ,...,

,

, ,...,

T

T

n

n

n

a a

a

b b

b

=

=

a

b

ℝ . 

 
3. Zdefiniuj funkcję  

bool

 separation(

double

** T

int

 m

int

 n

bool

 positive

double

w

która zwraca wartość 

true

 jeśli odpowiednio wszystkie m punktów 

(

)

0,1,...,

1

n

i

i

m

=

T

 

w przestrzeni 

n

ℝ , reprezentowanych przez składowe macierzy 

m n

M

×

T

 spełniają warunek 

0

i

>

T w

  (przypadek  positive  = 

true

)  lub  jeśli  wszystkie  te  punkty  spełniają  warunek 

0

i

<

T w

  (przypadek  positive  = 

false

).  W  pozostałych  przypadkach  (positive  = 

true

  oraz

 

{

}

0,1,...,

1

0

i

i

m

w

∃ ∈

T

 lub positive = 

false

 oraz

 

{

}

0,1,...,

1

0

i

i

m

w

∃ ∈

T

funkcja 

separation(...) zwraca wartość 

false

. Zakładamy, Ŝe wektor klasyfikiujący 

n

w

ℝ  jest róŜny 

od zera.  
 
4.

 Zaimplementuj w postaci funkcji  

void

 perceptron(

double

** P

double

** N

int

 pos

int

 neg

int

 n

long

 tmax

long

 tcon

algorytm uczenia się perceptronu (AUP) 
start:  Wektor wagowy 

0

n

w

ℝ  jest generowany losowo. Inicjalizujemy t = 0. 

test: 

Wektor 

P

N

x

 jest wybrany losowo, 

 

jeśli 

P

x

 i 

0

t

⋅ >

w x

 to idź do test, 

 

jeśli 

P

x

 i 

0

t

⋅ ≤

w x

 to oblicz 

1

t

t

+

=

+

w

w

x

 uaktualnij 

1

t

t

= + , idź do test 

 

jeśli 

N

x

 i 

0

t

⋅ <

w x

 idź do test, 

 

jeśli 

N

x

 i 

0

t

⋅ ≥

w x

 to oblicz 

1

t

t

+

=

w

w

 uaktualnij 

1

t

t

= + , idź do test 

Algorytm  AUP  dokonuje  modyfikacji  wektora  wagowego 

n

w

ℝ   w  kaŜdym  przypadku 

kiedy wybrany losowo ze zbioru 

P lub N punkt 

n

x

ℝ  nie został sklasyfikowany poprawnie. 

Parametry  P  i  N  są  tablicami  odpowiednio 

pos

n

M

×

  i 

neg

n

M

×

  przechowującymi  współrzędne 

kartezjańskie 

pos  punktów  ze  zbioru 

n

⊂ ℝ  i neg punktów ze zbioru 

n

⊂ ℝ . Zakładamy 

przy  tym,  Ŝe  zbiory  te  są  rozłączne,  tzn. 

P

N

= ∅   oraz,  Ŝe  nie  zawierają  punktu 

n

0

ℝ . 

Parametr 

tmax definiuje maksymalną liczbę iteracji algorytmu i zabezpiecza przed zbyt duŜą 

liczbą pętli. MoŜna wykazać, Ŝe jeśli dwa zbiory 

P i N są liniowo separowalne to początkowy 

background image

i losowo wygenerowany wektor w będzie modyfikowany w skończonej liczbie kroków (patrz 
materiał na stronie 

http://wektor.il.pw.edu.pl/~iap/materialy/Perceptron_Uczenie.pdf

 ). 

Opisany  powyŜej  algorytm  AUP  uzupełnić  naleŜy  jeszcze,  w  procedurę  sprawdzającą  czy 
wszystkie punkty zostały sklasyfikowane poprawnie, np. w oparciu o funkcję 

separation(...), 

której częstotliwość wywoływania definiuje parametr 

tcon (funkcję separation(...) moŜna na 

przykład wywoływać wtedy kiedy 

mod

0

t

tcon =

). 

 
5.

  Zdefiniuj  (w  ciele  funkcji  main())  dynamicznie  dwie  macierze 

,

m dim

M

×

P N

  (m  =  100, 

dim

 = 2) typu 

double

, dwa wektory 

,

dim

min

max

P

P

 oraz dwa wektory 

,

dim

min

max

N

N

 typu

 

int

. Składowe wektorów 

,

min

max

P

P

 oraz  

,

min

max

N

N

 zainicjalizuj w taki sposób, aby moŜliwe 

było wygenerowanie za pomocą wywołań:  

point

(PmdimPminPmax),  point(NmdimNminNmax

dwóch  zbiorów  punktów 

2

,

P N ⊂ ℝ ,  które  będą  rozłączne  (tzn.  P

N

= ∅ )  oraz  które  nie 

będą zawierały punktu 

2

0

ℝ  (por. rys.1b). 

 

x

y

0

P

N

x

y

0

T

a

0

b

0

a

1

b

1

P

min

[0]

P

max

[0]

P

min

[1]

P

max

[1]

N

min

[0]

N

max

[0]

N

min

[1]

N

max

[1]

Rys. 1a

Rys. 1b

 

 

Rys.1.

 Generowanie punktów na płaszczyźnie 

 
Wywołaj funkcję perceptron(PNmmdimtmax) dla tmax = 1000.