perceptron.c 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <time.h>
  5. /*Что делает искусственный нейрон? Простыми словами, он считает взвешенную сумму (сумма произведений числа на его вес) на своих входах,
  6. добавляет смещение (bias)
  7. Y = Σ (weight * input) + bias
  8. и решает, следует это значение исключать или использовать дальше*/
  9. #define _weight 3 // количество весов нейронки
  10. double w[_weight];
  11. /*Функция активации определяет выходное значение нейрона в зависимости от результата взвешенной суммы входов и порогового значения.*/
  12. double activation(double a){ // функция активации (ступенька)
  13. return (a<=0) ? 0 : 1; //Функция А = активирована, если Y > граница, иначе нет
  14. //Функция принимает значение 1 (активирована), когда Y > 0 (граница), и значение 0 (не активирована) в противном случае.
  15. }
  16. double R(double inputs[3]){ // функция прямого распространения (result = значение1*вес1+значение2*вес2+значение3*вес3)
  17. double result = 0;
  18. for (unsigned i=0; i<10; i++)
  19. result += w[i]*inputs[i];
  20. return result;
  21. }
  22. void train(double data[4][3], double exp[4]){ // тренировка весов
  23. const double LR = 0.1; //(learning rate) скорость обучения
  24. const unsigned Epoch = 50;// количество эпох т.е то количесвто раз сколько раз сеть будет пробегать по обучающей выборке
  25. unsigned d, i, n;
  26. double error; // цена ошибки
  27. for (i=0; i<Epoch; i++){ // эпохи обучения
  28. /* Формула для "тренировки слоя: w(новый) = w(текущий) + (LR*(R(ожидаемый)-R(рассчитаный))*вход */
  29. for (d=0; d<4; d++){
  30. error = exp[d]-activation(R(data[d])); // преобразование целочисленного массива data в double
  31. for(n=0; n<_weight; n++){
  32. w[n]+=LR*error*data[d][n];
  33. }
  34. }
  35. }
  36. }
  37. int main(){
  38. double train_data[4][3] = {
  39. {0.0,0.0,1.0},
  40. {0.0,1.0,1.0},
  41. {1.0,0.0,1.0},
  42. {0.0,1.0,0.0}}; // тренировочные данные
  43. double expresult[4] = {0.0,0.0,1.0,0.0}; // массив ожидаемых результатов
  44. srand(time(NULL)); // опорное число для генератора случайных чисел
  45. for (unsigned i=0; i<3; i++){ // инициализация весов в цикле
  46. w[i] = rand()%10*0.1;
  47. printf("%f ", w[i]);
  48. }
  49. printf("\n");
  50. train(train_data, expresult); // тренировка весов в функции
  51. for(unsigned i=0; i<3; i++){
  52. w[i]=(w[i]>0) ? w[i] : 0; // проверяем веса если больше 0, то сам вес иначе 0 чтобы не было отрицательных результатов
  53. printf("%f ", w[i]);
  54. }
  55. printf("\n");
  56. double new[3]={0.0,1.0,0.0}; // новая ситуация
  57. printf("%f", activation(R(new)));
  58. return 0;
  59. }