ivanakarpuzova

kontraDrva

Sep 10th, 2019
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.03 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.  
  146. class decisionnode(object):
  147. def __init__(self, col=-1, value=None, results=None, tb=None, fb=None):
  148. self.col = col
  149. self.value = value
  150. self.results = results
  151. self.tb = tb
  152. self.fb = fb
  153.  
  154.  
  155. def sporedi_broj(value1, value2):
  156. return value1 >= value2
  157.  
  158.  
  159. def sporedi_string(value1, value2):
  160. return value1 == value2
  161.  
  162.  
  163. # In[43]:
  164.  
  165.  
  166. def get_compare_func(value):
  167. if isinstance(value, int) or isinstance(value, float):
  168. comparer = sporedi_broj
  169. else:
  170. comparer = sporedi_string
  171. return comparer
  172.  
  173.  
  174. def compare_values(v1, v2):
  175. sporedi = get_compare_func(v1)
  176. return sporedi(v1, v2)
  177.  
  178.  
  179. def divideset(rows, column, value):
  180. sporedi = get_compare_func(value)
  181. # print(split_function)
  182. # Divide the rows into two sets and return them
  183. set_false = []
  184. set_true = []
  185. for row in rows:
  186. uslov = sporedi(row[column], value)
  187. # print(column, value, row[column], uslov, row)
  188. if uslov:
  189. set_true.append(row)
  190. else:
  191. set_false.append(row)
  192. # print(len(set_true), len(set_false))
  193. # set_true = [row for row in rows if
  194. # split_function(row, column, value)] # za sekoj row od rows za koj split_function vrakja true
  195. # set_false = [row for row in rows if
  196. # not split_function(row, column, value)] # za sekoj row od rows za koj split_function vrakja false
  197. return (set_true, set_false)
  198.  
  199.  
  200. def uniquecounts(rows):
  201. d = {}
  202. for r in rows:
  203. # print(r[-1])
  204. d.setdefault(r[-1], 0)
  205. d[r[-1]] += 1
  206. return d
  207.  
  208.  
  209. from math import log
  210.  
  211. log2 = lambda x: log(x) / log(2)
  212.  
  213.  
  214. def entropy(rows):
  215. results = uniquecounts(rows)
  216. # Now calculate the entropy
  217. ent = 0.0
  218. n = len(rows)
  219. for label, cnt in results.items():
  220. # print(r)
  221. p = float(cnt) / n
  222. # print(label, cnt, p)
  223. ent -= p * log2(p)
  224. return ent
  225.  
  226.  
  227. def info_gain(current_score, sets, scoref=entropy):
  228. m = sum([len(s) for s in sets])
  229. gain = current_score
  230. for s in sets:
  231. n = len(s)
  232. p = 1. * n / m
  233. gain -= p * scoref(s)
  234. return gain
  235.  
  236.  
  237. def buildtree(rows, scoref=entropy):
  238. if len(rows) == 0:
  239. return decisionnode()
  240. current_score = scoref(rows)
  241.  
  242. # Set up some variables to track the best criteria
  243. best_gain = 0.0
  244. best_column = -1
  245. best_value = None
  246. best_subsetf = None
  247. best_subsett = None
  248.  
  249. column_count = len(rows[0]) - 1
  250. for col in range(column_count):
  251. # Generate the list of different values in
  252. # this column
  253. # column_values = set()
  254. # for row in rows:
  255. # column_values.add(row[col])
  256. # print(column_values)
  257. column_values = set([row[col] for row in rows])
  258. # print('Zemame vo predvid podelba po:', col, len(column_values), column_values)
  259. # continue
  260. # Now try dividing the rows up for each value
  261. # in this column
  262. for value in column_values:
  263. sets = divideset(rows, col, value)
  264.  
  265. # Information gain
  266. # p = float(len(set1)) / len(rows)
  267. # gain = current_score - p * scoref(set1) - (1 - p) * scoref(set2)
  268. gain = info_gain(current_score, sets, scoref)
  269. if gain > best_gain and len(sets) > 0 and len(sets[0]) > 0 and len(sets[1]) > 0:
  270. best_gain = gain
  271. best_column = col
  272. best_value = value
  273. best_subsett = sets[0]
  274. best_subsetf = sets[1]
  275. # best_criteria = (col, value)
  276. # best_sets = (set1, set2)
  277. # print('Dividing dataset', col, value, gain, sets)
  278. # pronajden e korenot
  279. # return
  280. # Create the subbranches
  281. if best_gain > 0:
  282. # print(best_subsett)
  283. # print(best_subsetf)
  284. #print(best_column, best_value, best_gain)
  285. #print('Starting true subbranch')
  286. trueBranch = buildtree(best_subsett, scoref)
  287. #print()
  288. #print('Starting false subbranch')
  289. falseBranch = buildtree(best_subsetf, scoref)
  290. #print()
  291. return decisionnode(col=best_column, value=best_value,
  292. tb=trueBranch, fb=falseBranch)
  293.  
  294. else:
  295. #print('Terminalen jazol')
  296. #print()
  297. return decisionnode(results=uniquecounts(rows))
  298.  
  299.  
  300. def printtree(tree, indent=''):
  301. # Is this a leaf node?
  302. if tree.results != None:
  303. print(indent + str(sorted(tree.results.items())))
  304. else:
  305. # Print the criteria
  306. print(indent + str(tree.col) + ':' + str(tree.value) + '? ')
  307. # Print the branches
  308. print(indent + 'T->')
  309. printtree(tree.tb, indent + ' ')
  310. print(indent + 'F->')
  311. printtree(tree.fb, indent + ' ')
  312.  
  313.  
  314. def classify(observation, tree):
  315. if tree.results != None:
  316. # return tree.results
  317. if len(tree.results) == 1:
  318. return list(tree.results.keys())[0], 1.0
  319. else:
  320. inv = sorted([(cnt, label) for label, cnt in tree.results.items()], reverse=True)
  321. label = inv[0][1]
  322. cnt = inv[0][0]
  323. total_count = sum(tree.results.values())
  324. return label, cnt / total_count
  325. # return tree.results
  326. else:
  327. vrednost = observation[tree.col]
  328. if compare_values(vrednost, tree.value):
  329. branch = tree.tb
  330. else:
  331. branch = tree.fb
  332. return classify(observation, branch)
  333.  
  334.  
  335. if __name__ == '__main__':
  336.  
  337. arg1 = 3.3
  338. arg2 = 3.2
  339. arg3 = 3.3
  340. arg4 = 1.7
  341. cl = 'NA'
  342.  
  343. tmp = [arg1, arg2, arg3, arg4, cl]
  344. m1 = []
  345. m2 = []
  346. leng = len(trainingData)
  347. for i in range(0, int(leng / 2)):
  348. m1.append(trainingData[i])
  349. for i in range (int(leng / 2), leng):
  350. m2.append(trainingData[i])
  351.  
  352. t1 = buildtree(m1)
  353. t2 = buildtree(m2)
  354.  
  355. k1 = classify(tmp, t1)
  356. k2 = classify(tmp, t2)
  357. print('k1', k1)
  358. print('k2', k2)
  359.  
  360. if (k1 == k2):
  361. print("Ista klasa ", k1)
  362. else:
  363. print("Kontradikcija")
Advertisement
Add Comment
Please, Sign In to add comment