In [1]:
%pylab
%matplotlib inline


Using matplotlib backend: Qt4Agg
Populating the interactive namespace from numpy and matplotlib

In [2]:
class Sample:
    def __init__(self):
        self.data={}
        self.lable=None
    def __setitem__(self,key,value):
        self.data[key]=value
    def __getitem__(self,key):
        return self.data[key]
    def keys(self):
        return self.data.keys()
    def __str__(self):
        return str(self.data)+'--lable-'+str(self.lable)

In [3]:
def lable0(sample):
    return sample.lable==0
def lable1(sample):
    return sample.lable==1

In [4]:
import copy
class Dataset:
    def __init__(self):
        self.data=[]
        self.ks=[]
    def __getitem__(self,index):
        return self.data[index]
    def append(self,sample):
        self.data.append(sample)
        for k in sample.data.keys():
            if k not in self.ks:
                self.ks.append(k)
    def __str__(self):
        listOfSample=[]
        for sample in self.data:
            SampleOne = str(sample)+'\n'
            listOfSample.append(SampleOne)
        return '\n'.join(listOfSample)+'\n'
    def __len__(self):
        return len(self.data)
    def count(self,pred):
        cot=0
        for sample in self:
            if(pred(sample)):
                cot+=1
        return cot
    def split(self,key,val):
#         split dataset according to feature 
        dataset = Dataset() 
        for sample in self:
            if(sample[key]==val):
                dataset.append(sample)
        dataset.ks=copy.deepcopy(self.ks) 
#         print(dataset.ks)
        dataset.ks.remove(key)
        return dataset
    
    def valsIssame(self):
        first = self[0]
        for sample in self:
            for key in self.ks:
                if(sample[key]!=first[key]):
                    return False
        return True
    def lableIssame(self):
        first = self[0]
        for sample in self:
            if(first.lable!=sample.lable):
                return False
        return True
#     all the same so that no necessary to split
    def needSplit(self):
        if(len(self.ks)==0 or self.valsIssame()):
            return False
        else:
            return True
    def majorityVote(self):
        n0 = self.count(lable0)
        n1 = self.count(lable1)
        if n0<n1 :
            return 1
        else:
            return 0

In [5]:
class Filler:
    def filler(self):
        pass
import random
class RandomFiller(Filler):
    def __init__(self):
        self.begin=0
        self.end=4
        self.nfeat=8
        self.nsample=200
    def fillOne(self,sample):
        for i in range(self.nfeat):
            sample[i]=random.randint(self.begin,self.end)
        sample.lable=random.randint(0,1)
    def fillDataset(self,dataset):
        for i in range(self.nsample):
            sample=Sample()
            self.fillOne(sample)
            dataset.append(sample)

In [6]:
sample = Sample()
f=RandomFiller()
f.fillOne(sample)
# print(sample)
# print(sample.data.keys())

In [7]:
dataset = Dataset()
f.fillDataset(dataset)
_dataset = dataset.split(0,1)
print(_dataset)


{0: 1, 1: 2, 2: 3, 3: 0, 4: 3, 5: 0, 6: 3, 7: 4}--lable-0

{0: 1, 1: 4, 2: 4, 3: 2, 4: 3, 5: 0, 6: 4, 7: 1}--lable-1

{0: 1, 1: 2, 2: 2, 3: 4, 4: 4, 5: 2, 6: 2, 7: 4}--lable-0

{0: 1, 1: 2, 2: 4, 3: 1, 4: 0, 5: 4, 6: 2, 7: 1}--lable-0

{0: 1, 1: 1, 2: 0, 3: 2, 4: 2, 5: 2, 6: 1, 7: 1}--lable-1

{0: 1, 1: 0, 2: 4, 3: 0, 4: 1, 5: 3, 6: 2, 7: 3}--lable-1

{0: 1, 1: 0, 2: 1, 3: 0, 4: 2, 5: 2, 6: 4, 7: 2}--lable-0

{0: 1, 1: 2, 2: 4, 3: 1, 4: 1, 5: 3, 6: 0, 7: 0}--lable-0

{0: 1, 1: 1, 2: 0, 3: 1, 4: 3, 5: 0, 6: 4, 7: 3}--lable-0

{0: 1, 1: 2, 2: 4, 3: 2, 4: 0, 5: 4, 6: 1, 7: 0}--lable-0

{0: 1, 1: 3, 2: 3, 3: 1, 4: 4, 5: 3, 6: 3, 7: 4}--lable-0

{0: 1, 1: 2, 2: 0, 3: 4, 4: 4, 5: 3, 6: 0, 7: 4}--lable-0

{0: 1, 1: 1, 2: 1, 3: 4, 4: 2, 5: 4, 6: 3, 7: 2}--lable-0

{0: 1, 1: 1, 2: 0, 3: 1, 4: 2, 5: 3, 6: 2, 7: 2}--lable-1

{0: 1, 1: 4, 2: 3, 3: 4, 4: 4, 5: 0, 6: 1, 7: 2}--lable-1

{0: 1, 1: 3, 2: 1, 3: 1, 4: 4, 5: 1, 6: 4, 7: 3}--lable-0

{0: 1, 1: 4, 2: 1, 3: 0, 4: 3, 5: 0, 6: 2, 7: 4}--lable-1

{0: 1, 1: 4, 2: 2, 3: 3, 4: 0, 5: 2, 6: 0, 7: 1}--lable-0

{0: 1, 1: 1, 2: 3, 3: 2, 4: 3, 5: 0, 6: 2, 7: 2}--lable-0

{0: 1, 1: 4, 2: 3, 3: 2, 4: 3, 5: 1, 6: 4, 7: 3}--lable-1

{0: 1, 1: 1, 2: 2, 3: 0, 4: 1, 5: 4, 6: 2, 7: 3}--lable-1

{0: 1, 1: 0, 2: 0, 3: 1, 4: 4, 5: 4, 6: 0, 7: 1}--lable-0

{0: 1, 1: 4, 2: 1, 3: 4, 4: 1, 5: 0, 6: 1, 7: 2}--lable-1

{0: 1, 1: 1, 2: 4, 3: 0, 4: 2, 5: 3, 6: 1, 7: 1}--lable-0

{0: 1, 1: 1, 2: 2, 3: 4, 4: 2, 5: 0, 6: 2, 7: 1}--lable-0

{0: 1, 1: 3, 2: 3, 3: 3, 4: 2, 5: 4, 6: 4, 7: 0}--lable-1

{0: 1, 1: 3, 2: 3, 3: 4, 4: 2, 5: 1, 6: 3, 7: 1}--lable-1

{0: 1, 1: 2, 2: 4, 3: 2, 4: 3, 5: 2, 6: 4, 7: 1}--lable-0

{0: 1, 1: 1, 2: 4, 3: 4, 4: 4, 5: 0, 6: 1, 7: 2}--lable-1

{0: 1, 1: 1, 2: 2, 3: 2, 4: 4, 5: 0, 6: 4, 7: 2}--lable-1

{0: 1, 1: 2, 2: 0, 3: 1, 4: 4, 5: 0, 6: 4, 7: 1}--lable-1

{0: 1, 1: 4, 2: 3, 3: 0, 4: 0, 5: 3, 6: 4, 7: 0}--lable-1

{0: 1, 1: 2, 2: 0, 3: 1, 4: 4, 5: 3, 6: 1, 7: 1}--lable-1

{0: 1, 1: 3, 2: 2, 3: 4, 4: 0, 5: 4, 6: 4, 7: 4}--lable-0

{0: 1, 1: 1, 2: 3, 3: 3, 4: 2, 5: 2, 6: 4, 7: 2}--lable-0

{0: 1, 1: 3, 2: 2, 3: 0, 4: 1, 5: 3, 6: 4, 7: 1}--lable-1

{0: 1, 1: 3, 2: 3, 3: 1, 4: 0, 5: 1, 6: 3, 7: 3}--lable-1

{0: 1, 1: 4, 2: 1, 3: 2, 4: 3, 5: 1, 6: 2, 7: 4}--lable-1

{0: 1, 1: 4, 2: 2, 3: 1, 4: 4, 5: 3, 6: 1, 7: 0}--lable-0

{0: 1, 1: 0, 2: 4, 3: 2, 4: 3, 5: 2, 6: 3, 7: 0}--lable-1

{0: 1, 1: 1, 2: 4, 3: 3, 4: 3, 5: 1, 6: 4, 7: 3}--lable-1

{0: 1, 1: 4, 2: 4, 3: 1, 4: 4, 5: 1, 6: 0, 7: 2}--lable-0

{0: 1, 1: 0, 2: 1, 3: 1, 4: 0, 5: 0, 6: 2, 7: 2}--lable-0



In [8]:
print(_dataset)
print(dataset.ks)


{0: 1, 1: 2, 2: 3, 3: 0, 4: 3, 5: 0, 6: 3, 7: 4}--lable-0

{0: 1, 1: 4, 2: 4, 3: 2, 4: 3, 5: 0, 6: 4, 7: 1}--lable-1

{0: 1, 1: 2, 2: 2, 3: 4, 4: 4, 5: 2, 6: 2, 7: 4}--lable-0

{0: 1, 1: 2, 2: 4, 3: 1, 4: 0, 5: 4, 6: 2, 7: 1}--lable-0

{0: 1, 1: 1, 2: 0, 3: 2, 4: 2, 5: 2, 6: 1, 7: 1}--lable-1

{0: 1, 1: 0, 2: 4, 3: 0, 4: 1, 5: 3, 6: 2, 7: 3}--lable-1

{0: 1, 1: 0, 2: 1, 3: 0, 4: 2, 5: 2, 6: 4, 7: 2}--lable-0

{0: 1, 1: 2, 2: 4, 3: 1, 4: 1, 5: 3, 6: 0, 7: 0}--lable-0

{0: 1, 1: 1, 2: 0, 3: 1, 4: 3, 5: 0, 6: 4, 7: 3}--lable-0

{0: 1, 1: 2, 2: 4, 3: 2, 4: 0, 5: 4, 6: 1, 7: 0}--lable-0

{0: 1, 1: 3, 2: 3, 3: 1, 4: 4, 5: 3, 6: 3, 7: 4}--lable-0

{0: 1, 1: 2, 2: 0, 3: 4, 4: 4, 5: 3, 6: 0, 7: 4}--lable-0

{0: 1, 1: 1, 2: 1, 3: 4, 4: 2, 5: 4, 6: 3, 7: 2}--lable-0

{0: 1, 1: 1, 2: 0, 3: 1, 4: 2, 5: 3, 6: 2, 7: 2}--lable-1

{0: 1, 1: 4, 2: 3, 3: 4, 4: 4, 5: 0, 6: 1, 7: 2}--lable-1

{0: 1, 1: 3, 2: 1, 3: 1, 4: 4, 5: 1, 6: 4, 7: 3}--lable-0

{0: 1, 1: 4, 2: 1, 3: 0, 4: 3, 5: 0, 6: 2, 7: 4}--lable-1

{0: 1, 1: 4, 2: 2, 3: 3, 4: 0, 5: 2, 6: 0, 7: 1}--lable-0

{0: 1, 1: 1, 2: 3, 3: 2, 4: 3, 5: 0, 6: 2, 7: 2}--lable-0

{0: 1, 1: 4, 2: 3, 3: 2, 4: 3, 5: 1, 6: 4, 7: 3}--lable-1

{0: 1, 1: 1, 2: 2, 3: 0, 4: 1, 5: 4, 6: 2, 7: 3}--lable-1

{0: 1, 1: 0, 2: 0, 3: 1, 4: 4, 5: 4, 6: 0, 7: 1}--lable-0

{0: 1, 1: 4, 2: 1, 3: 4, 4: 1, 5: 0, 6: 1, 7: 2}--lable-1

{0: 1, 1: 1, 2: 4, 3: 0, 4: 2, 5: 3, 6: 1, 7: 1}--lable-0

{0: 1, 1: 1, 2: 2, 3: 4, 4: 2, 5: 0, 6: 2, 7: 1}--lable-0

{0: 1, 1: 3, 2: 3, 3: 3, 4: 2, 5: 4, 6: 4, 7: 0}--lable-1

{0: 1, 1: 3, 2: 3, 3: 4, 4: 2, 5: 1, 6: 3, 7: 1}--lable-1

{0: 1, 1: 2, 2: 4, 3: 2, 4: 3, 5: 2, 6: 4, 7: 1}--lable-0

{0: 1, 1: 1, 2: 4, 3: 4, 4: 4, 5: 0, 6: 1, 7: 2}--lable-1

{0: 1, 1: 1, 2: 2, 3: 2, 4: 4, 5: 0, 6: 4, 7: 2}--lable-1

{0: 1, 1: 2, 2: 0, 3: 1, 4: 4, 5: 0, 6: 4, 7: 1}--lable-1

{0: 1, 1: 4, 2: 3, 3: 0, 4: 0, 5: 3, 6: 4, 7: 0}--lable-1

{0: 1, 1: 2, 2: 0, 3: 1, 4: 4, 5: 3, 6: 1, 7: 1}--lable-1

{0: 1, 1: 3, 2: 2, 3: 4, 4: 0, 5: 4, 6: 4, 7: 4}--lable-0

{0: 1, 1: 1, 2: 3, 3: 3, 4: 2, 5: 2, 6: 4, 7: 2}--lable-0

{0: 1, 1: 3, 2: 2, 3: 0, 4: 1, 5: 3, 6: 4, 7: 1}--lable-1

{0: 1, 1: 3, 2: 3, 3: 1, 4: 0, 5: 1, 6: 3, 7: 3}--lable-1

{0: 1, 1: 4, 2: 1, 3: 2, 4: 3, 5: 1, 6: 2, 7: 4}--lable-1

{0: 1, 1: 4, 2: 2, 3: 1, 4: 4, 5: 3, 6: 1, 7: 0}--lable-0

{0: 1, 1: 0, 2: 4, 3: 2, 4: 3, 5: 2, 6: 3, 7: 0}--lable-1

{0: 1, 1: 1, 2: 4, 3: 3, 4: 3, 5: 1, 6: 4, 7: 3}--lable-1

{0: 1, 1: 4, 2: 4, 3: 1, 4: 4, 5: 1, 6: 0, 7: 2}--lable-0

{0: 1, 1: 0, 2: 1, 3: 1, 4: 0, 5: 0, 6: 2, 7: 2}--lable-0


[0, 1, 2, 3, 4, 5, 6, 7]

In [9]:
import math
def calEntropy(dataset):
    nl0 = dataset.count(lable0)
    nl1 = dataset.count(lable1)
    if nl0==0 or nl1==0:
        return 0
    n = len(dataset)
    p0 = float(nl0)/n
    p1 = float(nl1)/n
#     print('p0 : '+str(p0)+' p1 : '+str(p1))
    return -(p0 * math.log(p0,2)+p1 * math.log(p1,2))
def getVals(dataset,key):
    sets=[]
    for sample in dataset:
        if sample[key] not in sets:
            sets.append(sample[key])
    return sets
def getNumForVals(dataset,key,val):
    nums=0
    for sample in dataset:
        if(sample[key]==val):
            nums+=1
    return nums
def calGain(dataset,key):
    newEntropy=0
    sets = getVals(dataset,key)
    oldEntropy = calEntropy(dataset)
    n = len(dataset)
    IV = 0
    for val in sets:
        newDataset = dataset.split(key,val)
        nums = getNumForVals(dataset,key,val)
        p = float(nums)/n
        newEntropy += p * calEntropy(newDataset)
        IV += - p * math.log(p,2)
    informationGain = oldEntropy - newEntropy
#     if(IV == 0):
#         print('sets size '+str(len(sets)))
#         print(IV)
    return informationGain
def calGain_ratio():
    
    pass
def calP(dataset):
    nl0 = dataset.count(lable0)
    nl1 = dataset.count(lable1)
    n = len(dataset)
    p0 = float(nl0)/n
    p1 = float(nl1)/n
    return p0,p1

In [10]:
#test data.split()
print('---key1----')
sets = getVals(dataset,1)
for val in sets:
    _data = dataset.split(1,val)
    print(_data)
# print('---key1-----')
# sets = getVals(dataset,1)
# for val in sets:
#     _data = dataset.split(1,val)
#     print(_data)
# # test math function
# entropy = calEntropy(dataset)
# print(entropy) #pass
# sets = getVals(dataset,0) 
# print(sets) #pass
# print(calEntropy(_data))
# print(calGain(dataset,0))
# print(calGain(dataset,1))
# print(len(dataset.split(0,5)))


---key1----
{0: 3, 1: 3, 2: 2, 3: 3, 4: 2, 5: 0, 6: 3, 7: 4}--lable-0

{0: 0, 1: 3, 2: 2, 3: 3, 4: 4, 5: 1, 6: 0, 7: 1}--lable-0

{0: 3, 1: 3, 2: 3, 3: 2, 4: 0, 5: 2, 6: 1, 7: 0}--lable-1

{0: 2, 1: 3, 2: 2, 3: 4, 4: 1, 5: 1, 6: 4, 7: 2}--lable-0

{0: 2, 1: 3, 2: 0, 3: 1, 4: 3, 5: 2, 6: 2, 7: 2}--lable-0

{0: 4, 1: 3, 2: 4, 3: 3, 4: 3, 5: 4, 6: 2, 7: 1}--lable-0

{0: 2, 1: 3, 2: 0, 3: 0, 4: 4, 5: 4, 6: 0, 7: 2}--lable-0

{0: 0, 1: 3, 2: 1, 3: 1, 4: 1, 5: 2, 6: 3, 7: 0}--lable-1

{0: 0, 1: 3, 2: 3, 3: 2, 4: 1, 5: 4, 6: 2, 7: 0}--lable-1

{0: 2, 1: 3, 2: 1, 3: 3, 4: 3, 5: 2, 6: 3, 7: 0}--lable-0

{0: 0, 1: 3, 2: 3, 3: 4, 4: 2, 5: 1, 6: 2, 7: 4}--lable-1

{0: 0, 1: 3, 2: 2, 3: 4, 4: 0, 5: 0, 6: 4, 7: 0}--lable-0

{0: 4, 1: 3, 2: 4, 3: 2, 4: 0, 5: 2, 6: 4, 7: 3}--lable-1

{0: 2, 1: 3, 2: 3, 3: 3, 4: 1, 5: 1, 6: 0, 7: 2}--lable-0

{0: 4, 1: 3, 2: 2, 3: 2, 4: 2, 5: 2, 6: 4, 7: 2}--lable-1

{0: 2, 1: 3, 2: 4, 3: 1, 4: 1, 5: 4, 6: 0, 7: 0}--lable-1

{0: 1, 1: 3, 2: 3, 3: 1, 4: 4, 5: 3, 6: 3, 7: 4}--lable-0

{0: 4, 1: 3, 2: 3, 3: 1, 4: 2, 5: 3, 6: 3, 7: 0}--lable-0

{0: 4, 1: 3, 2: 2, 3: 1, 4: 0, 5: 3, 6: 4, 7: 3}--lable-0

{0: 2, 1: 3, 2: 2, 3: 4, 4: 0, 5: 4, 6: 2, 7: 1}--lable-1

{0: 1, 1: 3, 2: 1, 3: 1, 4: 4, 5: 1, 6: 4, 7: 3}--lable-0

{0: 3, 1: 3, 2: 1, 3: 4, 4: 3, 5: 4, 6: 1, 7: 4}--lable-0

{0: 3, 1: 3, 2: 1, 3: 1, 4: 0, 5: 2, 6: 2, 7: 2}--lable-0

{0: 2, 1: 3, 2: 4, 3: 2, 4: 3, 5: 2, 6: 1, 7: 2}--lable-1

{0: 2, 1: 3, 2: 2, 3: 4, 4: 2, 5: 1, 6: 1, 7: 2}--lable-0

{0: 3, 1: 3, 2: 1, 3: 3, 4: 1, 5: 4, 6: 3, 7: 4}--lable-0

{0: 0, 1: 3, 2: 3, 3: 1, 4: 1, 5: 0, 6: 2, 7: 3}--lable-0

{0: 0, 1: 3, 2: 0, 3: 0, 4: 1, 5: 2, 6: 0, 7: 3}--lable-0

{0: 4, 1: 3, 2: 3, 3: 3, 4: 4, 5: 4, 6: 1, 7: 2}--lable-0

{0: 3, 1: 3, 2: 0, 3: 3, 4: 3, 5: 1, 6: 0, 7: 1}--lable-0

{0: 1, 1: 3, 2: 3, 3: 3, 4: 2, 5: 4, 6: 4, 7: 0}--lable-1

{0: 1, 1: 3, 2: 3, 3: 4, 4: 2, 5: 1, 6: 3, 7: 1}--lable-1

{0: 4, 1: 3, 2: 4, 3: 3, 4: 1, 5: 2, 6: 2, 7: 1}--lable-0

{0: 4, 1: 3, 2: 0, 3: 0, 4: 2, 5: 2, 6: 4, 7: 1}--lable-1

{0: 3, 1: 3, 2: 0, 3: 2, 4: 1, 5: 0, 6: 0, 7: 4}--lable-0

{0: 0, 1: 3, 2: 2, 3: 4, 4: 0, 5: 3, 6: 1, 7: 0}--lable-0

{0: 4, 1: 3, 2: 3, 3: 2, 4: 4, 5: 1, 6: 1, 7: 2}--lable-1

{0: 1, 1: 3, 2: 2, 3: 4, 4: 0, 5: 4, 6: 4, 7: 4}--lable-0

{0: 2, 1: 3, 2: 2, 3: 4, 4: 1, 5: 4, 6: 4, 7: 1}--lable-1

{0: 1, 1: 3, 2: 2, 3: 0, 4: 1, 5: 3, 6: 4, 7: 1}--lable-1

{0: 0, 1: 3, 2: 3, 3: 4, 4: 1, 5: 1, 6: 4, 7: 4}--lable-0

{0: 1, 1: 3, 2: 3, 3: 1, 4: 0, 5: 1, 6: 3, 7: 3}--lable-1

{0: 2, 1: 3, 2: 3, 3: 2, 4: 2, 5: 1, 6: 0, 7: 0}--lable-0

{0: 3, 1: 3, 2: 2, 3: 3, 4: 2, 5: 2, 6: 2, 7: 0}--lable-1

{0: 0, 1: 3, 2: 2, 3: 4, 4: 3, 5: 1, 6: 4, 7: 1}--lable-0

{0: 4, 1: 3, 2: 1, 3: 4, 4: 2, 5: 3, 6: 4, 7: 1}--lable-0


{0: 4, 1: 4, 2: 3, 3: 3, 4: 2, 5: 0, 6: 2, 7: 2}--lable-0

{0: 1, 1: 4, 2: 4, 3: 2, 4: 3, 5: 0, 6: 4, 7: 1}--lable-1

{0: 2, 1: 4, 2: 4, 3: 0, 4: 0, 5: 1, 6: 3, 7: 3}--lable-1

{0: 0, 1: 4, 2: 1, 3: 0, 4: 3, 5: 0, 6: 1, 7: 2}--lable-1

{0: 0, 1: 4, 2: 2, 3: 2, 4: 3, 5: 1, 6: 4, 7: 2}--lable-1

{0: 4, 1: 4, 2: 1, 3: 2, 4: 0, 5: 4, 6: 1, 7: 3}--lable-1

{0: 4, 1: 4, 2: 1, 3: 0, 4: 3, 5: 0, 6: 3, 7: 4}--lable-0

{0: 2, 1: 4, 2: 2, 3: 2, 4: 3, 5: 2, 6: 4, 7: 3}--lable-0

{0: 3, 1: 4, 2: 2, 3: 2, 4: 4, 5: 4, 6: 1, 7: 3}--lable-1

{0: 2, 1: 4, 2: 3, 3: 0, 4: 3, 5: 0, 6: 2, 7: 4}--lable-0

{0: 4, 1: 4, 2: 2, 3: 3, 4: 2, 5: 0, 6: 2, 7: 0}--lable-1

{0: 1, 1: 4, 2: 3, 3: 4, 4: 4, 5: 0, 6: 1, 7: 2}--lable-1

{0: 0, 1: 4, 2: 4, 3: 1, 4: 4, 5: 2, 6: 3, 7: 3}--lable-0

{0: 2, 1: 4, 2: 1, 3: 0, 4: 0, 5: 0, 6: 2, 7: 2}--lable-1

{0: 4, 1: 4, 2: 3, 3: 3, 4: 2, 5: 4, 6: 2, 7: 2}--lable-1

{0: 1, 1: 4, 2: 1, 3: 0, 4: 3, 5: 0, 6: 2, 7: 4}--lable-1

{0: 0, 1: 4, 2: 0, 3: 0, 4: 1, 5: 3, 6: 2, 7: 2}--lable-0

{0: 1, 1: 4, 2: 2, 3: 3, 4: 0, 5: 2, 6: 0, 7: 1}--lable-0

{0: 4, 1: 4, 2: 3, 3: 2, 4: 0, 5: 3, 6: 4, 7: 2}--lable-0

{0: 3, 1: 4, 2: 4, 3: 2, 4: 3, 5: 2, 6: 3, 7: 4}--lable-1

{0: 3, 1: 4, 2: 0, 3: 0, 4: 1, 5: 4, 6: 4, 7: 4}--lable-0

{0: 0, 1: 4, 2: 3, 3: 0, 4: 0, 5: 1, 6: 4, 7: 3}--lable-1

{0: 1, 1: 4, 2: 3, 3: 2, 4: 3, 5: 1, 6: 4, 7: 3}--lable-1

{0: 2, 1: 4, 2: 4, 3: 2, 4: 2, 5: 0, 6: 4, 7: 1}--lable-0

{0: 0, 1: 4, 2: 2, 3: 1, 4: 3, 5: 4, 6: 0, 7: 1}--lable-0

{0: 1, 1: 4, 2: 1, 3: 4, 4: 1, 5: 0, 6: 1, 7: 2}--lable-1

{0: 0, 1: 4, 2: 1, 3: 3, 4: 4, 5: 4, 6: 1, 7: 3}--lable-1

{0: 4, 1: 4, 2: 2, 3: 3, 4: 3, 5: 2, 6: 1, 7: 2}--lable-0

{0: 3, 1: 4, 2: 2, 3: 4, 4: 3, 5: 2, 6: 2, 7: 0}--lable-1

{0: 0, 1: 4, 2: 3, 3: 0, 4: 3, 5: 3, 6: 0, 7: 4}--lable-1

{0: 3, 1: 4, 2: 4, 3: 1, 4: 3, 5: 2, 6: 1, 7: 1}--lable-1

{0: 4, 1: 4, 2: 4, 3: 2, 4: 0, 5: 1, 6: 3, 7: 3}--lable-1

{0: 3, 1: 4, 2: 3, 3: 3, 4: 1, 5: 1, 6: 3, 7: 2}--lable-1

{0: 1, 1: 4, 2: 3, 3: 0, 4: 0, 5: 3, 6: 4, 7: 0}--lable-1

{0: 4, 1: 4, 2: 4, 3: 2, 4: 4, 5: 2, 6: 3, 7: 0}--lable-0

{0: 3, 1: 4, 2: 4, 3: 0, 4: 3, 5: 1, 6: 0, 7: 1}--lable-1

{0: 1, 1: 4, 2: 1, 3: 2, 4: 3, 5: 1, 6: 2, 7: 4}--lable-1

{0: 1, 1: 4, 2: 2, 3: 1, 4: 4, 5: 3, 6: 1, 7: 0}--lable-0

{0: 1, 1: 4, 2: 4, 3: 1, 4: 4, 5: 1, 6: 0, 7: 2}--lable-0

{0: 3, 1: 4, 2: 0, 3: 3, 4: 0, 5: 4, 6: 4, 7: 2}--lable-0

{0: 4, 1: 4, 2: 4, 3: 3, 4: 4, 5: 1, 6: 0, 7: 2}--lable-0


{0: 2, 1: 2, 2: 4, 3: 4, 4: 3, 5: 3, 6: 3, 7: 0}--lable-1

{0: 1, 1: 2, 2: 3, 3: 0, 4: 3, 5: 0, 6: 3, 7: 4}--lable-0

{0: 3, 1: 2, 2: 1, 3: 4, 4: 2, 5: 3, 6: 3, 7: 3}--lable-0

{0: 1, 1: 2, 2: 2, 3: 4, 4: 4, 5: 2, 6: 2, 7: 4}--lable-0

{0: 2, 1: 2, 2: 3, 3: 1, 4: 3, 5: 4, 6: 0, 7: 1}--lable-1

{0: 2, 1: 2, 2: 4, 3: 4, 4: 4, 5: 0, 6: 3, 7: 3}--lable-0

{0: 0, 1: 2, 2: 3, 3: 4, 4: 3, 5: 4, 6: 1, 7: 3}--lable-0

{0: 2, 1: 2, 2: 3, 3: 3, 4: 0, 5: 0, 6: 1, 7: 3}--lable-0

{0: 3, 1: 2, 2: 1, 3: 0, 4: 2, 5: 0, 6: 3, 7: 4}--lable-1

{0: 2, 1: 2, 2: 1, 3: 3, 4: 2, 5: 3, 6: 3, 7: 1}--lable-0

{0: 1, 1: 2, 2: 4, 3: 1, 4: 0, 5: 4, 6: 2, 7: 1}--lable-0

{0: 2, 1: 2, 2: 0, 3: 4, 4: 4, 5: 4, 6: 1, 7: 4}--lable-1

{0: 0, 1: 2, 2: 0, 3: 3, 4: 0, 5: 0, 6: 3, 7: 4}--lable-0

{0: 1, 1: 2, 2: 4, 3: 1, 4: 1, 5: 3, 6: 0, 7: 0}--lable-0

{0: 4, 1: 2, 2: 1, 3: 3, 4: 3, 5: 1, 6: 2, 7: 1}--lable-0

{0: 3, 1: 2, 2: 0, 3: 2, 4: 0, 5: 0, 6: 4, 7: 2}--lable-1

{0: 0, 1: 2, 2: 2, 3: 0, 4: 4, 5: 1, 6: 3, 7: 0}--lable-1

{0: 2, 1: 2, 2: 4, 3: 4, 4: 0, 5: 3, 6: 3, 7: 2}--lable-1

{0: 2, 1: 2, 2: 4, 3: 3, 4: 3, 5: 4, 6: 0, 7: 2}--lable-0

{0: 3, 1: 2, 2: 0, 3: 2, 4: 4, 5: 3, 6: 0, 7: 3}--lable-1

{0: 1, 1: 2, 2: 4, 3: 2, 4: 0, 5: 4, 6: 1, 7: 0}--lable-0

{0: 0, 1: 2, 2: 0, 3: 1, 4: 0, 5: 0, 6: 1, 7: 3}--lable-1

{0: 1, 1: 2, 2: 0, 3: 4, 4: 4, 5: 3, 6: 0, 7: 4}--lable-0

{0: 0, 1: 2, 2: 2, 3: 4, 4: 0, 5: 0, 6: 0, 7: 4}--lable-1

{0: 4, 1: 2, 2: 2, 3: 4, 4: 3, 5: 0, 6: 3, 7: 0}--lable-0

{0: 2, 1: 2, 2: 0, 3: 4, 4: 0, 5: 0, 6: 3, 7: 0}--lable-0

{0: 3, 1: 2, 2: 4, 3: 0, 4: 2, 5: 3, 6: 4, 7: 3}--lable-1

{0: 0, 1: 2, 2: 4, 3: 3, 4: 3, 5: 2, 6: 1, 7: 3}--lable-0

{0: 2, 1: 2, 2: 3, 3: 3, 4: 4, 5: 0, 6: 2, 7: 3}--lable-1

{0: 1, 1: 2, 2: 4, 3: 2, 4: 3, 5: 2, 6: 4, 7: 1}--lable-0

{0: 3, 1: 2, 2: 1, 3: 2, 4: 0, 5: 2, 6: 3, 7: 4}--lable-0

{0: 1, 1: 2, 2: 0, 3: 1, 4: 4, 5: 0, 6: 4, 7: 1}--lable-1

{0: 0, 1: 2, 2: 2, 3: 2, 4: 2, 5: 2, 6: 4, 7: 3}--lable-1

{0: 1, 1: 2, 2: 0, 3: 1, 4: 4, 5: 3, 6: 1, 7: 1}--lable-1

{0: 3, 1: 2, 2: 3, 3: 1, 4: 4, 5: 2, 6: 3, 7: 1}--lable-0

{0: 4, 1: 2, 2: 1, 3: 0, 4: 0, 5: 0, 6: 3, 7: 3}--lable-0

{0: 4, 1: 2, 2: 1, 3: 4, 4: 0, 5: 0, 6: 0, 7: 3}--lable-0

{0: 4, 1: 2, 2: 4, 3: 3, 4: 3, 5: 2, 6: 3, 7: 2}--lable-1

{0: 4, 1: 2, 2: 0, 3: 1, 4: 0, 5: 3, 6: 2, 7: 1}--lable-1


{0: 2, 1: 1, 2: 2, 3: 4, 4: 0, 5: 0, 6: 3, 7: 4}--lable-1

{0: 0, 1: 1, 2: 1, 3: 0, 4: 0, 5: 0, 6: 0, 7: 2}--lable-1

{0: 2, 1: 1, 2: 3, 3: 4, 4: 4, 5: 2, 6: 0, 7: 3}--lable-0

{0: 4, 1: 1, 2: 0, 3: 4, 4: 1, 5: 0, 6: 1, 7: 0}--lable-0

{0: 1, 1: 1, 2: 0, 3: 2, 4: 2, 5: 2, 6: 1, 7: 1}--lable-1

{0: 3, 1: 1, 2: 3, 3: 4, 4: 4, 5: 2, 6: 0, 7: 4}--lable-0

{0: 0, 1: 1, 2: 1, 3: 4, 4: 1, 5: 0, 6: 0, 7: 2}--lable-0

{0: 1, 1: 1, 2: 0, 3: 1, 4: 3, 5: 0, 6: 4, 7: 3}--lable-0

{0: 3, 1: 1, 2: 1, 3: 3, 4: 3, 5: 3, 6: 0, 7: 0}--lable-1

{0: 4, 1: 1, 2: 1, 3: 0, 4: 3, 5: 2, 6: 2, 7: 4}--lable-1

{0: 4, 1: 1, 2: 1, 3: 0, 4: 1, 5: 4, 6: 2, 7: 1}--lable-0

{0: 0, 1: 1, 2: 0, 3: 0, 4: 3, 5: 4, 6: 3, 7: 0}--lable-0

{0: 1, 1: 1, 2: 1, 3: 4, 4: 2, 5: 4, 6: 3, 7: 2}--lable-0

{0: 1, 1: 1, 2: 0, 3: 1, 4: 2, 5: 3, 6: 2, 7: 2}--lable-1

{0: 4, 1: 1, 2: 3, 3: 2, 4: 3, 5: 0, 6: 1, 7: 2}--lable-1

{0: 3, 1: 1, 2: 4, 3: 3, 4: 2, 5: 4, 6: 2, 7: 3}--lable-0

{0: 0, 1: 1, 2: 1, 3: 2, 4: 4, 5: 4, 6: 3, 7: 4}--lable-1

{0: 2, 1: 1, 2: 2, 3: 3, 4: 4, 5: 0, 6: 4, 7: 0}--lable-0

{0: 2, 1: 1, 2: 1, 3: 4, 4: 3, 5: 2, 6: 4, 7: 1}--lable-0

{0: 1, 1: 1, 2: 3, 3: 2, 4: 3, 5: 0, 6: 2, 7: 2}--lable-0

{0: 2, 1: 1, 2: 2, 3: 1, 4: 1, 5: 1, 6: 1, 7: 3}--lable-0

{0: 0, 1: 1, 2: 1, 3: 2, 4: 1, 5: 4, 6: 0, 7: 2}--lable-1

{0: 1, 1: 1, 2: 2, 3: 0, 4: 1, 5: 4, 6: 2, 7: 3}--lable-1

{0: 4, 1: 1, 2: 3, 3: 0, 4: 3, 5: 2, 6: 2, 7: 1}--lable-1

{0: 1, 1: 1, 2: 4, 3: 0, 4: 2, 5: 3, 6: 1, 7: 1}--lable-0

{0: 0, 1: 1, 2: 4, 3: 4, 4: 3, 5: 1, 6: 1, 7: 0}--lable-1

{0: 1, 1: 1, 2: 2, 3: 4, 4: 2, 5: 0, 6: 2, 7: 1}--lable-0

{0: 3, 1: 1, 2: 1, 3: 1, 4: 0, 5: 3, 6: 1, 7: 0}--lable-1

{0: 1, 1: 1, 2: 4, 3: 4, 4: 4, 5: 0, 6: 1, 7: 2}--lable-1

{0: 1, 1: 1, 2: 2, 3: 2, 4: 4, 5: 0, 6: 4, 7: 2}--lable-1

{0: 4, 1: 1, 2: 2, 3: 3, 4: 2, 5: 3, 6: 2, 7: 3}--lable-1

{0: 4, 1: 1, 2: 3, 3: 2, 4: 1, 5: 4, 6: 3, 7: 0}--lable-1

{0: 0, 1: 1, 2: 4, 3: 4, 4: 2, 5: 2, 6: 4, 7: 3}--lable-0

{0: 3, 1: 1, 2: 4, 3: 3, 4: 1, 5: 1, 6: 2, 7: 3}--lable-1

{0: 2, 1: 1, 2: 3, 3: 4, 4: 0, 5: 0, 6: 3, 7: 2}--lable-1

{0: 4, 1: 1, 2: 4, 3: 2, 4: 2, 5: 1, 6: 3, 7: 4}--lable-0

{0: 1, 1: 1, 2: 3, 3: 3, 4: 2, 5: 2, 6: 4, 7: 2}--lable-0

{0: 4, 1: 1, 2: 4, 3: 2, 4: 3, 5: 0, 6: 1, 7: 2}--lable-0

{0: 1, 1: 1, 2: 4, 3: 3, 4: 3, 5: 1, 6: 4, 7: 3}--lable-1

{0: 3, 1: 1, 2: 3, 3: 0, 4: 0, 5: 2, 6: 2, 7: 0}--lable-1

{0: 3, 1: 1, 2: 4, 3: 3, 4: 4, 5: 0, 6: 3, 7: 4}--lable-1


{0: 4, 1: 0, 2: 1, 3: 0, 4: 4, 5: 3, 6: 3, 7: 3}--lable-0

{0: 4, 1: 0, 2: 2, 3: 1, 4: 0, 5: 1, 6: 0, 7: 0}--lable-1

{0: 2, 1: 0, 2: 0, 3: 1, 4: 3, 5: 0, 6: 4, 7: 1}--lable-1

{0: 4, 1: 0, 2: 3, 3: 2, 4: 4, 5: 1, 6: 2, 7: 4}--lable-0

{0: 4, 1: 0, 2: 1, 3: 1, 4: 1, 5: 1, 6: 4, 7: 3}--lable-0

{0: 4, 1: 0, 2: 4, 3: 0, 4: 1, 5: 2, 6: 0, 7: 0}--lable-0

{0: 1, 1: 0, 2: 4, 3: 0, 4: 1, 5: 3, 6: 2, 7: 3}--lable-1

{0: 1, 1: 0, 2: 1, 3: 0, 4: 2, 5: 2, 6: 4, 7: 2}--lable-0

{0: 2, 1: 0, 2: 3, 3: 1, 4: 1, 5: 3, 6: 1, 7: 1}--lable-0

{0: 3, 1: 0, 2: 4, 3: 2, 4: 3, 5: 0, 6: 1, 7: 0}--lable-0

{0: 2, 1: 0, 2: 1, 3: 1, 4: 3, 5: 3, 6: 0, 7: 4}--lable-0

{0: 4, 1: 0, 2: 0, 3: 2, 4: 1, 5: 0, 6: 2, 7: 3}--lable-0

{0: 3, 1: 0, 2: 0, 3: 3, 4: 0, 5: 0, 6: 3, 7: 3}--lable-1

{0: 3, 1: 0, 2: 0, 3: 4, 4: 3, 5: 1, 6: 4, 7: 4}--lable-1

{0: 4, 1: 0, 2: 0, 3: 2, 4: 1, 5: 2, 6: 0, 7: 3}--lable-0

{0: 4, 1: 0, 2: 2, 3: 0, 4: 3, 5: 3, 6: 2, 7: 4}--lable-1

{0: 0, 1: 0, 2: 4, 3: 1, 4: 1, 5: 1, 6: 0, 7: 0}--lable-0

{0: 0, 1: 0, 2: 3, 3: 4, 4: 4, 5: 2, 6: 1, 7: 0}--lable-0

{0: 1, 1: 0, 2: 0, 3: 1, 4: 4, 5: 4, 6: 0, 7: 1}--lable-0

{0: 4, 1: 0, 2: 3, 3: 4, 4: 0, 5: 2, 6: 3, 7: 3}--lable-1

{0: 4, 1: 0, 2: 4, 3: 3, 4: 2, 5: 0, 6: 3, 7: 4}--lable-1

{0: 0, 1: 0, 2: 3, 3: 2, 4: 0, 5: 0, 6: 0, 7: 3}--lable-1

{0: 4, 1: 0, 2: 1, 3: 4, 4: 1, 5: 3, 6: 2, 7: 3}--lable-1

{0: 0, 1: 0, 2: 3, 3: 2, 4: 3, 5: 2, 6: 3, 7: 0}--lable-1

{0: 2, 1: 0, 2: 2, 3: 0, 4: 0, 5: 4, 6: 1, 7: 0}--lable-0

{0: 0, 1: 0, 2: 2, 3: 1, 4: 0, 5: 4, 6: 4, 7: 3}--lable-0

{0: 2, 1: 0, 2: 1, 3: 4, 4: 2, 5: 2, 6: 0, 7: 2}--lable-1

{0: 0, 1: 0, 2: 3, 3: 4, 4: 4, 5: 4, 6: 4, 7: 4}--lable-0

{0: 0, 1: 0, 2: 0, 3: 1, 4: 0, 5: 1, 6: 1, 7: 0}--lable-0

{0: 3, 1: 0, 2: 2, 3: 3, 4: 3, 5: 1, 6: 1, 7: 1}--lable-1

{0: 2, 1: 0, 2: 1, 3: 3, 4: 3, 5: 2, 6: 3, 7: 4}--lable-0

{0: 1, 1: 0, 2: 4, 3: 2, 4: 3, 5: 2, 6: 3, 7: 0}--lable-1

{0: 1, 1: 0, 2: 1, 3: 1, 4: 0, 5: 0, 6: 2, 7: 2}--lable-0



In [ ]:


In [11]:
class DTNode:
    def __init__(self):
        self.key=None
        self.val=None
        self.data=Dataset()
#         self.parent=None
        self.children=[]
        self.nextKey=None
        self.lable=None
        self.leaf=False

In [12]:
class Model:
    def build(self):
        pass
    
class DTModel(Model):
    def __init__(self):
        DTRoot = DTNode()
#         set feature of root to -1 
        DTRoot.key=-1
        DTRoot.val=-1
        self.DTRoot=DTRoot
    def build(self,parentNode):
        data = parentNode.data
#         print('len: '+str(len(data)))
#         print('key: '+str(parentNode.key)+' val: '+str(parentNode.val))
#         print(calP(data))
        if(data.lableIssame()):
            parentNode.leaf=True
            parentNode.lable=data[0].lable
#             print('lable: '+str(parentNode.lable))
            return
        if(not data.needSplit()):  
            parentNode.leaf=True
            parentNode.lable=data.majorityVote()
#             print('lable: '+str(parentNode.lable))
            return
        maxGain=0
#         Gains = []
        maxKey=data.ks[0]
        for key in data.ks:
            nowGain=(calGain(data,key))
            if(nowGain > maxGain):
                maxGain = nowGain
                maxKey = key
        
#         print('key: '+str(maxKey))
        parentNode.nextKey = maxKey
        sets = getVals(data,maxKey)
        for val in sets:
            node = DTNode()
            node.key = maxKey
            node.val = val
            childrenData = data.split(maxKey,val)
            node.data = childrenData
            parentNode.children.append(node)
            if(len(childrenData)==0):
                node.leaf = True
                node.lable=data.majorityVote()
                continue
            self.build(node)
    def trainModel(self,dataset,keys):
#         print('---train decisionTree Model---\n')
        self.DTRoot.data = dataset
        tmp = dataset.ks
        dataset.ks = keys
        self.build(self.DTRoot)
        dataset.ks = tmp
    def _predict(self,Node,sample):
        if(Node.leaf):
            return Node.lable
        for childNode in Node.children:
            if(childNode.val==sample[childNode.key]):
                return self._predict(childNode,sample)
    def predict(self,sample):
        lable = self._predict(self.DTRoot,sample)
        return lable

In [13]:
for i in range(3):
    print(dataset.ks)
    decisionTree = DTModel()
    decisionTree.trainModel(dataset,dataset.ks)
    print(dataset.ks)


[0, 1, 2, 3, 4, 5, 6, 7]
[0, 1, 2, 3, 4, 5, 6, 7]
[0, 1, 2, 3, 4, 5, 6, 7]
[0, 1, 2, 3, 4, 5, 6, 7]
[0, 1, 2, 3, 4, 5, 6, 7]
[0, 1, 2, 3, 4, 5, 6, 7]

In [14]:
testSample = Sample()
f.fillOne(testSample)
# testSample[1]=0
# testSample[0]=2
print(testSample)
print(decisionTree.predict(testSample))


{0: 2, 1: 4, 2: 4, 3: 1, 4: 0, 5: 1, 6: 1, 7: 1}--lable-1
0

In [24]:
def test(testNum,model):
    error = 0
    for i in range(testNum):
        testSample = Sample()
        f.fillOne(testSample)
        pred = model.predict(testSample)
#         print(testSample)
#         print(pred)
        if(testSample.lable==pred):
            print('success')
        else:
            print('faliled')
            error +=1
    rate = float(error)/testNum
    print(rate)
def validation(testNum,model):
    error = 0
    for i in range(testNum):
        pred = model.predict(dataset[i])
#         print(testSample)
#         print(pred)
        
        if(dataset[i].lable==pred):
            print('success')
        else:
            error += 1
            print('faliled')
    rate = float(error)/testNum
    print('--validation--')
    print('testNum: '+str(testNum)+' error_rate: '+str(rate))

In [25]:
# test instance
validation(200,decisionTree)
# test(200,decisionTree)


success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
success
--validation--
testNum: 200 error_rate: 0.0

In [17]:
class RFModel(Model):
    def __init__(self):
        self.models = []
        self.k=None
        self.modelNum=5
        pass
    def selectKey(self,keys,k,modelNum):
        sets = []
        num = len(keys)
#         print(num)
        if(k>num):
            raise Exception('k is too large '+str(k)+' '+str(num))
        for i in range(modelNum):
            _set=set()
            while(True):
                if(len(_set)>=k):
                    break
                tmp = randint(0,num)
                _set.add(keys[tmp])
#             transform set to list
            ks = []
            for ele in _set:
                ks.append(ele)
            sets.append(ks)
        return sets
    def maxVotes(self,sample):
        nl0=0
        nl1=0
        for model in self.models:
            if(model.predict(sample)==1):
                nl1+=1
            else:
                nl0+=1
        if(nl0>nl1):
            return 0
        else:
            return 1
    def train(self,dataset):
        numKeys = len(dataset.ks)
#         print(numKeys)
        self.k = int(math.log(numKeys,2))
        sets = self.selectKey(dataset.ks,self.k,self.modelNum)
        for i in range(self.modelNum):
#             print(dataset.ks)
            decisionTree = DTModel()
            decisionTree.trainModel(dataset,sets[i])
#             print(dataset.ks)
            self.models.append(decisionTree)
        return
    
    def predict(self,sample):
        return self.maxVotes(sample)

In [27]:
# newdataset = Dataset()
# f.fillDataset(newdataset)
randomforest = RFModel()
# test RFModel.selectKey()
# print(newdataset.ks)
# randomforest.selectKey(newdataset.ks,2,4)
randomforest.train(dataset)
# validation(200,randomforest)
test(200,randomforest)
# print(newdataset.ks)


faliled
faliled
success
faliled
faliled
faliled
success
faliled
faliled
success
success
faliled
faliled
success
success
success
faliled
success
success
faliled
success
faliled
faliled
success
faliled
faliled
faliled
faliled
faliled
success
faliled
success
faliled
faliled
faliled
success
success
success
success
success
faliled
faliled
faliled
success
faliled
success
faliled
faliled
success
faliled
faliled
faliled
faliled
faliled
faliled
success
success
success
faliled
faliled
faliled
success
success
faliled
success
success
faliled
success
success
success
success
success
faliled
faliled
faliled
faliled
success
faliled
faliled
faliled
faliled
faliled
faliled
faliled
success
success
faliled
faliled
faliled
faliled
faliled
faliled
faliled
faliled
success
faliled
success
faliled
faliled
faliled
faliled
success
faliled
faliled
faliled
faliled
faliled
success
faliled
faliled
faliled
success
faliled
faliled
success
faliled
success
faliled
success
faliled
success
success
success
success
faliled
success
faliled
success
faliled
success
success
success
success
success
success
faliled
faliled
faliled
faliled
success
success
faliled
faliled
success
faliled
faliled
success
success
faliled
faliled
faliled
success
success
success
success
faliled
success
success
success
faliled
success
success
success
success
faliled
faliled
faliled
success
faliled
faliled
faliled
faliled
success
faliled
success
faliled
faliled
success
faliled
success
faliled
faliled
success
success
faliled
faliled
success
success
success
success
faliled
success
faliled
faliled
success
success
faliled
success
faliled
faliled
0.565

In [ ]: