<!DOCTYPE html>
<head>
<title>Модель одного нейрона</title>
</head>
<body>
Подробное описание этого кода в статье
<a href='https://megabyte.ga/na-puti-k-nejroseti/model-odnogo-nejrona' target='_blank'> МОДЕЛЬ ОДНОГО НЕЙРОНА </a>
<script>
// Модель логического нейрона "Конъюнкция, дизъюнкция, отрицание"
//Константы:
const n = 2; //число входящих сигналов х
/*
Массив входящих х:
х1 - логический, может принимать значение 1(истина)/0(ложь);
х2 - логический, может принимать значение 1(истина)/0(ложь)
*/
/*ДАННЫЕ ДЛЯ ОБУЧЕНИЯ training set
------!!!!!! Подключить ТОЛЬКО ОДНУ нужную выборку:
*/
//Обучающий массив КОНЪЮНКЦИЯ, x1 ∧ x2:
//const trainingSet = [[1,1,1],[1,0,0],[0,1,0],[0,0,0]];
//Обучающий массив ДИЗЪЮНКЦИЯ, x1 ∨ x2:
//const trainingSet = [[1,1,1],[1,0,1],[0,1,1],[0,0,0]];
//Более сложные операции
//Обучающий массив КОНЪЮНКЦИЯ отрицания Х1 И Х2, ¬x1 ∧ x2:
//const trainingSet = [[1,1,0],[1,0,0],[0,1,1],[0,0,0]];
//Обучающий массив КОНЪЮНКЦИЯ Х1 И отрицания Х2, x1 ∧ ¬x2:
//const trainingSet = [[1,1,0],[1,0,1],[0,1,0],[0,0,0]];
//----------------------!!! Просто справочно, потому что на одном нейроне xor не работает:
//Обучающий массив XOR (исключающее ИЛИ), x1 ⊕ x2:
const trainingSet = [[1,1,0],[1,0,1],[0,1,1],[0,0,0]];
//Разложение XOR на простые операции: x1 ⊕ x2 = ( ¬x1 ∧ x2 ) ∨ ( ¬x2 ∧ x1 )
//Переменные
let w = [ ], //массив весов
t = 0.3; //скорость обучения
//Функция "Инициализация входящих весов"
function ini( ){
for (let i=0;i<n;i++)
{w[i] = Math.trunc (Math.random()*100)/100
}
return w}
/*Функция "Предсказание нейрона":
1) сумматор: произведения всех входящих иксов на их веса
x1*w1+ x2*w2
2) функция активации: пороговая
если полученное значение больше или равно единице, результат =1, иначе =0.
*/
function predict (x){
let summator = x[0]*w[0]+x[1]*w[1];
let y = (summator>=1) ?1:0;
return y
}
//Обучение нейрона:
function train () {
for (let i=0;i<trainingSet.length;i++)//Цикл: перебираем примеры обучающей выборки
// d-ошибка i-го примера
{let d = trainingSet[i][2] - predict([trainingSet[i][0],trainingSet[i][1]])
if (d!=0) {
//если ответ не правильный:
w[0]=w[0]+d*trainingSet[i][0]*t; //корректировка веса w1
w[1]=w[1]+d*trainingSet[i][1]*t; //корректировка веса w2
} // конец если
} // конец цикла
} // конец функции
//Проверка всех примеров
function checkAll () {
for (let i=0;i<trainingSet.length;i++)//Цикл: перебираем примеры обучающей выборки
// d-ошибка i-го примера
{let d = trainingSet[i][2] - predict([trainingSet[i][0],trainingSet[i][1]])
console.log(`Пример с индексом ${i} - ${ (d==0)?'правильно':'ошибка'}`);
}
}
/*Справочно: обучение в командной строке:
for (let i=0; i<100; i++) {train()}
*/
</script>
</body>
</html>