コード例 #1
0
ファイル: Operate.py プロジェクト: MLDMXM2017/MOGA-ECOC
def localOptimization1(PopInfors,matrixs,talents_pool):
    class_size = PopInfors.class_size
    min_num_classifier = class_size - 1
    max_num_classifier = class_size * 2
    
    matrixs = sortMatrix1(matrixs)
    record_matrixs = copy.deepcopy(matrixs)
    record_matrixs1 = copy.deepcopy(matrixs)
    
    good = record_matrixs[0]
    good_coding_matrix = good.coding_matrix
    good_segment_accuracies = good.segment_accuracies
    good_segment_confusion_matrixs = good.segment_confusion_matrixs
    
    #找到最优个体分类最差的segment
    worst_segment_accuracy = float("inf") 
    worst_segment_accuracy_index = 0
    
    for i in range(len(good_segment_accuracies)):
        if good_segment_accuracies[i] < worst_segment_accuracy:
            worst_segment_accuracy = good_segment_accuracies[i]
            worst_segment_accuracy_index = i        
        
    #找到最优个体分类最差的segment最差的一类
    worst_confusion_matrix = good_segment_confusion_matrixs[worst_segment_accuracy_index] 
    worst_class_accuracy = float("inf") 
    worst_class_accuracy_index = 0   
    
    for i in range(len(worst_confusion_matrix)):
        if worst_confusion_matrix[i] < worst_class_accuracy:
            worst_class_accuracy_index = i
            worst_class_accuracy = worst_confusion_matrix[i]
 
    #找到其他矩阵中该类分类准确率最好的segment
    best_segment_accuracy = -1
    best_matrix_index = 1
    best_matrix_segment_index = 0
    for i in range(1,len(matrixs)):
        segment_confusion_matrixs = matrixs[i].segment_confusion_matrixs
        for j in range(len(segment_confusion_matrixs)):
            if segment_confusion_matrixs[j][worst_class_accuracy_index] > best_segment_accuracy:
                best_segment_accuracy = segment_confusion_matrixs[j][worst_class_accuracy_index]
                best_matrix_index = i
                best_matrix_segment_index = j
                
    find_matrix = matrixs[best_matrix_index]
    
    find_coding_segment = find_matrix.coding_matrix[best_matrix_segment_index]
    find_feature_segment = find_matrix.feature_matrix[best_matrix_segment_index]
    find_base_learner = find_matrix.base_learner_matrix[best_matrix_segment_index]
#    '''局部优化操作'''
    chromes = []
    chrome = Initialization.coding(good.coding_matrix,good.feature_matrix,good.base_learner_matrix)
    chromes.append(chrome)
    #find列替换该列
    temp_matrix1 = copy.deepcopy(good)
    temp_matrix1.coding_matrix[worst_segment_accuracy_index] = find_coding_segment
    temp_matrix1.feature_matrix[worst_segment_accuracy_index] = find_feature_segment
    temp_matrix1.base_learner_matrix[worst_segment_accuracy_index] = find_base_learner
    chrome1 = Initialization.coding(temp_matrix1.coding_matrix,temp_matrix1.feature_matrix,temp_matrix1.base_learner_matrix)
    chromes.append(chrome1)
    
    #突变基分类器,后来添加
    temp_matrix_add = copy.deepcopy(good)
    num_base_learners = len(PopInfors.base_learners)
    random_index = random.randint(0,num_base_learners-1)
    learner0 = temp_matrix_add.base_learner_matrix[worst_segment_accuracy_index] 
    while learner0 == random_index:
        random_index = random.randint(0,num_base_learners-1)
    temp_matrix_add.base_learner_matrix[worst_segment_accuracy_index] = random_index
    chrome_add = Initialization.coding(temp_matrix_add.coding_matrix,temp_matrix_add.feature_matrix,temp_matrix_add.base_learner_matrix)
    chromes.append(chrome_add)
    
    #添加find列或者精英池中添加一segment
    if len(good_coding_matrix)+1 < max_num_classifier:
        #添加find列
        temp_matrix2 = copy.deepcopy(good)
        temp_matrix2.coding_matrix.append(find_coding_segment)
        temp_matrix2.feature_matrix.append(find_feature_segment)
        temp_matrix2.base_learner_matrix.append(find_base_learner)
        chrome2 = Initialization.coding(temp_matrix2.coding_matrix,temp_matrix2.feature_matrix,temp_matrix2.base_learner_matrix)
        chromes.append(chrome2)

        if len(talents_pool) != 0 :
            #精英池中选择
            random_index = random.randint(0,len(talents_pool)-1)
            choose_pool = talents_pool[random_index]        
            temp_matrix4 = copy.deepcopy(good)
            temp_matrix4.coding_matrix.append(choose_pool.code_segment)
            temp_matrix4.feature_matrix.append(choose_pool.feature_segment)
            temp_matrix4.base_learner_matrix.append(choose_pool.estimator)
            chrome4 = Initialization.coding(temp_matrix4.coding_matrix,temp_matrix4.feature_matrix,temp_matrix4.base_learner_matrix)
            chromes.append(chrome4)
 
    #删除该列
    if len(good_coding_matrix)-1 > min_num_classifier and len(good_coding_matrix)-1 > 1:
        temp_matrix3 = copy.deepcopy(good)
        del temp_matrix3.coding_matrix[worst_segment_accuracy_index]
        del temp_matrix3.feature_matrix[worst_segment_accuracy_index]
        del temp_matrix3.base_learner_matrix[worst_segment_accuracy_index]
        chrome3 = Initialization.coding(temp_matrix3.coding_matrix,temp_matrix3.feature_matrix,temp_matrix3.base_learner_matrix)
        chromes.append(chrome3)
    
    
    best_temp = localOptimization(PopInfors,record_matrixs1,talents_pool)
        
    new_good = chooseGood(PopInfors, chromes, talents_pool)
    new_good = [new_good]
    #新矩阵个体评价
    new_good = Valuate.calObjValue(PopInfors, new_good)
    talents_pool, new_good = Valuate.addToTalentsPool(PopInfors, new_good, talents_pool)
    
    record_matrixs[0] = new_good[0]
    print(record_matrixs[0].f1score)
    if record_matrixs[0].f1score < best_temp.f1score:
        record_matrixs[0] = copy.deepcopy(best_temp)
    return record_matrixs
コード例 #2
0
ファイル: Operate.py プロジェクト: MLDMXM2017/MOGA-ECOC
def localOptimization2(PopInfors,matrixs,talents_pool):
    class_size = PopInfors.class_size
    min_num_classifier = class_size - 1
    max_num_classifier = 2*class_size -1
    
    matrixs = sortMatrix(matrixs)
    record_matrixs = copy.deepcopy(matrixs)
    
    good = record_matrixs[0]
    good_coding_matrix = good.coding_matrix
    good_segment_accuracies = good.segment_accuracies
    good_segment_confusion_matrixs = good.segment_confusion_matrixs
    
    #找到最优个体分类最差的segment
    worst_segment_accuracy = float("inf") 
    worst_segment_accuracy_index = 0
    
    for i in range(len(good_segment_accuracies)):
        if good_segment_accuracies[i] < worst_segment_accuracy:
            worst_segment_accuracy = good_segment_accuracies[i]
            worst_segment_accuracy_index = i        
        
    #找到最优个体分类最差的segment最差的一类
    worst_confusion_matrix = good_segment_confusion_matrixs[worst_segment_accuracy_index] 
    worst_class_accuracy = float("inf") 
    worst_class_accuracy_index = 0   
    
    for i in range(len(worst_confusion_matrix)):
        if worst_confusion_matrix[i] < worst_class_accuracy:
            worst_class_accuracy_index = i
            worst_class_accuracy = worst_confusion_matrix[i]
 
    #找到其他矩阵中该类分类准确率最好的segment
    best_segment_accuracy = -1
    best_matrix_index = 1
    best_matrix_segment_index = 0
    for i in range(1,len(matrixs)):
        segment_confusion_matrixs = matrixs[i].segment_confusion_matrixs
        for j in range(len(segment_confusion_matrixs)):
            if segment_confusion_matrixs[j][worst_class_accuracy_index] > best_segment_accuracy:
                best_segment_accuracy = segment_confusion_matrixs[j][worst_class_accuracy_index]
                best_matrix_index = i
                best_matrix_segment_index = j
                
    find_matrix = matrixs[best_matrix_index]
    
    find_coding_segment = find_matrix.coding_matrix[best_matrix_segment_index]
    find_feature_segment = find_matrix.feature_matrix[best_matrix_segment_index]
    find_base_learner = find_matrix.base_learner_matrix[best_matrix_segment_index]
    '''局部优化操作'''
    chromes = []
    chrome = Initialization.coding(good.coding_matrix,good.feature_matrix,good.base_learner_matrix)
    chromes.append(chrome)
    #find列替换该列
    temp_matrix1 = copy.deepcopy(good)
    temp_matrix1.coding_matrix[worst_segment_accuracy_index] = find_coding_segment
    temp_matrix1.feature_matrix[worst_segment_accuracy_index] = find_feature_segment
    temp_matrix1.base_learner_matrix[worst_segment_accuracy_index] = find_base_learner
    chrome1 = Initialization.coding(temp_matrix1.coding_matrix,temp_matrix1.feature_matrix,temp_matrix1.base_learner_matrix)
    chromes.append(chrome1)

    #添加find列或者精英池中添加一segment
    if len(good_coding_matrix)+1 < max_num_classifier:
        distance0 = matrixDistance(good,class_size)
        #添加find列
        temp_matrix2 = copy.deepcopy(good)
        temp_matrix2.coding_matrix.append(find_coding_segment)
        temp_matrix2.feature_matrix.append(find_feature_segment)
        temp_matrix2.base_learner_matrix.append(find_base_learner)
        temp_matrix2 = Valuate.calObjValue(PopInfors, [temp_matrix2])[0]
        distance1 = matrixDistance(temp_matrix2,class_size)
        
        flag = 0
        change_f1score = 0
        p_matrix= []
        if distance1 > distance0:#继续添加column,直至distance开始减少
            temp_matrix4 =  copy.deepcopy(temp_matrix2)
            while change_f1score >= 0 and len(temp_matrix4.coding_matrix)+1 < max_num_classifier:
                flag = 0
                if len(talents_pool) != 0 :
                    #精英池中选择                
                    for talent in talents_pool:
                        if not talent.code_segment in temp_matrix4.coding_matrix:
                            flag = 1
                            break
                    
                    if flag == 0:
                        break
                    else:
                        random_index = random.randint(0,len(talents_pool)-1)
                        choose_pool = talents_pool[random_index]        
                        p_distance = matrixDistance(temp_matrix4,class_size)
                        p_matrix = copy.deepcopy(temp_matrix4)
                        while choose_pool.code_segment in temp_matrix4.coding_matrix:
                            random_index = random.randint(0,len(talents_pool)-1)
                            choose_pool = talents_pool[random_index]        
                        temp_matrix4.coding_matrix.append(choose_pool.code_segment)
                        temp_matrix4.feature_matrix.append(choose_pool.feature_segment)
                        temp_matrix4.base_learner_matrix.append(choose_pool.estimator)
                        chrome_ = Initialization.coding(temp_matrix4.coding_matrix,temp_matrix4.feature_matrix,temp_matrix4.base_learner_matrix)
                        temp_matrix4 = PopLegality.checkLegality([chrome_],PopInfors)
                        temp_matrix4 = Valuate.calObjValue(PopInfors, temp_matrix4)[0]
                        distance2 = matrixDistance(temp_matrix4,class_size)
                        print(distance2)
                        change_f1score = distance2 - p_distance
                else:
                    break
            #若连续三个column添加进来distance均减少,则终止
            count = 0       
            temp_matrix5 = copy.deepcopy(temp_matrix4)
            temp_matrix6 = copy.deepcopy(temp_matrix4)
            if not flag == 0:
                temp_matrix4 = p_matrix
                temp_matrix5 = copy.deepcopy(temp_matrix4)
                temp_matrix6 = copy.deepcopy(temp_matrix4)
                while count < 3 and len(temp_matrix5.coding_matrix)+1 < max_num_classifier:
                    if len(talents_pool) != 0 :
                        #精英池中选择
                        random_index = random.randint(0,len(talents_pool)-1)
                        choose_pool = talents_pool[random_index]        
                        if not choose_pool.code_segment in temp_matrix5.coding_matrix:
                            temp_matrix5.coding_matrix.append(choose_pool.code_segment)
                            temp_matrix5.feature_matrix.append(choose_pool.feature_segment)
                            temp_matrix5.base_learner_matrix.append(choose_pool.estimator)
                            chrome_ = Initialization.coding(temp_matrix5.coding_matrix,temp_matrix5.feature_matrix,temp_matrix5.base_learner_matrix)
                            temp_matrix5 = PopLegality.checkLegality([chrome_],PopInfors)
                            temp_matrix5 = Valuate.calObjValue(PopInfors, temp_matrix5)[0]
                        distance3 = matrixDistance(temp_matrix5,class_size)
                        if distance3 < distance2:
                            count += 1
                            print('局部优化:::',count)
                        else:
                            count = 0
                            temp_matrix6 = copy.deepcopy(temp_matrix5)
                        #精英池里面的column全部包含于该coding_matrix中,停止循环
                        f = 0
                        for talent in talents_pool:
                            if not talent.code_segment in temp_matrix5.coding_matrix:
                                f = 1
                                break
                        if f == 0:
                            break
                    else:
                        break
            
            chrome6 = Initialization.coding(temp_matrix6.coding_matrix,temp_matrix6.feature_matrix,temp_matrix6.base_learner_matrix)
            chromes.append(chrome6)
        else:
            chrome2 = Initialization.coding(temp_matrix2.coding_matrix,temp_matrix2.feature_matrix,temp_matrix2.base_learner_matrix)
            chromes.append(chrome2)
    
    #删除该列
    if len(good_coding_matrix)-1 > min_num_classifier and len(good_coding_matrix)-1 > 1:
        temp_matrix3 = copy.deepcopy(good)
        del temp_matrix3.coding_matrix[worst_segment_accuracy_index]
        del temp_matrix3.feature_matrix[worst_segment_accuracy_index]
        del temp_matrix3.base_learner_matrix[worst_segment_accuracy_index]
        chrome3 = Initialization.coding(temp_matrix3.coding_matrix,temp_matrix3.feature_matrix,temp_matrix3.base_learner_matrix)
        chromes.append(chrome3)
    

    
    new_good = chooseGood(PopInfors, chromes, talents_pool)
    new_good = [new_good]
    #新矩阵个体评价
    new_good = Valuate.calObjValue(PopInfors, new_good)
    talents_pool, new_good = Valuate.addToTalentsPool(PopInfors, new_good, talents_pool)
    
    record_matrixs[0] = new_good[0]
    return record_matrixs