Kemudraj

januari_drva

Aug 22nd, 2017
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 10.12 KB | None | 0 0
  1. trainingData=[
  2. [6.3,2.9,5.6,1.8,'I. virginica'],
  3. [6.5,3.0,5.8,2.2,'I. virginica'],
  4. [7.6,3.0,6.6,2.1,'I. virginica'],
  5. [4.9,2.5,4.5,1.7,'I. virginica'],
  6. [7.3,2.9,6.3,1.8,'I. virginica'],
  7. [6.7,2.5,5.8,1.8,'I. virginica'],
  8. [7.2,3.6,6.1,2.5,'I. virginica'],
  9. [6.5,3.2,5.1,2.0,'I. virginica'],
  10. [6.4,2.7,5.3,1.9,'I. virginica'],
  11. [6.8,3.0,5.5,2.1,'I. virginica'],
  12. [5.7,2.5,5.0,2.0,'I. virginica'],
  13. [5.8,2.8,5.1,2.4,'I. virginica'],
  14. [6.4,3.2,5.3,2.3,'I. virginica'],
  15. [6.5,3.0,5.5,1.8,'I. virginica'],
  16. [7.7,3.8,6.7,2.2,'I. virginica'],
  17. [7.7,2.6,6.9,2.3,'I. virginica'],
  18. [6.0,2.2,5.0,1.5,'I. virginica'],
  19. [6.9,3.2,5.7,2.3,'I. virginica'],
  20. [5.6,2.8,4.9,2.0,'I. virginica'],
  21. [7.7,2.8,6.7,2.0,'I. virginica'],
  22. [6.3,2.7,4.9,1.8,'I. virginica'],
  23. [6.7,3.3,5.7,2.1,'I. virginica'],
  24. [7.2,3.2,6.0,1.8,'I. virginica'],
  25. [6.2,2.8,4.8,1.8,'I. virginica'],
  26. [6.1,3.0,4.9,1.8,'I. virginica'],
  27. [6.4,2.8,5.6,2.1,'I. virginica'],
  28. [7.2,3.0,5.8,1.6,'I. virginica'],
  29. [7.4,2.8,6.1,1.9,'I. virginica'],
  30. [7.9,3.8,6.4,2.0,'I. virginica'],
  31. [6.4,2.8,5.6,2.2,'I. virginica'],
  32. [6.3,2.8,5.1,1.5,'I. virginica'],
  33. [6.1,2.6,5.6,1.4,'I. virginica'],
  34. [7.7,3.0,6.1,2.3,'I. virginica'],
  35. [6.3,3.4,5.6,2.4,'I. virginica'],              
  36. [5.1,3.5,1.4,0.2,'I. setosa'],
  37. [4.9,3.0,1.4,0.2,'I. setosa'],
  38. [4.7,3.2,1.3,0.2,'I. setosa'],
  39. [4.6,3.1,1.5,0.2,'I. setosa'],
  40. [5.0,3.6,1.4,0.2,'I. setosa'],
  41. [5.4,3.9,1.7,0.4,'I. setosa'],
  42. [4.6,3.4,1.4,0.3,'I. setosa'],
  43. [5.0,3.4,1.5,0.2,'I. setosa'],
  44. [4.4,2.9,1.4,0.2,'I. setosa'],
  45. [4.9,3.1,1.5,0.1,'I. setosa'],
  46. [5.4,3.7,1.5,0.2,'I. setosa'],
  47. [4.8,3.4,1.6,0.2,'I. setosa'],
  48. [4.8,3.0,1.4,0.1,'I. setosa'],
  49. [4.3,3.0,1.1,0.1,'I. setosa'],
  50. [5.8,4.0,1.2,0.2,'I. setosa'],
  51. [5.7,4.4,1.5,0.4,'I. setosa'],
  52. [5.4,3.9,1.3,0.4,'I. setosa'],
  53. [5.1,3.5,1.4,0.3,'I. setosa'],
  54. [5.7,3.8,1.7,0.3,'I. setosa'],
  55. [5.1,3.8,1.5,0.3,'I. setosa'],
  56. [5.4,3.4,1.7,0.2,'I. setosa'],
  57. [5.1,3.7,1.5,0.4,'I. setosa'],
  58. [4.6,3.6,1.0,0.2,'I. setosa'],
  59. [5.1,3.3,1.7,0.5,'I. setosa'],
  60. [4.8,3.4,1.9,0.2,'I. setosa'],
  61. [5.0,3.0,1.6,0.2,'I. setosa'],
  62. [5.0,3.4,1.6,0.4,'I. setosa'],
  63. [5.2,3.5,1.5,0.2,'I. setosa'],
  64. [5.2,3.4,1.4,0.2,'I. setosa'],
  65. [5.5,2.3,4.0,1.3,'I. versicolor'],
  66. [6.5,2.8,4.6,1.5,'I. versicolor'],
  67. [5.7,2.8,4.5,1.3,'I. versicolor'],
  68. [6.3,3.3,4.7,1.6,'I. versicolor'],
  69. [4.9,2.4,3.3,1.0,'I. versicolor'],
  70. [6.6,2.9,4.6,1.3,'I. versicolor'],
  71. [5.2,2.7,3.9,1.4,'I. versicolor'],
  72. [5.0,2.0,3.5,1.0,'I. versicolor'],
  73. [5.9,3.0,4.2,1.5,'I. versicolor'],
  74. [6.0,2.2,4.0,1.0,'I. versicolor'],
  75. [6.1,2.9,4.7,1.4,'I. versicolor'],
  76. [5.6,2.9,3.6,1.3,'I. versicolor'],
  77. [6.7,3.1,4.4,1.4,'I. versicolor'],
  78. [5.6,3.0,4.5,1.5,'I. versicolor'],
  79. [5.8,2.7,4.1,1.0,'I. versicolor'],
  80. [6.2,2.2,4.5,1.5,'I. versicolor'],
  81. [5.6,2.5,3.9,1.1,'I. versicolor'],
  82. [5.9,3.2,4.8,1.8,'I. versicolor'],
  83. [6.1,2.8,4.0,1.3,'I. versicolor'],
  84. [6.3,2.5,4.9,1.5,'I. versicolor'],
  85. [6.1,2.8,4.7,1.2,'I. versicolor'],
  86. [6.4,2.9,4.3,1.3,'I. versicolor'],
  87. [6.6,3.0,4.4,1.4,'I. versicolor'],
  88. [6.8,2.8,4.8,1.4,'I. versicolor'],
  89. [6.7,3.0,5.0,1.7,'I. versicolor'],
  90. [6.0,2.9,4.5,1.5,'I. versicolor'],
  91. [5.7,2.6,3.5,1.0,'I. versicolor'],
  92. [5.5,2.4,3.8,1.1,'I. versicolor'],
  93. [5.5,2.4,3.7,1.0,'I. versicolor'],
  94. [5.8,2.7,3.9,1.2,'I. versicolor'],
  95. [6.0,2.7,5.1,1.6,'I. versicolor'],
  96. [5.4,3.0,4.5,1.5,'I. versicolor'],
  97. [6.0,3.4,4.5,1.6,'I. versicolor'],
  98. [6.7,3.1,4.7,1.5,'I. versicolor'],
  99. [6.3,2.3,4.4,1.3,'I. versicolor'],
  100. [5.6,3.0,4.1,1.3,'I. versicolor'],
  101. [5.5,2.5,4.0,1.3,'I. versicolor'],
  102. [5.5,2.6,4.4,1.2,'I. versicolor'],
  103. [6.1,3.0,4.6,1.4,'I. versicolor'],
  104. [5.8,2.6,4.0,1.2,'I. versicolor'],
  105. [5.0,2.3,3.3,1.0,'I. versicolor'],
  106. [5.6,2.7,4.2,1.3,'I. versicolor'],
  107. [5.7,3.0,4.2,1.2,'I. versicolor'],
  108. [5.7,2.9,4.2,1.3,'I. versicolor'],
  109. [6.2,2.9,4.3,1.3,'I. versicolor'],
  110. [5.1,2.5,3.0,1.1,'I. versicolor'],
  111. [5.7,2.8,4.1,1.3,'I. versicolor'],
  112. [6.4,3.1,5.5,1.8,'I. virginica'],
  113. [6.0,3.0,4.8,1.8,'I. virginica'],
  114. [6.9,3.1,5.4,2.1,'I. virginica'],
  115. [6.7,3.1,5.6,2.4,'I. virginica'],
  116. [6.9,3.1,5.1,2.3,'I. virginica'],
  117. [5.8,2.7,5.1,1.9,'I. virginica'],
  118. [6.8,3.2,5.9,2.3,'I. virginica'],
  119. [6.7,3.3,5.7,2.5,'I. virginica'],
  120. [6.7,3.0,5.2,2.3,'I. virginica'],
  121. [6.3,2.5,5.0,1.9,'I. virginica'],
  122. [6.5,3.0,5.2,2.0,'I. virginica'],
  123. [6.2,3.4,5.4,2.3,'I. virginica'],
  124. [4.7,3.2,1.6,0.2,'I. setosa'],
  125. [4.8,3.1,1.6,0.2,'I. setosa'],
  126. [5.4,3.4,1.5,0.4,'I. setosa'],
  127. [5.2,4.1,1.5,0.1,'I. setosa'],
  128. [5.5,4.2,1.4,0.2,'I. setosa'],
  129. [4.9,3.1,1.5,0.2,'I. setosa'],
  130. [5.0,3.2,1.2,0.2,'I. setosa'],
  131. [5.5,3.5,1.3,0.2,'I. setosa'],
  132. [4.9,3.6,1.4,0.1,'I. setosa'],
  133. [4.4,3.0,1.3,0.2,'I. setosa'],
  134. [5.1,3.4,1.5,0.2,'I. setosa'],
  135. [5.0,3.5,1.3,0.3,'I. setosa'],
  136. [4.5,2.3,1.3,0.3,'I. setosa'],
  137. [4.4,3.2,1.3,0.2,'I. setosa'],
  138. [5.0,3.5,1.6,0.6,'I. setosa'],
  139. [5.1,3.8,1.9,0.4,'I. setosa'],
  140. [4.8,3.0,1.4,0.3,'I. setosa'],
  141. [5.1,3.8,1.6,0.2,'I. setosa'],
  142. [5.9,3.0,5.1,1.8,'I. virginica']
  143. ]
  144.  
  145. class decisionnode:
  146.     def __init__(self, col=-1, value=None, results=None, tb=None, fb=None):
  147.         self.col = col
  148.         self.value = value
  149.         self.results = results
  150.         self.tb = tb
  151.         self.fb = fb
  152.  
  153.  
  154. def sporedi_broj(row, column, value):
  155.     return row[column] >= value
  156.  
  157.  
  158. def sporedi_string(row, column, value):
  159.     return row[column] == value
  160.  
  161.  
  162. # Divides a set on a specific column. Can handle numeric
  163. # or nominal values
  164. def divideset(rows, column, value):
  165.     # Make a function that tells us if a row is in
  166.     # the first group (true) or the second group (false)
  167.     split_function = None
  168.     if isinstance(value, int) or isinstance(value, float):  # ako vrednosta so koja sporeduvame e od tip int ili float
  169.         # split_function=lambda row:row[column]>=value # togas vrati funkcija cij argument e row i vrakja vrednost true ili false
  170.         split_function = sporedi_broj
  171.     else:
  172.         # split_function=lambda row:row[column]==value # ako vrednosta so koja sporeduvame e od drug tip (string)
  173.         split_function = sporedi_string
  174.  
  175.     # Divide the rows into two sets and return them
  176.     set_false = []
  177.     set_true = []
  178.     for row in rows:
  179.         if split_function(row, column, value):
  180.             set_true.append(row)
  181.         else:
  182.             set_false.append(row)
  183.     set1 = [row for row in rows if
  184.             split_function(row, column, value)]  # za sekoj row od rows za koj split_function vrakja true
  185.     set2 = [row for row in rows if
  186.             not split_function(row, column, value)]  # za sekoj row od rows za koj split_function vrakja false
  187.     # return (set1, set2)
  188.     return (set_true, set_false)
  189.  
  190. def uniquecounts(rows):
  191.     results = {}
  192.     for row in rows:
  193.         # The result is the last column
  194.         r = row[-1]
  195.         results.setdefault(r, 0)
  196.         results[r] += 1
  197.  
  198.     return results
  199.  
  200. def log2(x):
  201.     from math import log
  202.     l2 = log(x) / log(2)
  203.     return l2
  204.  
  205. def entropy(rows):
  206.     results = uniquecounts(rows)
  207.     # Now calculate the entropy
  208.     ent = 0.0
  209.     for r in results.keys():
  210.         p = float(results[r]) / len(rows)
  211.         ent = ent - p * log2(p)
  212.     return ent
  213.  
  214. def buildtree(rows, scoref=entropy):
  215.     if len(rows) == 0: return decisionnode()
  216.     current_score = scoref(rows)
  217.  
  218.     # Set up some variables to track the best criteria
  219.     best_gain = 0.0
  220.     best_column = -1
  221.     best_value = None
  222.     best_subsetf = None
  223.     best_subsett = None
  224.  
  225.     column_count = len(rows[0]) - 1
  226.     for col in range(column_count):
  227.         # Generate the list of different values in
  228.         # this column
  229.         column_values = set()
  230.         for row in rows:
  231.             column_values.add(row[col])
  232.         # Now try dividing the rows up for each value
  233.         # in this column
  234.         for value in column_values:
  235.             (set1, set2) = divideset(rows, col, value)
  236.  
  237.             # Information gain
  238.             p = float(len(set1)) / len(rows)
  239.             gain = current_score - p * scoref(set1) - (1 - p) * scoref(set2)
  240.             if gain > best_gain and len(set1) > 0 and len(set2) > 0:
  241.                 best_gain = gain
  242.                 best_column = col
  243.                 best_value = value
  244.                 best_subsett = set1
  245.                 best_subsetf = set2
  246.                 # best_criteria = (col, value)
  247.                 # best_sets = (set1, set2)
  248.  
  249.     # Create the subbranches
  250.     if best_gain > 0:
  251.         trueBranch = buildtree(best_subsett, scoref)
  252.         falseBranch = buildtree(best_subsetf, scoref)
  253.         return decisionnode(col=best_column, value=best_value,
  254.                             tb=trueBranch, fb=falseBranch)
  255.     else:
  256.         return decisionnode(results=uniquecounts(rows))
  257.    
  258. def classify(observation, tree):
  259.         if tree.results != None:
  260.             return tree.results
  261.         else:
  262.             vrednost = observation[tree.col]
  263.             branch = None
  264.  
  265.             if isinstance(vrednost, int) or isinstance(vrednost, float):
  266.                 if vrednost >= tree.value:
  267.                     branch = tree.tb
  268.                 else:
  269.                     branch = tree.fb
  270.             else:
  271.                 if vrednost == tree.value:
  272.                     branch = tree.tb
  273.                 else:
  274.                     branch = tree.fb
  275.  
  276.             return classify(observation, branch)
  277. if __name__ == "__main__":
  278.    
  279.  
  280.     att1=input()
  281.     att2=input()
  282.     att3=input()
  283.     att4=input()
  284.     planttype=input()
  285.     testCase=[att1,att2,att3,att4,planttype]
  286.     mn1=[] #kreiranje prvo mnozestvo
  287.     mn2=[] #kreiranje vtoro mnozestvo
  288.     vkupno=len(trainingData) #vkupno redovi
  289.     for i in range(0,vkupno/2): #polnenje na prvo trening mnozhestvo
  290.         mn1.append(trainingData[i])
  291.     for i in range(vkupno/2,vkupno): # polnenje na vtoro trening mnozhestvo
  292.         mn2.append(trainingData[i])
  293.     drvo1=buildtree(mn1) #kreiranje prvo drvo od prvo trening mnozhestvo
  294.     drvo2=buildtree(mn2) #kreiranje vtoro drvo od vtoro trening mnozhestvo
  295.     kl1=classify(testCase,drvo1) #prva klasifikacija
  296.     kl2=classify(testCase,drvo2) #vtora klasifikacija
  297.     if (kl1.keys()[0]==kl2.keys()[0]): #proverka dali se isti
  298.         print kl1.keys()[0]
  299.     if(kl1.values()[0]>kl2.values()[0]):
  300.         print kl1.keys()[0]
  301.         print 'KONTRADIKCIJA'
  302.     if(kl2.values()[0]>kl1.values()[0]):
  303.         print kl1.keys()[0]
  304.         print 'KONTRADIKCIJA'
Advertisement
Add Comment
Please, Sign In to add comment