Kemudraj

drva_zad2

Aug 22nd, 2017
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.37 KB | None | 0 0
  1. Задача 2 Problem 2 (1 / 1)
  2. Да се промени функцијата за предвидување, така што таа ќе ја печати само класата која ја предвидува (а не речник како сега). Притоа да се проверува дали во листот има повеќе од една класа. Ако има само една класа тогаш се предвидува истата, но ако има повеќе од една треба да се испечати таа со најголем број на инстанци. Ако во листот има неколку класи со ист број на инстанци да се предвиде првата класа по азбучен ред.
  3.  
  4. trainingData=[['slashdot','USA','yes',18,'None'],
  5.         ['google','France','yes',23,'Premium'],
  6.         ['google','France','yes',23,'Basic'],
  7.         ['google','France','yes',23,'Basic'],
  8.         ['digg','USA','yes',24,'Basic'],
  9.         ['kiwitobes','France','yes',23,'Basic'],
  10.         ['google','UK','no',21,'Premium'],
  11.         ['(direct)','New Zealand','no',12,'None'],
  12.         ['(direct)','UK','no',21,'Basic'],
  13.         ['google','USA','no',24,'Premium'],
  14.         ['slashdot','France','yes',19,'None'],
  15.         ['digg','USA','no',18,'None'],
  16.         ['google','UK','no',18,'None'],
  17.         ['kiwitobes','UK','no',19,'None'],
  18.         ['digg','New Zealand','yes',12,'Basic'],
  19.         ['slashdot','UK','no',21,'None'],
  20.         ['google','UK','yes',18,'Basic'],
  21.         ['kiwitobes','France','yes',19,'Basic']]
  22.  
  23. class decisionnode:
  24.       def __init__(self,col=-1,value=None,results=None,tb=None,fb=None, level = 0):
  25.          self.col=col
  26.          self.value=value
  27.          self.results=results
  28.          self.tb=tb
  29.          self.fb=fb
  30.          self.level=level
  31.  
  32. def sporedi_broj(row,column,value):
  33.   return row[column]>=value
  34.  
  35. def sporedi_string(row,column,value):
  36.   return row[column]==value
  37.  
  38.  
  39. def divideset(rows,column,value):
  40.     split_function=None
  41.     if isinstance(value,int) or isinstance(value,float):
  42.        split_function=sporedi_broj
  43.     else:
  44.        
  45.        split_function=sporedi_string
  46.  
  47.    
  48.     set1=[row for row in rows if split_function(row,column,value)]
  49.     set2=[row for row in rows if not split_function(row,column,value)]
  50.     return (set1,set2)
  51.  
  52.  
  53. def uniquecounts(rows):
  54.   results={}
  55.   proba = []
  56.   for row in rows:
  57.      
  58.      r=row[len(row)-1]
  59.      
  60.      if r not in results: results[r]=0
  61.      results[r]+=1
  62.      proba.append(r)
  63.  
  64.   return results
  65.  
  66.  
  67. def MyFun(rows):
  68.   results={}
  69.   proba = []
  70.   for row in rows:
  71.      
  72.      r=row[len(row)-1]
  73.      
  74.      if r not in results: results[r]=0
  75.      results[r]+=1
  76.      proba.append(r)
  77.  
  78.   return proba
  79.  
  80.        
  81.  
  82. def giniimpurity(rows):
  83.       total=len(rows)
  84.       counts=uniquecounts(rows)
  85.       imp=0
  86.       for k1 in counts:
  87.             p1=float(counts[k1])/total
  88.             for k2 in counts:
  89.                   if k1==k2: continue
  90.                   p2=float(counts[k2])/total
  91.                   imp+=p1*p2
  92.       return imp
  93.  
  94.  
  95.  
  96. def entropy(rows):
  97.       from math import log
  98.       log2=lambda x:log(x)/log(2)
  99.       results=uniquecounts(rows)
  100.      
  101.       ent=0.0
  102.       for r in results.keys():
  103.             p=float(results[r])/len(rows)
  104.             ent=ent-p*log2(p)
  105.       return ent
  106.  
  107. def buildtree(rows,scoref=entropy):
  108.       if len(rows)==0: return decisionnode()
  109.       current_score=scoref(rows)
  110.  
  111.      
  112.       best_gain=0.0
  113.       best_criteria=None
  114.       best_sets=None
  115.      
  116.       column_count=len(rows[0])-1
  117.       for col in range(0,column_count):
  118.            
  119.             column_values={}
  120.             for row in rows:
  121.                   column_values[row[col]]=1
  122.            
  123.             for value in column_values.keys():
  124.                   (set1,set2)=divideset(rows,col,value)
  125.                  
  126.                  
  127.                   p=float(len(set1))/len(rows)
  128.                   gain=current_score-p*scoref(set1)-(1-p)*scoref(set2)
  129.                   if gain>best_gain and len(set1)>0 and len(set2)>0:
  130.                         best_gain=gain
  131.                         best_criteria=(col,value)
  132.                         best_sets=(set1,set2)
  133.      
  134.      
  135.       if best_gain>0:
  136.             trueBranch=buildtree(best_sets[0])
  137.             falseBranch=buildtree(best_sets[1])
  138.             return decisionnode(col=best_criteria[0],value=best_criteria[1],
  139.                             tb=trueBranch, fb=falseBranch)
  140.       else:
  141.             return decisionnode(results=uniquecounts(rows))
  142.            
  143.  
  144. def printtree(tree,indent=''):
  145.      
  146.       if tree.results!=None:
  147.             print (str(tree.results))
  148.       else:
  149.  
  150.             print str(tree.col)+':'+str(tree.value)+'? '+' Level='+str(tree.level)
  151.             print indent+'T->', printtree(tree.tb,indent+'  ')
  152.             print indent+'F->', printtree(tree.fb,indent+'  ' )
  153.  
  154.  
  155. def classify(observation,tree):
  156.     if tree.results!=None:
  157.         recnik = tree.results
  158.         lista = []
  159.         for k in recnik.keys():
  160.             torka = (k,recnik[k])
  161.             lista.append(torka)
  162.    
  163.         brKlasi = len(lista)
  164.    
  165.         if brKlasi == 1:
  166.            
  167.             return lista[0][0]
  168.         else:
  169.             flag = 1
  170.             for torka in lista:
  171.                
  172.                 if lista[0][0] != torka[0]:      
  173.                     flag = 0
  174.                     break
  175.  
  176.             if flag == 1:    
  177.                  
  178.                 return lista[0][0]
  179.             else:
  180.                 lista.sort()
  181.                
  182.                 return lista[0][0]  
  183.            
  184.     else:
  185.         vrednost=observation[tree.col]
  186.         branch=None
  187.  
  188.         if isinstance(vrednost,int) or isinstance(vrednost,float):
  189.             if vrednost>=tree.value: branch=tree.tb
  190.             else: branch=tree.fb
  191.         else:
  192.            if vrednost==tree.value: branch=tree.tb
  193.            else: branch=tree.fb
  194.  
  195.         return classify(observation,branch)
  196.  
  197.  
  198.  
  199.  
  200. if __name__ == "__main__":
  201.    
  202.     referrer=input()
  203.     location=input()
  204.     readFAQ=input()
  205.     pagesVisited=input()
  206.     serviceChosen=input()
  207.  
  208.     testCase=[referrer, location, readFAQ, pagesVisited, serviceChosen]
  209.  
  210.     t=buildtree(trainingData)
  211.    
  212.     print classify(testCase,t)
  213.  
  214. Sample input
  215. 'digg'
  216. 'Macedonia'
  217. 'no'
  218. 24
  219. 'Unknown'
  220.  
  221. Sample output
  222. Basic
Advertisement
Add Comment
Please, Sign In to add comment