Mantiqiy (OR-YOKI) funksiyasi. Keling, shunga o'xshash tarzda boshqa (OR-YOKI) mantiqiy funksiyani tahlil qilaylik.
Mantiqiy (OR-YOKI) quyidagi chinlik jadvaliga ega:
x1
|
x2
|
Y= x1 OR x2
|
0
|
0
|
0
|
1
|
0
|
1
|
0
|
1
|
1
|
1
|
1
|
1
|
Mantiqiy (OR) funksiyani mantiqiy qo'shish deb atash mumkin. Haqiqatdan ham:
x1 + x2 = 0 + 0 = 0
x1 + x2 = 1 + 0 = 1
x1 + x2 = 0 + 1 = 1
x1 + x2 = 1 + 1 = 1
Mantiqiy funksiyalarning qiymatlari ikkilik bo'lganligi sababli, mantiqiy qo'shishda: 1 + 1 = 1.
Ma'lumotlar massivi va o'qitilgan neyronni tekshirish bo'yicha so'nggi AND mantiqiy funksiyasi uchun tuzilgan dasturga o'zgartirishlar kiritamiz. Shuningdek b parametrini olib tashlab, usiz koeffitsientlar qanday bo'lishini ko'rib chiqamiz.
Dastur:
import random
import numpy as np
# Biz istalgan raqam bilan w1 = A to'g'ri chiziqning qiyaligini belgilaymiz
w1 = random.uniform(-4, 4)
w1_vis = w1 # Dastlabki w1 vaznni saqlaymiz
# Y o'qi orqali to'g'ri chiziqning o'tish nuqtasi uchun W2 = b parametrini ishga tushiring
w2 = random.uniform(-4, 4)
w2_vis = w2 # w2 vaznining boshlang'ich qiymatini saqlang
# Vazn koeffitsientlarining boshlang'ich qiymatlari bo'yicha ma'lumotlarni chiqaring
print ('Dastlabki vaznlar:', '\ nw1 =', w1, '\ nw2 =', w2)
# O'qish tezligi
lr = 0,001
# Davrlar sonini o’rnatish
epochs = 5000
# Birlik faollashtirish funksiyasi uchun chegarani o'rnatish
bias = 3
# Mantiqiy (OR-YOKI) funksiyasi uchun ma'lumotlar qatorini yaratish
log_or = np.array ([[0, 0, 0],
[1, 0, 1],
[0, 1, 1],
[1, 1, 1]])
# Tanlanma bo'yicha ishlash
for e in range(epochs):
for i in range(log_or.shape[0]): # shape - massivning o'lchamini qaytaradi, [0] - massivdagi qatorlar indeksi
# Nuqtaning x1 koordinatasini olamiz
x1 = log_or [i, 0] # i - satr, 0 - ustun
# Nuqtaning x2 koordinatasini olamiz
x2 = log_or [i, 1] # i - qator, 1 - ustun
# vaznlar yig’indisi
y = (w1*x1) + (w2*x2)
if y >= bias:
# Chegara qiymati oshib ketganda, chiqish - y = 1 bo'lishi kerak
y = 1
# Maqsad Y va nuqta koordinatasini olamiz
target_Y = log_or [i, 2] # i - qator, 2-ustun
# Xatolik E = - (maqsad qiymati - neyron chiqishi)
E = - (target_Y - y)
# Vaznni x1 darajasida o’zgartamiz
w1 - = lr * E * x1
# Vaznni x2 darajasida o’zgartamiz
w2 - = lr * E * x2
else:
# Chegara oshmaganida, chiqish - y = 0 bo'lishi kerak
y = 0
# Maqsad Y va nuqta koordinatasini olamiz
target_Y = log_or [i, 2] # i - qator, 2-ustun
# Xatolik E = - (maqsad qiymati - neyron chiqishi)
E = - (target_Y - y)
# Vaznni x1 darajasida o’zgartamiz
w1 - = lr * E * x1
# Vaznni x2 darajasida o’zgartamiz
w2 - = lr * E * x2
# Ma'lumotlarning chiqishi to'g'ridan-to'g'ri tayyor
print ('\ nOrgatilgan vaznlar:', '\ nw1 =', w1, '\ nw2 =', w2)
print ('\ n mantiqiy funksiyasi (OR-YOKI) ni tekshirish:')
print ('(0, 0,', int ((0 * w1 + 0 * w2)> = 3), ')')
print ('(1, 0,', int ((1 * w1 + 0 * w2)> = 3), ')')
print ('(0, 1,', int ((0 * w1 + 1 * w2)> = 3), ')')
print ('(1, 1,', int ((1 * w1 + 1 * w2)> = 3), ')')
Dastur natijasi:
Dastlabki vaznlar:
w1 = 3.611365134992452
w2 = 3.8646266194092878
O’qitilgan vaznlar:
w1 = 3.61136513499
w2 = 3.86462661941
Mantiqiy funksiya (OR-YOKI) ni tekshirish:
(0, 0, 0)
(1, 0, 1)
(0, 1, 1)
(1, 1, 1)
Agar ma'lumotlardan bitta kirishni qo'llagan holda o'quv jarayonini batafsil ko'rib chiqsak, biz quyidagi ko’rinishga ega bo’lamiz:
1)
Kirish parametri faol (x = 1), neyron to'g'ri javob berdi (chegaradan oshib ketdi), lekin xatoga yo'l qo'ydi (y= 1, lekin Y= 0):
Xatolik: E = - (Y - y) = - (0 - 1) = 1;
Vaznni yangilashi: w = w - (E * x1) = w - 1
2)
Kirish parametri faol emas (x = 0 ), neyron to'g'ri javob berdi (chegadan oshib ketdi), lekin xatoga yo'l qo'ydi (y = 1, lekin Y = 0 ):
Xato: E = - (Y - y) = - (0 - 1) = 1;
Og'irligi yangilanishi: w = w - (E * x1) = w - 0 = w
Biz darhol xulosa qilamizki, nofaol kirish parametri bilan har qanday maqsad qiymatlari va neyron chiqishi uchun vazn koeffitsienti o'zgarmaydi. Shuning uchun, biz faol bo'lmagan yozuv bilan variantlarni ko'rib chiqmaymiz.
3)
Kirish parametri faol (x = 1 ), neyron to'g'ri javob berdi (chegaradan oshib ketdi) va yanglishmadi (y = 1, lekin Y = 1 ):
Xato: E = - (Y - y) = - (1 - 1) = 0;
Vazn yangilanishi: w = w - (E * x1) = w - 0 = w
4)
Kirish parametri faol (x = 1 ), neyron noto'g'ri javob berdi (chegara oshmadi) va yanglishmadi (y= 0 lekin Y = 0 ):
Xato: E = - (Y - y) = - (0 - 0) = 0;
Vazn yangilanishi: w = w - (E * x1) = w - 0 = w
5)
Kirish parametri faol (x = 1 ), neyron noto'g'ri javob berdi (chegara oshmadi) va xato qildi (y = 0 lekin Y= 1 ):
Xato: E = - (Y - y) = - (1 - 0) = -1;
Vazn yangilanishi: w = w - (E * x1) = w + 1 = w + 1
Agar siz ushbu ma'lumotlarga diqqat bilan qarasangiz, quyidagi qoidani shakllantirishingiz mumkin:
Agar bizning neyronimiz to'g'ri javob bergan bo'lsa (xato 0 ga teng), demak biz hech narsa qilmaymiz.
Agar neyron to'g'ri javob bergan bo'lsa, lekin xatoga yo'l qo'ygan bo'lsa, biz uni buning uchun jazolashimiz kerak - bu signal o'tgan ulanishlarning vaznini kamaytirish uchun. Boshqacha qilib aytganda, hayajonlangan kirishlar bilan bog'liq vaznlar kamayadi.
Agar neyron noto'g'ri javob bergan va xato qilgan bo'lsa, unda biz signal o'tgan barcha vaznlarni oshirishimiz kerak. Shunday qilib, biz, go'yo, tarmoqqa bunday ulanishlar va shuning uchun ular bilan bog'liq bo'lgan kirishlar to'g'ri ekanligini aytmoqdamiz.
Ushbu qoida o'z nomiga ega - delta qoidasi.
Do'stlaringiz bilan baham: |