Advertisement
Guest User

Untitled

a guest
May 28th, 2015
248
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.33 KB | None | 0 0
  1. // nie mamy entropii wiec kolejnosc atrybotow ma znaczenia - nie sprawdza o ktory atrybut najepiej spytac
  2. var Set = require("Set"); // klasa zbior
  3.  
  4. function najczestsza_klasa (przyklady) {
  5. var ilosc_wystapien_klas = {};//tworzy pusta mape -patrzymy jakie to zwierze// ilosc zwierzat na ilosc wystapien // obecnosc
  6.  
  7. for (var i in przyklady) {
  8. var klasa_przykladu = przyklady[i].class;// krowe zwracamy
  9. if (ilosc_wystapien_klas[klasa_przykladu] === undefined) {// wpis w liscie odnosnie tego zwierzecia a jesli jest to zwraca ilosc wystapien klas// nie jest zdefiniowana ilosc koz
  10. ilosc_wystapien_klas[klasa_przykladu] = 0;// 0 koz
  11. }
  12. ilosc_wystapien_klas[klasa_przykladu]++;// o 1 koze wiecej
  13. }
  14. var najwieksza_ilosc_wystapien = -Infinity;// chwilowy max
  15. var najczestsza_klasa;// rodzaj zwierzecia
  16. for (var klasa in ilosc_wystapien_klas) {// spr max klasa - krowa , mops itp
  17. var ilosc_wystapien_aktualnej_klasy = ilosc_wystapien_klas[klasa]; // dana klasa ile ma zwierzat
  18. if ( ilosc_wystapien_aktualnej_klasy > najwieksza_ilosc_wystapien) {
  19. najwieksza_ilosc_wystapien = ilosc_wystapien_aktualnej_klasy;
  20. najczestsza_klasa = klasa;
  21. }
  22. }
  23. return najczestsza_klasa;
  24. }
  25.  
  26. function wszystkie_wartosci_atrybutu(przyklady, wybrany_atrybut) {
  27. var zbior_wystepujacych_wartosci = new Set();// 2 nogi
  28. for ( var i in przyklady) {
  29. var aktualny_przyklad = przyklady[i];
  30. var wartosc_atrybutu_dla_aktualnego_przykladu = aktualny_przyklad[wybrany_atrybut];// wybrany atrubut - "nogi" , wartosc atrybutu to ilośc 3,4,...
  31. zbior_wystepujacych_wartosci.add(wartosc_atrybutu_dla_aktualnego_przykladu);// wrzucamy do zbioru liczbe 2
  32. }
  33. return zbior_wystepujacych_wartosci.toArray();// zwroci tablice unikalnych wartosci atrybutu w danej tablicy przykladow
  34. }
  35.  
  36. //-------------funckaj pkt 6 b) dla wybranych atrybotow
  37. function lista_minus_element(atrybut, tablica) {
  38. return tablica.filter(function(element){
  39. if ( atrybut != element) return true;
  40. else return false;
  41. })
  42.  
  43. }
  44.  
  45.  
  46. function znajdź_wszystkie_klasy(przykłady){
  47. + var zbiór = new Set();
  48. + for(var i in przykłady){
  49. + zbiór.add(przykłady[i].class);
  50. + }
  51. + return zbiór.toArray();
  52. +}
  53. +
  54. +function getBaseLog(x, y) {
  55. + return Math.log(y) / Math.log(x);
  56. +}
  57. +
  58. +function policz_prawdopodobieństwo_klasy(przykłady, klasa){
  59. + var filtrowane = przykłady.filter(function(element){return element.class == klasa});
  60. + return przykłady.length/filtrowane.length;
  61. +}
  62.  
  63. +function zmierz_entropię(przykłady, atrybut){
  64. + var entropia = 0;
  65. + var wartości_atrybutu = wszystkie_wartosci_atrybutu(przykłady, atrybut);
  66. + var wszystkie_klasy = znajdź_wszystkie_klasy(przykłady);
  67. + for(var i in wartości_atrybutu){
  68. + W = wartości_atrybutu[i];
  69. + var podzbiór = przykłady.filter(function(element){
  70. + return element[atrybut]==W;
  71. + })
  72. + for(var j in wszystkie_klasy){
  73. + var klasa = wszystkie_klasy[j];
  74. + var prawdopodobieństwo_klasy = policz_prawdopodobieństwo_klasy(przykłady, klasa);
  75. + entropia -= prawdopodobieństwo_klasy * getBaseLog(prawdopodobieństwo_klasy, 2);
  76. + }
  77. + }
  78. + return entropia
  79. +
  80. +}
  81. +
  82. +function znajdz_najlepszy_atrybut(przykłady, atrybuty){
  83. + var najlepszy_atrybut;
  84. + var min_entropia = Infinity;
  85. + for(var i in atrybuty){
  86. + var atrybut = atrybuty[i];
  87. + var entropia = zmierz_entropię(przykłady, atrybut);
  88. + console.log("entropia dla ", atrybut, ": ", entropia);
  89. + if(entropia<min_entropia){
  90. + min_entropia = entropia;
  91. + najlepszy_atrybut = atrybut;
  92. + }
  93. + }
  94. + return najlepszy_atrybut;
  95. }
  96.  
  97.  
  98. -
  99.  
  100.  
  101.  
  102. function treelearn (przyklady, atrybuty, klasa_domyslna) {
  103. //=====================================================zwracamy liscie dla konkretnych przypadkow (1/3 pkt)
  104. if (przyklady.length == 0) {
  105. return klasa_domyslna;
  106. }
  107. //sprawdzamy czy wszystkie sa ten samej klasy
  108. var klasa = przyklady[0].class;
  109. var wszystkie_takie_same = true;
  110. for ( var i in przyklady) {
  111. if (przyklady[i].class != klasa){
  112. wszystkie_takie_same = false;
  113. }
  114. }
  115. if (wszystkie_takie_same) return klasa;
  116. if (atrybuty.length == 0) {
  117.  
  118. return najczestsza_klasa(przyklady);
  119. }
  120. //=====================================================
  121. // jelsi wierzcholek jest atrybute tzn ze jest pytaniem
  122.  
  123. var wybrany_atrybut = atrybuty[0]; // bierzemu pierwszy z brzegu atrybut
  124. //wybieramy atrybut pierwszy z lewej bo nei bylo minimalizacji entropii!!!pkt 4
  125.  
  126. + var wybrany_atrybut = znajdz_najlepszy_atrybut(przyklady, atrybuty);
  127. var T = {};
  128. T[wybrany_atrybut] = {};//
  129.  
  130.  
  131.  
  132. var nowa_klasa_domyslna = najczestsza_klasa(przyklady);// pkt 5
  133.  
  134. //pkt 6 W unikalne wystapienia - np 2
  135. // raport jakie wystepuja ilosc nog
  136. var wartosci_wybranego_atrybutu = wszystkie_wartosci_atrybutu(przyklady,wybrany_atrybut);
  137. //pkt 6
  138. for (var i in wartosci_wybranego_atrybutu) {
  139.  
  140. var W = wartosci_wybranego_atrybutu[i];
  141. var nowe_przyklady = przyklady.filter(function (element) {
  142. if (element[wybrany_atrybut] == W) {//odczytujemy atrybut - zwierze co chcemy
  143. // zwierze(element) ilosc nog(atrybut): 2(wartosc atrybutu)
  144. return true;
  145. }
  146. else return false;
  147. });// interesuja nas te co maja okreslona wartosc danego atrybuty np konkretnei 2 nogi
  148.  
  149.  
  150. T[wybrany_atrybut][W] = treelearn(nowe_przyklady,lista_minus_element(wybrany_atrybut,atrybuty),nowa_klasa_domyslna);// pkt 6 b)
  151. }
  152.  
  153. return T;
  154.  
  155. }
  156.  
  157. module.exports = treelearn;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement