Advertisement
Guest User

Untitled

a guest
Nov 13th, 2019
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 18.78 KB | None | 0 0
  1. data=[[180.0, 23.6, 25.2, 27.9, 25.4, 14.0, 'Roach'],
  2. [12.2, 11.5, 12.2, 13.4, 15.6, 10.4, 'Smelt'],
  3. [135.0, 20.0, 22.0, 23.5, 25.0, 15.0, 'Perch'],
  4. [1600.0, 56.0, 60.0, 64.0, 15.0, 9.6, 'Pike'],
  5. [120.0, 20.0, 22.0, 23.5, 26.0, 14.5, 'Perch'],
  6. [273.0, 23.0, 25.0, 28.0, 39.6, 14.8, 'Silver Bream'],
  7. [320.0, 27.8, 30.0, 31.6, 24.1, 15.1, 'Perch'],
  8. [160.0, 21.1, 22.5, 25.0, 25.6, 15.2, 'Roach'],
  9. [700.0, 30.4, 33.0, 38.3, 38.8, 13.8, 'Bream'],
  10. [500.0, 29.5, 32.0, 37.3, 37.3, 13.6, 'Bream'],
  11. [290.0, 24.0, 26.3, 31.2, 40.0, 13.8, 'Bream'],
  12. [650.0, 31.0, 33.5, 38.7, 37.4, 14.8, 'Bream'],
  13. [500.0, 26.8, 29.7, 34.5, 41.1, 15.3, 'Bream'],
  14. [260.0, 25.4, 27.5, 28.9, 24.8, 15.0, 'Perch'],
  15. [80.0, 17.2, 19.0, 20.2, 27.9, 15.1, 'Perch'],
  16. [850.0, 32.8, 36.0, 41.6, 40.6, 14.9, 'Bream'],
  17. [345.0, 36.0, 38.5, 41.0, 15.6, 9.7, 'Pike'],
  18. [567.0, 43.2, 46.0, 48.7, 16.0, 10.0, 'Pike'],
  19. [55.0, 13.5, 14.7, 16.5, 41.5, 14.1, 'Silver Bream'],
  20. [78.0, 16.8, 18.7, 19.4, 26.8, 16.1, 'Perch'],
  21. [950.0, 38.0, 41.0, 46.5, 37.9, 13.7, 'Bream'],
  22. [306.0, 25.6, 28.0, 30.8, 28.5, 15.2, 'Whitewish'],
  23. [6.7, 9.3, 9.8, 10.8, 16.1, 9.7, 'Smelt'],
  24. [714.0, 32.7, 36.0, 41.5, 39.8, 14.1, 'Bream'],
  25. [197.0, 23.5, 25.6, 27.0, 24.3, 15.7, 'Perch'],
  26. [1000.0, 41.1, 44.0, 46.6, 26.8, 16.3, 'Perch'],
  27. [685.0, 34.0, 36.5, 39.0, 27.9, 17.6, 'Perch'],
  28. [169.0, 22.0, 24.0, 27.2, 27.7, 14.1, 'Roach'],
  29. [125.0, 19.0, 21.0, 22.5, 25.3, 16.3, 'Perch'],
  30. [1000.0, 33.5, 37.0, 42.6, 44.5, 15.5, 'Bream'],
  31. [900.0, 36.5, 39.0, 41.4, 26.9, 18.1, 'Perch'],
  32. [19.7, 13.2, 14.3, 15.2, 18.9, 13.6, 'Smelt'],
  33. [150.0, 20.4, 22.0, 24.7, 23.5, 15.2, 'Roach'],
  34. [120.0, 17.5, 19.0, 21.3, 39.4, 13.7, 'Silver Bream'],
  35. [140.0, 19.0, 20.7, 23.2, 36.8, 14.2, 'Silver Bream'],
  36. [290.0, 24.0, 26.0, 29.2, 30.4, 15.4, 'Roach'],
  37. [725.0, 31.8, 35.0, 40.9, 40.0, 14.8, 'Bream'],
  38. [1000.0, 40.2, 43.5, 46.0, 27.4, 17.7, 'Perch'],
  39. [188.0, 22.6, 24.6, 26.2, 25.7, 15.9, 'Perch'],
  40. [242.0, 23.2, 25.4, 30.0, 38.4, 13.4, 'Bream'],
  41. [475.0, 28.4, 31.0, 36.2, 39.4, 14.1, 'Bream'],
  42. [700.0, 30.4, 33.0, 38.5, 38.8, 13.5, 'Bream'],
  43. [120.0, 18.6, 20.0, 22.2, 28.0, 16.1, 'Roach'],
  44. [820.0, 36.6, 39.0, 41.3, 30.1, 17.8, 'Perch'],
  45. [540.0, 28.5, 31.0, 34.0, 31.6, 19.3, 'Whitewish'],
  46. [150.0, 20.5, 22.5, 24.0, 28.3, 15.1, 'Perch'],
  47. [161.0, 22.0, 23.4, 26.7, 25.9, 13.6, 'Roach'],
  48. [60.0, 14.3, 15.5, 17.4, 37.8, 13.3, 'Silver Bream'],
  49. [840.0, 32.5, 35.0, 37.3, 30.8, 20.9, 'Perch'],
  50. [300.0, 24.0, 26.0, 29.0, 39.2, 14.6, 'Silver Bream'],
  51. [300.0, 25.2, 27.3, 28.7, 29.0, 17.9, 'Perch'],
  52. [180.0, 23.0, 25.0, 26.5, 24.3, 13.9, 'Perch'],
  53. [85.0, 18.2, 20.0, 21.0, 24.2, 13.2, 'Perch'],
  54. [130.0, 20.5, 22.5, 24.0, 24.4, 15.1, 'Perch'],
  55. [900.0, 37.0, 40.0, 42.5, 27.6, 17.0, 'Perch'],
  56. [9.9, 11.3, 11.8, 13.1, 16.9, 8.9, 'Smelt'],
  57. [620.0, 31.5, 34.5, 39.7, 39.1, 13.3, 'Bream'],
  58. [720.0, 32.0, 35.0, 40.6, 40.3, 15.0, 'Bream'],
  59. [270.0, 23.6, 26.0, 28.7, 29.2, 14.8, 'Whitewish'],
  60. [40.0, 13.8, 15.0, 16.0, 23.9, 15.2, 'Perch'],
  61. [5.9, 7.5, 8.4, 8.8, 24.0, 16.0, 'Perch'],
  62. [115.0, 19.0, 21.0, 22.5, 26.3, 14.7, 'Perch'],
  63. [110.0, 20.0, 22.0, 23.5, 23.5, 17.0, 'Perch'],
  64. [300.0, 26.9, 28.7, 30.1, 25.2, 15.4, 'Perch'],
  65. [363.0, 26.3, 29.0, 33.5, 38.0, 13.3, 'Bream'],
  66. [690.0, 34.6, 37.0, 39.3, 26.9, 16.2, 'Perch'],
  67. [820.0, 37.1, 40.0, 42.5, 26.2, 15.6, 'Perch'],
  68. [19.9, 13.8, 15.0, 16.2, 18.1, 11.6, 'Smelt'],
  69. [40.0, 12.9, 14.1, 16.2, 25.6, 14.0, 'Roach'],
  70. [390.0, 27.6, 30.0, 35.0, 36.2, 13.4, 'Bream'],
  71. [1250.0, 52.0, 56.0, 59.7, 17.9, 11.7, 'Pike'],
  72. [87.0, 18.2, 19.8, 22.2, 25.3, 14.3, 'Roach'],
  73. [9.8, 10.7, 11.2, 12.4, 16.8, 10.3, 'Smelt'],
  74. [13.4, 11.7, 12.4, 13.5, 18.0, 9.4, 'Smelt'],
  75. [975.0, 37.4, 41.0, 45.9, 40.6, 14.7, 'Bream'],
  76. [1100.0, 39.0, 42.0, 44.6, 28.7, 15.4, 'Perch'],
  77. [130.0, 20.0, 22.0, 23.5, 26.0, 15.0, 'Perch'],
  78. [450.0, 27.6, 30.0, 35.1, 39.9, 13.8, 'Bream'],
  79. [200.0, 30.0, 32.3, 34.8, 16.0, 9.7, 'Pike'],
  80. [340.0, 23.9, 26.5, 31.1, 39.8, 15.1, 'Bream'],
  81. [700.0, 34.0, 36.0, 38.3, 27.7, 17.6, 'Perch'],
  82. [170.0, 21.5, 23.5, 25.0, 25.1, 14.9, 'Perch'],
  83. [500.0, 29.1, 31.5, 36.4, 37.8, 12.0, 'Bream'],
  84. [150.0, 18.4, 20.0, 22.4, 39.7, 14.7, 'Silver Bream'],
  85. [145.0, 20.7, 22.7, 24.2, 24.6, 15.0, 'Perch'],
  86. [85.0, 17.8, 19.6, 20.8, 24.7, 14.6, 'Perch'],
  87. [600.0, 29.4, 32.0, 37.2, 40.2, 13.9, 'Bream'],
  88. [300.0, 34.8, 37.3, 39.8, 15.8, 10.1, 'Pike'],
  89. [456.0, 40.0, 42.5, 45.5, 16.0, 9.5, 'Pike'],
  90. [540.0, 40.1, 43.0, 45.8, 17.0, 11.2, 'Pike'],
  91. [12.2, 12.1, 13.0, 13.8, 16.5, 9.1, 'Smelt'],
  92. [100.0, 16.2, 18.0, 19.2, 27.2, 17.3, 'Perch'],
  93. [300.0, 32.7, 35.0, 38.8, 15.3, 11.3, 'Pike'],
  94. [700.0, 31.9, 35.0, 40.5, 40.1, 13.8, 'Bream'],
  95. [610.0, 30.9, 33.5, 38.6, 40.5, 13.3, 'Bream'],
  96. [700.0, 34.5, 37.0, 39.4, 27.5, 15.9, 'Perch'],
  97. [70.0, 15.7, 17.4, 18.5, 24.8, 15.9, 'Perch'],
  98. [955.0, 35.0, 38.5, 44.0, 41.1, 14.3, 'Bream'],
  99. [514.0, 30.5, 32.8, 34.0, 29.5, 17.7, 'Perch'],
  100. [51.5, 15.0, 16.2, 17.2, 26.7, 15.3, 'Perch'],
  101. [272.0, 25.0, 27.0, 30.6, 28.0, 15.6, 'Roach'],
  102. [500.0, 28.5, 30.7, 36.2, 39.3, 13.7, 'Bream'],
  103. [9.8, 11.4, 12.0, 13.2, 16.7, 8.7, 'Smelt'],
  104. [510.0, 40.0, 42.5, 45.5, 15.0, 9.8, 'Pike'],
  105. [925.0, 36.2, 39.5, 45.3, 41.4, 14.9, 'Bream'],
  106. [1015.0, 37.0, 40.0, 42.4, 29.2, 17.6, 'Perch'],
  107. [1550.0, 56.0, 60.0, 64.0, 15.0, 9.6, 'Pike'],
  108. [1000.0, 37.3, 40.0, 43.5, 28.4, 15.0, 'Whitewish'],
  109. [920.0, 35.0, 38.5, 44.1, 40.9, 14.3, 'Bream'],
  110. [140.0, 21.0, 22.5, 25.0, 26.2, 13.3, 'Roach'],
  111. [218.0, 25.0, 26.5, 28.0, 25.6, 14.8, 'Perch'],
  112. [9.7, 10.4, 11.0, 12.0, 18.3, 11.5, 'Smelt'],
  113. [69.0, 16.5, 18.2, 20.3, 26.1, 13.9, 'Roach'],
  114. [110.0, 19.0, 21.0, 22.5, 25.3, 15.8, 'Perch'],
  115. [150.0, 21.0, 23.0, 24.5, 21.3, 14.8, 'Perch'],
  116. [160.0, 20.5, 22.5, 25.3, 27.8, 15.1, 'Roach'],
  117. [7.0, 10.1, 10.6, 11.6, 14.9, 9.9, 'Smelt'],
  118. [78.0, 17.5, 18.8, 21.2, 26.3, 13.7, 'Roach'],
  119. [450.0, 26.8, 29.7, 34.7, 39.2, 14.2, 'Bream'],
  120. [556.0, 32.0, 34.5, 36.5, 28.1, 17.5, 'Perch'],
  121. [1650.0, 59.0, 63.4, 68.0, 15.9, 11.0, 'Pike'],
  122. [110.0, 19.1, 20.8, 23.1, 26.7, 14.7, 'Roach'],
  123. [685.0, 31.4, 34.0, 39.2, 40.8, 13.7, 'Bream'],
  124. [200.0, 22.1, 23.5, 26.8, 27.6, 15.4, 'Roach'],
  125. [770.0, 44.8, 48.0, 51.2, 15.0, 10.5, 'Pike'],
  126. [7.5, 10.0, 10.5, 11.6, 17.0, 10.0, 'Smelt'],
  127. [8.7, 10.8, 11.3, 12.6, 15.7, 10.2, 'Smelt'],
  128. [500.0, 42.0, 45.0, 48.0, 14.5, 10.2, 'Pike'],
  129. [170.0, 19.0, 20.7, 23.2, 40.5, 14.7, 'Silver Bream'],
  130. [120.0, 20.0, 22.0, 23.5, 24.0, 15.0, 'Perch'],
  131. [145.0, 19.8, 21.5, 24.1, 40.4, 13.1, 'Silver Bream'],
  132. [130.0, 19.3, 21.3, 22.8, 28.0, 15.5, 'Perch'],
  133. [850.0, 36.9, 40.0, 42.3, 28.2, 16.8, 'Perch'],
  134. [265.0, 25.4, 27.5, 28.9, 24.4, 15.0, 'Perch'],
  135. [0.0, 19.0, 20.5, 22.8, 28.4, 14.7, 'Roach'],
  136. [680.0, 31.8, 35.0, 40.6, 38.1, 15.1, 'Bream'],
  137. [90.0, 16.3, 17.7, 19.8, 37.4, 13.5, 'Silver Bream'],
  138. [575.0, 31.3, 34.0, 39.5, 38.3, 14.1, 'Bream'],
  139. [390.0, 29.5, 31.7, 35.0, 27.1, 15.3, 'Roach'],
  140. [225.0, 22.0, 24.0, 25.5, 28.6, 14.6, 'Perch'],
  141. [10.0, 11.3, 11.8, 13.1, 16.9, 9.8, 'Smelt'],
  142. [1000.0, 39.8, 43.0, 45.2, 26.4, 16.1, 'Perch'],
  143. [500.0, 28.7, 31.0, 36.2, 39.7, 13.3, 'Bream'],
  144. [120.0, 19.4, 21.0, 23.7, 25.8, 13.9, 'Roach'],
  145. [430.0, 35.5, 38.0, 40.5, 18.0, 11.3, 'Pike'],
  146. [200.0, 21.2, 23.0, 25.8, 40.1, 14.2, 'Silver Bream'],
  147. [250.0, 25.9, 28.0, 29.4, 26.6, 14.3, 'Perch'],
  148. [800.0, 33.7, 36.4, 39.6, 29.7, 16.6, 'Whitewish'],
  149. [32.0, 12.5, 13.7, 14.7, 24.0, 13.6, 'Perch'],
  150. [430.0, 26.5, 29.0, 34.0, 36.6, 15.1, 'Bream'],
  151. [145.0, 20.5, 22.0, 24.3, 27.3, 14.6, 'Roach'],
  152. [950.0, 48.3, 51.7, 55.1, 16.2, 11.2, 'Pike'],
  153. [300.0, 31.7, 34.0, 37.8, 15.1, 11.0, 'Pike'],
  154. [250.0, 25.4, 27.5, 28.9, 25.2, 15.8, 'Perch'],
  155. [650.0, 36.5, 39.0, 41.4, 26.9, 14.5, 'Perch'],
  156. [270.0, 24.1, 26.5, 29.3, 27.8, 14.5, 'Whitewish'],
  157. [600.0, 29.4, 32.0, 37.2, 41.5, 15.0, 'Bream'],
  158. [145.0, 22.0, 24.0, 25.5, 25.0, 15.0, 'Perch'],
  159. [1100.0, 40.1, 43.0, 45.5, 27.5, 16.3, 'Perch']]
  160.  
  161. from math import log
  162.  
  163.  
  164. def unique_counts(rows):
  165. """Креирај броење на можни резултати (последната колона
  166. во секоја редица е класата)
  167.  
  168. :param rows: dataset
  169. :type rows: list
  170. :return: dictionary of possible classes as keys and count
  171. as values
  172. :rtype: dict
  173. """
  174. results = {}
  175. for row in rows:
  176. # Клацата е последната колона
  177. r = row[len(row) - 1]
  178. if r not in results:
  179. results[r] = 0
  180. results[r] += 1
  181. return results
  182.  
  183.  
  184. def gini_impurity(rows):
  185. """Probability that a randomly placed item will
  186. be in the wrong category
  187.  
  188. :param rows: dataset
  189. :type rows: list
  190. :return: Gini impurity
  191. :rtype: float
  192. """
  193. total = len(rows)
  194. counts = unique_counts(rows)
  195. imp = 0
  196. for k1 in counts:
  197. p1 = float(counts[k1]) / total
  198. for k2 in counts:
  199. if k1 == k2:
  200. continue
  201. p2 = float(counts[k2]) / total
  202. imp += p1 * p2
  203. return imp
  204.  
  205.  
  206. def entropy(rows):
  207. """Ентропијата е сума од p(x)log(p(x)) за сите
  208. можни резултати
  209.  
  210. :param rows: податочно множество
  211. :type rows: list
  212. :return: вредност за ентропијата
  213. :rtype: float
  214. """
  215. log2 = lambda x: log(x) / log(2)
  216. results = unique_counts(rows)
  217. # Пресметка на ентропијата
  218. ent = 0.0
  219. for r in results.keys():
  220. p = float(results[r]) / len(rows)
  221. ent = ent - p * log2(p)
  222. return ent
  223.  
  224.  
  225. class DecisionNode:
  226. def __init__(self, col=-1, value=None, results=None, tb=None, fb=None):
  227. """
  228. :param col: индексот на колоната (атрибутот) од тренинг множеството
  229. која се претставува со оваа инстанца т.е. со овој јазол
  230. :type col: int
  231. :param value: вредноста на јазолот според кој се дели дрвото
  232. :param results: резултати за тековната гранка, вредност (различна
  233. од None) само кај јазлите-листови во кои се донесува
  234. одлуката.
  235. :type results: dict
  236. :param tb: гранка која се дели од тековниот јазол кога вредноста е
  237. еднаква на value
  238. :type tb: DecisionNode
  239. :param fb: гранка која се дели од тековниот јазол кога вредноста е
  240. различна од value
  241. :type fb: DecisionNode
  242. """
  243. self.col = col
  244. self.value = value
  245. self.results = results
  246. self.tb = tb
  247. self.fb = fb
  248.  
  249.  
  250. def compare_numerical(row, column, value):
  251. """Споредба на вредноста од редицата на посакуваната колона со
  252. зададена нумеричка вредност
  253.  
  254. :param row: дадена редица во податочното множество
  255. :type row: list
  256. :param column: индекс на колоната (атрибутот) од тренирачкото множество
  257. :type column: int
  258. :param value: вредност на јазелот во согласност со кој се прави
  259. поделбата во дрвото
  260. :type value: int or float
  261. :return: True ако редицата >= value, инаку False
  262. :rtype: bool
  263. """
  264. return row[column] >= value
  265.  
  266.  
  267. def compare_nominal(row, column, value):
  268. """Споредба на вредноста од редицата на посакуваната колона со
  269. зададена номинална вредност
  270.  
  271. :param row: дадена редица во податочното множество
  272. :type row: list
  273. :param column: индекс на колоната (атрибутот) од тренирачкото множество
  274. :type column: int
  275. :param value: вредност на јазелот во согласност со кој се прави
  276. поделбата во дрвото
  277. :type value: str
  278. :return: True ако редицата == value, инаку False
  279. :rtype: bool
  280. """
  281. return row[column] == value
  282.  
  283.  
  284. def divide_set(rows, column, value):
  285. """Поделба на множеството според одредена колона. Може да се справи
  286. со нумерички или номинални вредности.
  287.  
  288. :param rows: тренирачко множество
  289. :type rows: list(list)
  290. :param column: индекс на колоната (атрибутот) од тренирачкото множество
  291. :type column: int
  292. :param value: вредност на јазелот во зависност со кој се прави поделбата
  293. во дрвото за конкретната гранка
  294. :type value: int or float or str
  295. :return: поделени подмножества
  296. :rtype: list, list
  297. """
  298. # Направи функција која ни кажува дали редицата е во
  299. # првата група (True) или втората група (False)
  300. if isinstance(value, int) or isinstance(value, float):
  301. # ако вредноста за споредба е од тип int или float
  302. split_function = compare_numerical
  303. else:
  304. # ако вредноста за споредба е од друг тип (string)
  305. split_function = compare_nominal
  306.  
  307. # Подели ги редиците во две подмножества и врати ги
  308. # за секој ред за кој split_function враќа True
  309. set1 = [row for row in rows if
  310. split_function(row, column, value)]
  311. # set1 = []
  312. # for row in rows:
  313. # if not split_function(row, column, value):
  314. # set1.append(row)
  315. # за секој ред за кој split_function враќа False
  316. set2 = [row for row in rows if
  317. not split_function(row, column, value)]
  318. return set1, set2
  319.  
  320.  
  321. def build_tree(rows, scoref=entropy):
  322. """Градење на дрво на одлука.
  323.  
  324. :param rows: тренирачко множество
  325. :type rows: list(list)
  326. :param scoref: функција за одбирање на најдобар атрибут во даден чекор
  327. :type scoref: function
  328. :return: коренот на изграденото дрво на одлука
  329. :rtype: DecisionNode object
  330. """
  331. if len(rows) == 0:
  332. return DecisionNode()
  333. current_score = scoref(rows)
  334.  
  335. # променливи со кои следиме кој критериум е најдобар
  336. best_gain = 0.0
  337. best_criteria = None
  338. best_sets = None
  339.  
  340. column_count = len(rows[0]) - 1
  341. for col in range(0, column_count):
  342. # за секоја колона (col се движи во интервалот од 0 до
  343. # column_count - 1)
  344. # Следниов циклус е за генерирање на речник од различни
  345. # вредности во оваа колона
  346. column_values = {}
  347. for row in rows:
  348. column_values[row[col]] = 1
  349. # за секоја редица се зема вредноста во оваа колона и се
  350. # поставува како клуч во column_values
  351. for value in column_values.keys():
  352. (set1, set2) = divide_set(rows, col, value)
  353.  
  354. # Информациона добивка
  355. p = float(len(set1)) / len(rows)
  356. gain = current_score - p * scoref(set1) - (1 - p) * scoref(set2)
  357. if gain > best_gain and len(set1) > 0 and len(set2) > 0:
  358. best_gain = gain
  359. best_criteria = (col, value)
  360. best_sets = (set1, set2)
  361.  
  362. # Креирај ги подгранките
  363. if best_gain > 0:
  364. true_branch = build_tree(best_sets[0], scoref)
  365. false_branch = build_tree(best_sets[1], scoref)
  366. return DecisionNode(col=best_criteria[0], value=best_criteria[1],
  367. tb=true_branch, fb=false_branch)
  368. else:
  369. return DecisionNode(results=unique_counts(rows))
  370.  
  371.  
  372. def print_tree(tree, indent=''):
  373. """Принтање на дрво на одлука
  374.  
  375. :param tree: коренот на дрвото на одлучување
  376. :type tree: DecisionNode object
  377. :param indent:
  378. :return: None
  379. """
  380. # Дали е ова лист јазел?
  381. if tree.results:
  382. print(str(tree.results))
  383. else:
  384. # Се печати условот
  385. print(str(tree.col) + ':' + str(tree.value) + '? ')
  386. # Се печатат True гранките, па False гранките
  387. print(indent + 'T->', end='')
  388. print_tree(tree.tb, indent + ' ')
  389. print(indent + 'F->', end='')
  390. print_tree(tree.fb, indent + ' ')
  391.  
  392.  
  393. def classify(observation, tree):
  394. """Класификација на нов податочен примерок со изградено дрво на одлука
  395.  
  396. :param observation: еден ред од податочното множество за предвидување
  397. :type observation: list
  398. :param tree: коренот на дрвото на одлучување
  399. :type tree: DecisionNode object
  400. :return: речник со класите како клуч и бројот на појавување во листот на дрвото
  401. за класификација како вредност во речникот
  402. :rtype: dict
  403. """
  404. if tree.results:
  405. return tree.results
  406. else:
  407. value = observation[tree.col]
  408. if isinstance(value, int) or isinstance(value, float):
  409. compare = compare_numerical
  410. else:
  411. compare = compare_nominal
  412.  
  413. if compare(observation, tree.col, tree.value):
  414. branch = tree.tb
  415. else:
  416. branch = tree.fb
  417.  
  418. return classify(observation, branch)
  419.  
  420.  
  421. from math import log10
  422. log2 = lambda x: log10(x)/log10(2)
  423.  
  424. if __name__ == "__main__":
  425.  
  426. test_case = input()
  427. test_case = [float(x) for x in test_case.split(', ')[:-1]] + [test_case.split(', ')[-1]]\
  428.  
  429. lista = []
  430. for x in data:
  431. if x[-1] == 'Roach':
  432. lista.append(x)
  433.  
  434.  
  435. lista2 = []
  436. for x in data:
  437. if x[-1] == 'Pike':
  438. lista2.append(x)
  439.  
  440. train_data = lista[0:40] + lista2[0:40]
  441.  
  442. tree = build_tree(train_data, entropy)
  443.  
  444. print(max(classify(test_case, tree).items(), key=lambda x: x[1])[0])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement