Advertisement
Guest User

Untitled

a guest
Dec 12th, 2017
327
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.52 KB | None | 0 0
  1. /**************************************************************************
  2. * *
  3. * Copyright: (c) 2016-2017, Florin Leon *
  4. * E-mail: florin.leon@tuiasi.ro *
  5. * Website: http://florinleon.byethost24.com/lab_ia.htm *
  6. * Description: Neural networks: decision regions *
  7. * (Artificial Intelligence lab 12) *
  8. * *
  9. * This code and information is provided "as is" without warranty of *
  10. * any kind, either expressed or implied, including but not limited *
  11. * to the implied warranties of merchantability or fitness for a *
  12. * particular purpose. You are free to use this source code in your *
  13. * applications as long as the original copyright notice is included. *
  14. * *
  15. **************************************************************************/
  16.  
  17. using System;
  18. using System.Drawing;
  19. using System.Globalization;
  20. using System.Windows.Forms;
  21.  
  22. namespace DecisionRegions
  23. {
  24. public partial class MainForm : Form
  25. {
  26. /// <summary>
  27. /// Delegat care calculeaza iesirea retelei in functie de tipul ei: perceptron cu un singur strat sau perceptron multistrat
  28. /// </summary>
  29. private delegate double NetworkFunction(double x, double y);
  30.  
  31. /// <summary>
  32. /// Delegat care reprezinta functia de activare a retelei: prag, semiliniara sau sigmoida unipolara
  33. /// </summary>
  34. private delegate double ActivationFunction(double x, double prag);
  35.  
  36. private NetworkFunction networkFunction;
  37. private ActivationFunction activationFunction;
  38.  
  39. public MainForm()
  40. {
  41. InitializeComponent();
  42.  
  43. comboBoxType.SelectedIndex = 0;
  44. comboBoxActivation.SelectedIndex = 0;
  45.  
  46. activationFunction = StepActivation; // functia de activare implicita este functia prag
  47. networkFunction = SLP; // reteaua implicita este perceptronul cu un singur strat
  48. }
  49.  
  50. /// <summary>
  51. /// Functia de activare prag
  52. /// </summary>
  53. private double StepActivation(double x, double prag)
  54. {
  55. if (x < prag) return 0;
  56. return 1;
  57. }
  58.  
  59. /// <summary>
  60. /// Functia de activare semiliniara
  61. /// </summary>
  62. private double SemiliniarActivation(double x, double prag)
  63. {
  64. if (x <= prag) return 0;
  65. if (x >= prag * 2) return 1;
  66. return x / prag - 1;
  67. }
  68.  
  69. /// <summary>
  70. /// Functia de activare sigmoida unipolara
  71. /// </summary>
  72. private double SigmoidActivation(double x, double prag)
  73. {
  74. return 1 / (1 + Math.Exp(-x + prag));
  75. }
  76.  
  77. private double w13, w23, w14, w24, t3, t4, w35, w45, t5; // ponderile si pragurile
  78.  
  79. /// <summary>
  80. /// Citeste valorile ponderilor si pragurilor din interfata grafica
  81. /// </summary>
  82. private void ReadParametersFromGUI()
  83. {
  84. if (comboBoxType.SelectedIndex == 0) // SLP
  85. {
  86. w13 = ConvertToDouble(textBoxSw13.Text);
  87. w23 = ConvertToDouble(textBoxSw23.Text);
  88. t3 = ConvertToDouble(textBoxSt3.Text);
  89. }
  90. else if (comboBoxType.SelectedIndex == 1) // MLP
  91. {
  92. w13 = ConvertToDouble(textBoxMw13.Text);
  93. w23 = ConvertToDouble(textBoxMw23.Text);
  94. w14 = ConvertToDouble(textBoxMw14.Text);
  95. w24 = ConvertToDouble(textBoxMw24.Text);
  96. t3 = ConvertToDouble(textBoxMt3.Text);
  97. t4 = ConvertToDouble(textBoxMt4.Text);
  98.  
  99. w35 = ConvertToDouble(textBoxMw35.Text);
  100. w45 = ConvertToDouble(textBoxMw45.Text);
  101. t5 = ConvertToDouble(textBoxMt5.Text);
  102. }
  103. }
  104.  
  105. /// <summary>
  106. /// Converteste numerele citite ca text din interfata in valori reale
  107. /// </summary>
  108. private double ConvertToDouble(string s)
  109. {
  110. if (s.Contains(","))
  111. MessageBox.Show("Folositi punctul ca separator! (" + s + ")");
  112.  
  113. try
  114. {
  115. CultureInfo ci = (CultureInfo)(CultureInfo.CurrentCulture.Clone());
  116. ci.NumberFormat.NumberDecimalSeparator = ".";
  117. return Convert.ToDouble(s, ci);
  118. }
  119. catch
  120. {
  121. MessageBox.Show("Numar invalid: " + s);
  122. return 0;
  123. }
  124. }
  125.  
  126. /// <summary>
  127. /// Metoda care calculeaza iesirea perceptronului cu un singur strat pentru intrarile x si y
  128. /// </summary>
  129. private double SLP(double x1, double x2)
  130. {
  131. // double s = suma ponderata a intrarilor cu scaderea pragului, conform ecuatiei 1 din laborator
  132. // se folosesc ponderile w13, w23 si pragul t3
  133. // in functie de alegerea utilizatorului, activationFunction poate fi: StepActivation, SemiliniarActivation sau SigmoidActivation
  134. // functia de activare este setata in evenimentul comboBoxActivation_SelectedIndexChanged
  135. // in metoda curenta se lucreaza in mod generic doar cu "activationFunction": return activationFunction(s);
  136.  
  137. if (t3 == 0) t3 = 1.5;
  138.  
  139. return activationFunction(x1 * w13 + x2 * w23, t3);
  140. }
  141.  
  142. /// <summary>
  143. /// Metoda care calculeaza iesirea perceptronului cu doi neuroni in stratul ascuns pentru intrarile x si y
  144. /// </summary>
  145. private double MLP(double x1, double x2)
  146. {
  147. double nod3 = activationFunction(x1 * w13 + x2 * w23, t3);
  148. double nod4 = activationFunction(x1 * w14 + x2 * w24, t4);
  149. return activationFunction(nod3 * w35 + nod4 * w45, t5);
  150.  
  151. // pentru fiecare neuron, se calculeaza suma intrarilor ponderate, se scade pragul si se aplica functia de activare
  152. // neuronul 5 are ca intrari iesirile neuronilor 3 si 4
  153. // iesirea neuronului 5 este iesirea retelei
  154. }
  155.  
  156. /// <summary>
  157. /// Selecteaza tipul de perceptron atunci cand utilizatorul il alege din combobox
  158. /// </summary>
  159. private void comboBoxType_SelectedIndexChanged(object sender, EventArgs e)
  160. {
  161. if (comboBoxType.SelectedIndex == 0)
  162. {
  163. groupBoxSLP.Enabled = true;
  164. groupBoxMLP.Enabled = false;
  165. networkFunction = SLP;
  166. }
  167. else if (comboBoxType.SelectedIndex == 1)
  168. {
  169. groupBoxSLP.Enabled = false;
  170. groupBoxMLP.Enabled = true;
  171. networkFunction = MLP;
  172. }
  173. }
  174.  
  175. /// <summary>
  176. /// Selecteaza functia de activare atunci cand utilizatorul o alege din combobox
  177. /// </summary>
  178. private void comboBoxActivation_SelectedIndexChanged(object sender, EventArgs e)
  179. {
  180. if (comboBoxActivation.SelectedIndex == 0)
  181. activationFunction = StepActivation;
  182. else if (comboBoxActivation.SelectedIndex == 1)
  183. activationFunction = SemiliniarActivation;
  184. else if (comboBoxActivation.SelectedIndex == 2)
  185. activationFunction = SigmoidActivation;
  186. }
  187.  
  188. /// <summary>
  189. /// Calculeaza si afiseaza iesirile retelei pentru combinatiile de intrari (0,0), (0,1), (1,0) si (1,1)
  190. /// </summary>
  191. private void ComputeResults()
  192. {
  193. textBoxResults.Clear();
  194. for (int x1 = 0; x1 <= 1; x1++)
  195. for (int x2 = 0; x2 <= 1; x2++)
  196. {
  197. double y = networkFunction(x1, x2);
  198. textBoxResults.AppendText(string.Format("{0} {1} {2:F3}\r\n", x1, x2, y));
  199. }
  200. }
  201.  
  202. /// <summary>
  203. /// Evenimentul de click al butonului "Calculeaza"
  204. /// </summary>
  205. private void buttonCompute_Click(object sender, EventArgs e)
  206. {
  207. ReadParametersFromGUI();
  208. ComputeResults();
  209. pictureBoxRegions.Refresh();
  210. }
  211.  
  212. /// <summary>
  213. /// Desenarea regiunilor de decizie pentru retea in picturebox. Intrarile retelei sunt aici numere reale din intervalul [0,1].
  214. /// </summary>
  215. private void pictureBoxRegions_Paint(object sender, PaintEventArgs e)
  216. {
  217. int size = pictureBoxRegions.Width; // desenul este un patrat
  218. Bitmap b = new Bitmap(size, size);
  219. Graphics g = Graphics.FromImage(b);
  220. g.Clear(Color.White);
  221.  
  222. for (int i = 0; i < size; i++)
  223. for (int j = 0; j < size - 1; j++)
  224. {
  225. double x1 = (double)j / (double)size;
  226. double x2 = (double)i / (double)size;
  227. double y = networkFunction(x1, x2);
  228. int gray = (int)(y * 255);
  229. Color c = Color.FromArgb(gray, gray, gray);
  230. g.DrawLine(new Pen(c), i, size - j, i, size - j + 1);
  231. Application.DoEvents();
  232. }
  233.  
  234. e.Graphics.DrawImage(b, 0, 0);
  235. }
  236. }
  237. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement