一、差分進化的思想
差分進化是在遺傳算法的基礎上發展而來的,與遺傳算法相似,有變異、交叉、選擇等操作,但是實現簡單,收斂速度快。差分進化的過程是隨機生成一個初始化群體,經過交叉、變異、選擇三個操作,反復迭代,保留有用的個體,尋找最優解。
差分進化利用了貪婪的思想,在每一次的迭代中,保留最優解。通過當前種群個體跟經過交叉、變異后的個體以適應度值為標准,進行比較,保留最優的個體。
(1)初始化
(2)變異
(3)交叉
(4)選擇
其中,F是變異因子,用來控制兩個隨機個體差分向量的縮放程度。CR是交叉概率,用來控制進化發生的幾率,CR的值越大,則變異個體對試驗個體的貢獻多,CR的值小,則種群個體對試驗個體的貢獻多。
差分進化算法描述:
二、差分進化優化集成參數
差分進化算法優化參數時,關鍵是適應度值的計算,初始化、變異、交叉操作,是以種群個體為操作對象,代碼實現可以通用,適應度值的計算需要考慮優化的目標。
利用集成學習的方法,選擇五種分類器,把每個分類器權重作為差分進化中的種群個體,作為被優化的對象,這樣每個個體的維度就是5,一個個體就是一個解向量。
計算適應度值:分別將當代種群個體和經過變異、交叉操作后得到的試驗個體的分量作為個體分類器的權重,在數據集上通過加權集成分類結果,得到所有樣本的輸出,計算分類准確率,將其作為適應度值。
適應度值計算:
def fitness(w): #計算適應度值函數 trainX, Y_train, testX, Y_test = classifier.feature_sec() predict = [] m = classifier.Y_test.shape[0] #for Xi in model.testX: clf1 = classifier.clfLR(trainX, Y_train, testX, Y_test) clf2 = classifier.clfLDA(trainX, Y_train, testX, Y_test) clf3 = classifier.clfNB(trainX, Y_train, testX, Y_test) clf4 = classifier.clfSVM(trainX, Y_train, testX, Y_test) clf5 = classifier.clfPLA(trainX, Y_train, testX, Y_test) f1 = np.array(clf1.predict_proba(testX)) f2 = np.array(clf2.predict_proba(testX)) f3 = np.array(clf3.predict_proba(testX)) f4 = np.array(clf4.predict_proba(testX)) f5 = np.array(clf5._predict_proba_lr(testX)) fit = w[0]*f1 + w[1]*f2 + w[2]*f3 + w[3]*f4 + w[4]*f5 # print("f1",f1) # print("fit:",fit) # s = 0.5 * sum(w) print("w,s:",w) # for i in range(m): # fit = w[0]*f1[i] + w[1]*f2[i] + w[2]*f3[i] + w[3]*f4[i] # if fit >= s: # predict.append(1) # else: # predict.append(0) for fitprob in fit: if fitprob[0]>fitprob[1]: predict.append(0) else: predict.append(1) #print("predict:",predict) #print("Ytest shape:",classifier.Y_test.shape) # TP=TN=FP=FN = 0 # print(m) # for k in range(m): # if Y_test[k]==1 and predict[k]==1:TP += 1 # elif Y_test[k]==0 and predict[k]==0: TN += 1 # elif Y_test[k]==0 and predict[k]==1:FP += 1 # elif Y_test[k]==1 and predict[k]==0:FN += 1 # TP = sum(classifier.Y_test == predict == 1) #將正類預測為正類的樣本數 # TN = sum(classifier.Y_test == predict == 0) #將負類預測為負類的樣本數 # FP = sum(classifier.Y_test == 0 and predict == 1) #將負類預測為正類的樣本數 # FN = sum(classifier.Y_test == 1 and predict == 0) #將正類預測為負類的樣本數 # F1 = 2*TP/(2*TP+FN+FP) #F值越大,說明實驗效果越好 #Gmean = math.sqrt((TP/(TP+FN))*(TN/(TN+FP))) #用G-mean評價分類器性能 count = sum(predict==Y_test) print("Accuracy,F1 is:",count/m) return count/m