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
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