Advertisement
Guest User

Untitled

a guest
Jul 22nd, 2019
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.56 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define Train_Set_Size 20
  6. #define PI 3.141592653589793238463
  7. #define N 5
  8. #define epsilon 0.05
  9. #define epoch 50000
  10.  
  11. long double c[N];
  12. long double W[N];
  13. long double V[N];
  14. long double b;
  15.  
  16. /*
  17. Camada oculta e 5 neurônios
  18. Função Sigmoid para a ativação de cada nó
  19. */
  20. long double sigmoid(long double x){
  21. return (1.0/(1.0+abs(x)));
  22. }
  23.  
  24. long double f_theta(long double x){
  25. long double result = b;
  26. for(int i = 0; i < N; i++){
  27. result += V[i] * sigmoid(c[i] + W[i] * x);
  28. }
  29. return result;
  30. }
  31.  
  32. void train(long double x, long double y){
  33. for (int i = 0; i < N; i++) {
  34. W[i] = W[i] - epsilon * 2 * (f_theta(x) - y) * V[i] * x *
  35. (1 - sigmoid(c[i] + W[i] * x)) * sigmoid(c[i] + W[i] * x);
  36. }
  37. for (int i = 0; i < N; i++) {
  38. V[i] = V[i] - epsilon * 2 * (f_theta(x) - y) * sigmoid(c[i] + W[i] * x);
  39. }
  40. b = b - epsilon * 2 * (f_theta(x) - y);
  41. for (int i = 0; i < N; i++) {
  42. c[i] = c[i] - epsilon * 2 * (f_theta(x) - y) * V[i] *
  43. (1 - sigmoid(c[i] + W[i] * x)) * sigmoid(c[i] + W[i] * x);
  44. }
  45. }
  46.  
  47. void initRandom(){
  48. for(int i=0;i<N;i++){
  49. W[i] = 2 * rand() / RAND_MAX - 1;
  50. V[i] = 2 * rand() / RAND_MAX - 1;
  51. c[i] = 2 * rand() / RAND_MAX - 1;
  52. }
  53. }
  54.  
  55. int main(){
  56.  
  57. initRandom();
  58.  
  59. vector<pair<double, double>> trainSet;
  60. trainSet.resize(Train_Set_Size);
  61.  
  62. for(int i=0;i<Train_Set_Size;i++){
  63. trainSet[i] = {i*2*PI/Train_Set_Size, sin(i*2*PI/Train_Set_Size)};
  64. }
  65.  
  66. for(int j=0;j<epoch;j++){
  67. for(int i=0;i<Train_Set_Size;i++){
  68. train(trainSet[i].first, trainSet[i].second);
  69. }
  70. cout << "J : " << j << endl;
  71. }
  72.  
  73. //Plot
  74. vector<float> x;
  75. vector<float> y1, y2;
  76.  
  77. for (int i = 0; i < 1000; i++) {
  78. x.push_back(i * 2 * PI / 1000);
  79. y1.push_back(sin(i * 2 * PI / 1000));
  80. y2.push_back(f_theta(i * 2 * PI / 1000));
  81. }
  82.  
  83. FILE * gp = fopen("gnuplot", "w");
  84. fprintf(gp, "set terminal wxt size 600,400 \n");
  85. fprintf(gp, "set grid \n");
  86. fprintf(gp, "set title '%s' \n", "f(x) = sin (x)");
  87. fprintf(gp, "set style line 1 lt 3 pt 7 ps 0.1 lc rgb 'green' lw 1 \n");
  88. fprintf(gp, "set style line 2 lt 3 pt 7 ps 0.1 lc rgb 'red' lw 1 \n");
  89. fprintf(gp, "plot '-' w p ls 1, '-' w p ls 2 \n");
  90.  
  91. //Exact f(x) = sin(x) -> Green Graph
  92. for (int k = 0; k < x.size(); k++) {
  93. fprintf(gp, "%f %f \n", x[k], y1[k]);
  94. }
  95. fprintf(gp, "e\n");
  96.  
  97. //Neural Network Approximate f(x) = sin(x) -> Red Graph
  98. for (int k = 0; k < x.size(); k++) {
  99. fprintf(gp, "%f %f \n", x[k], y2[k]);
  100. }
  101. fprintf(gp, "e\n");
  102.  
  103. fflush(gp);
  104.  
  105.  
  106. system("pause");
  107. fclose(gp);
  108.  
  109. return 0;
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement