【超参数寻优】量子粒子群算法(QPSO) 超参数寻优的python实现
【超參數(shù)尋優(yōu)】量子粒子群算法(QPSO) 超參數(shù)尋優(yōu)的python實(shí)現(xiàn)
??? 一、粒子群算法的缺點(diǎn)
??? 二、量子粒子群算法
??? 三、QPSO算法的python實(shí)現(xiàn)
??? 參考資料
一、粒子群算法的缺點(diǎn)
本人之前的博文(參考資料【1】)已經(jīng)詳細(xì)介紹了PSO算法,學(xué)習(xí)本博文前需要先學(xué)習(xí)PSO算法。
PSO算法的缺點(diǎn):
1、需要設(shè)定的參數(shù)(慣性因子w
w,局部學(xué)習(xí)因子c1c1?和全局學(xué)習(xí)因子c2
c2?)太多,不利于找到待優(yōu)化模型的最優(yōu)參數(shù)。
2、粒子位置變化缺少隨機(jī)性,容易陷入局部最優(yōu)的陷阱。
二、量子粒子群算法
量子粒子群優(yōu)化(Quantum Particle Swarm Optimization,QPSO)算法取消了粒子的移動方向?qū)傩?#xff0c;粒子位置的更新跟該粒子之前的運(yùn)動沒有任何關(guān)系,這樣就增加了粒子位置的隨機(jī)性(參考資料【2】)。
量子粒子群算法中引入的新名詞:
mbest:表示pbest的平均值,即平均的粒子歷史最好位置。
量子粒子群算法的粒子更新步驟:
步驟一:計(jì)算mbest
Mbest=1M∑Mi=1pbest_i
Mbest?=M1?i=1∑M?pbest_i?
其中M
M表示粒子群的大小,pbest_ipbest_i?表示當(dāng)前迭代中的第ii個(gè)pbest
pbest。
步驟二:粒子位置更新
Pi=??pbest_i+(1??)gbest
Pi?=??pbest_i?+(1??)gbest
其中g(shù)best
gbest表示當(dāng)前全局最優(yōu)粒子,PiPi?用于第i
i個(gè)粒子位置的更新。
粒子位置更新公式為:
xi=Pi±α∣Mbest?xi∣ln(1u)
xi?=Pi?±α∣Mbest??xi?∣ln(u1?)
其中xi
xi?表示第ii個(gè)粒子的位置,αα為創(chuàng)新參數(shù),??和uu為(0,1)(0,1)上的均勻分布數(shù)值。取++和?
?的概率為0.5。
由上所示,QPSO算法中只有一個(gè)創(chuàng)新參數(shù)α
α設(shè)置,一般α
α不大于1。
三、QPSO算法的python實(shí)現(xiàn)
完整python代碼和樣本地址:https://github.com/shiluqiang/QPSO_python
本博文以非線性SVM為待優(yōu)化模型,待優(yōu)化參數(shù)為正則化參數(shù)C
C和核參數(shù) σ
σ,適應(yīng)度函數(shù)值為3-fold交叉驗(yàn)證平均值。
## 2. QPSO算法
class QPSO(object):
??? def __init__(self,particle_num,particle_dim,alpha,iter_num,max_value,min_value):
??????? '''定義類參數(shù)
??????? particle_num(int):粒子群大小
??????? particle_dim(int):粒子維度,對應(yīng)待尋優(yōu)參數(shù)的個(gè)數(shù)
??????? alpha(float):控制系數(shù)
??????? iter_num(int):最大迭代次數(shù)
??????? max_value(float):參數(shù)的最大值
??????? min_value(float):參數(shù)的最小值
??????? '''
??????? self.particle_num = particle_num
??????? self.particle_dim = particle_dim
??????? self.iter_num = iter_num
??????? self.alpha = alpha
??????? self.max_value = max_value
??????? self.min_value = min_value
### 2.1 粒子群初始化
??? def swarm_origin(self):
??????? '''初始化粒子群中的粒子位置
??????? input:self(object):QPSO類
??????? output:particle_loc(list):粒子群位置列表
??????? '''
??????? particle_loc = []
??????? for i in range(self.particle_num):
??????????? tmp1 = []
??????????? for j in range(self.particle_dim):
??????????????? a = random.random()
??????????????? tmp1.append(a * (self.max_value - self.min_value) + self.min_value)
??????????? particle_loc.append(tmp1)
?????? ?
??????? return particle_loc
### 2.2 計(jì)算適應(yīng)度函數(shù)數(shù)值列表
??? def fitness(self,particle_loc):
??????? '''計(jì)算適應(yīng)度函數(shù)值
??????? input:self(object):PSO類
????????????? particle_loc(list):粒子群位置列表
??????? output:fitness_value(list):適應(yīng)度函數(shù)值列表
??????? '''
??????? fitness_value = []
??????? ### 1.適應(yīng)度函數(shù)為RBF_SVM的3_fold交叉校驗(yàn)平均值
??????? for i in range(self.particle_num):
??????????? rbf_svm = svm.SVC(kernel = 'rbf', C = particle_loc[i][0], gamma = particle_loc[i][1])
??????????? cv_scores = cross_validation.cross_val_score(rbf_svm,trainX,trainY,cv =3,scoring = 'accuracy')
??????????? fitness_value.append(cv_scores.mean())
??????? ### 2. 當(dāng)前粒子群最優(yōu)適應(yīng)度函數(shù)值和對應(yīng)的參數(shù)
??????? current_fitness = 0.0
??????? current_parameter = []
??????? for i in range(self.particle_num):
??????????? if current_fitness < fitness_value[i]:
??????????????? current_fitness = fitness_value[i]
??????????????? current_parameter = particle_loc[i]
??????? return fitness_value,current_fitness,current_parameter
### 2.3 粒子位置更新?? ?
??? def updata(self,particle_loc,gbest_parameter,pbest_parameters):
??????? '''粒子位置更新
??????? input:self(object):QPSO類
????????????? particle_loc(list):粒子群位置列表
????????????? gbest_parameter(list):全局最優(yōu)參數(shù)
????????????? pbest_parameters(list):每個(gè)粒子的歷史最優(yōu)值
??????? output:particle_loc(list):新的粒子群位置列表
??????? '''
??????? Pbest_list = pbest_parameters
??????? #### 2.3.1 計(jì)算mbest
??????? mbest = []
??????? total = []
??????? for l in range(self.particle_dim):
??????????? total.append(0.0)
??????? total = np.array(total)
?????? ?
??????? for i in range(self.particle_num):
??????????? total += np.array(Pbest_list[i])
??????? for j in range(self.particle_dim):
??????????? mbest.append(list(total)[j] / self.particle_num)
?????? ?
??????? #### 2.3.2 位置更新
??????? ##### Pbest_list更新
??????? for i in range(self.particle_num):
??????????? a = random.uniform(0,1)
??????????? Pbest_list[i] = list(np.array([x * a for x in Pbest_list[i]]) + np.array([y * (1 - a) for y in gbest_parameter]))
??????? ##### particle_loc更新
??????? for j in range(self.particle_num):
??????????? mbest_x = []? ## 存儲mbest與粒子位置差的絕對值
??????????? for m in range(self.particle_dim):
??????????????? mbest_x.append(abs(mbest[m] - particle_loc[j][m]))
??????????? u = random.uniform(0,1)
??????????? if random.random() > 0.5:
??????????????? particle_loc[j] = list(np.array(Pbest_list[j]) + np.array([self.alpha * math.log(1 / u) * x for x in mbest_x]))
??????????? else:
??????????????? particle_loc[j] = list(np.array(Pbest_list[j]) - np.array([self.alpha * math.log(1 / u) * x for x in mbest_x]))
?????????????? ?
??????? #### 2.3.3 將更新后的量子位置參數(shù)固定在[min_value,max_value]內(nèi)
??????? ### 每個(gè)參數(shù)的取值列表
??????? parameter_list = []
??????? for i in range(self.particle_dim):
??????????? tmp1 = []
??????????? for j in range(self.particle_num):
??????????????? tmp1.append(particle_loc[j][i])
??????????? parameter_list.append(tmp1)
??????? ### 每個(gè)參數(shù)取值的最大值、最小值、平均值? ?
??????? value = []
??????? for i in range(self.particle_dim):
??????????? tmp2 = []
??????????? tmp2.append(max(parameter_list[i]))
??????????? tmp2.append(min(parameter_list[i]))
??????????? value.append(tmp2)
?????? ?
??????? for i in range(self.particle_num):
??????????? for j in range(self.particle_dim):
??????????????? particle_loc[i][j] = (particle_loc[i][j] - value[j][1])/(value[j][0] - value[j][1]) * (self.max_value - self.min_value) + self.min_value
?????????????? ?
??????? return particle_loc
## 2.4 畫出適應(yīng)度函數(shù)值變化圖
??? def plot(self,results):
??????? '''畫圖
??????? '''
??????? X = []
??????? Y = []
??????? for i in range(self.iter_num):
??????????? X.append(i + 1)
??????????? Y.append(results[i])
??????? plt.plot(X,Y)
??????? plt.xlabel('Number of iteration',size = 15)
??????? plt.ylabel('Value of CV',size = 15)
??????? plt.title('QPSO_RBF_SVM parameter optimization')
??????? plt.show()??????? ?
## 2.5 主函數(shù)
??? def main(self):
??????? results = []
??????? best_fitness = 0.0
??????? ## 1、粒子群初始化
??????? particle_loc = self.swarm_origin()
??????? ## 2、初始化gbest_parameter、pbest_parameters、fitness_value列表
??????? ### 2.1 gbest_parameter
??????? gbest_parameter = []
??????? for i in range(self.particle_dim):
??????????? gbest_parameter.append(0.0)
??????? ### 2.2 pbest_parameters
??????? pbest_parameters = []
??????? for i in range(self.particle_num):
??????????? tmp1 = []
??????????? for j in range(self.particle_dim):
??????????????? tmp1.append(0.0)
??????????? pbest_parameters.append(tmp1)
??????? ### 2.3 fitness_value
??????? fitness_value = []
??????? for i in range(self.particle_num):
??????????? fitness_value.append(0.0)
?????? ?
??????? ## 3、迭代
??????? for i in range(self.iter_num):
??????????? ### 3.1 計(jì)算當(dāng)前適應(yīng)度函數(shù)值列表
??????????? current_fitness_value,current_best_fitness,current_best_parameter = self.fitness(particle_loc)
??????????? ### 3.2 求當(dāng)前的gbest_parameter、pbest_parameters和best_fitness
??????????? for j in range(self.particle_num):
??????????????? if current_fitness_value[j] > fitness_value[j]:
??????????????????? pbest_parameters[j] = particle_loc[j]
??????????? if current_best_fitness > best_fitness:
??????????????? best_fitness = current_best_fitness
??????????????? gbest_parameter = current_best_parameter
?????????? ?
??????????? print('iteration is :',i+1,';Best parameters:',gbest_parameter,';Best fitness',best_fitness)
??????????? results.append(best_fitness)
??????????? ### 3.3 更新fitness_value
??????????? fitness_value = current_fitness_value
??????????? ### 3.4 更新粒子群
??????????? particle_loc = self.updata(particle_loc,gbest_parameter,pbest_parameters)
??????? ## 4.結(jié)果展示
??????? results.sort()
??????? self.plot(results)
??????? print('Final parameters are :',gbest_parameter)
最優(yōu)適應(yīng)度函數(shù)值隨迭代次數(shù)的變化如下圖:
參考資料
1、https://blog.csdn.net/Luqiang_Shi/article/details/84720738
2、鄭偉博. 粒子群優(yōu)化算法的改進(jìn)及其應(yīng)用研究[D]. 2016.
?
總結(jié)
以上是生活随笔為你收集整理的【超参数寻优】量子粒子群算法(QPSO) 超参数寻优的python实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 轮盘赌算法原理
- 下一篇: 插值,拟合,逼近的区别理解