Matlab 粒子群优化中的矩阵越界:如何限制值?
我发现认知图的权重类似于前馈神经网络,区别在于没有自连接(因此对角线=0)。权重矩阵为Matlab 粒子群优化中的矩阵越界:如何限制值?,matlab,matrix,particle-swarm,Matlab,Matrix,Particle Swarm,我发现认知图的权重类似于前馈神经网络,区别在于没有自连接(因此对角线=0)。权重矩阵为3*3,每个粒子表示需要找到(优化)的权重。在我的应用程序中,我需要将权重值限制在[-1,1]的范围内。 所以,当粒子群优化算法更新它的速度和位置方程(下面摘录)时,我选择了那些大于1和-1的指数,并对它们设置了阈值。我检查了速度和位置的值。Velocity的前6行和6列是 -3.29818766857477e-10 1.06365098218884e-09 1.72718584823501e-08
3*3
,每个粒子表示需要找到(优化)的权重。在我的应用程序中,我需要将权重值限制在[-1,1]的范围内。
所以,当粒子群优化算法更新它的速度和位置方程(下面摘录)时,我选择了那些大于1和-1的指数,并对它们设置了阈值。我检查了速度和位置的值。Velocity
的前6行和6列是
-3.29818766857477e-10 1.06365098218884e-09 1.72718584823501e-08 8.52030002125361e-08 4.24567055691019e-09 1.42682312020373e-10
-0.527487299879998 0.0141963443263498 2 -2 0.0804033989937564 0.0294235685161277
-0.460426149819118 -0.00962472296493386 -0.231141442703638 -0.161996004370743 -0.00140062376098630 -0.0183361675902131
0.490979470234505 -0.150287862753787 -0.453325515475146 1.48710788599919 -2 -0.0168498207544201
-1.49184829189134 0.718322120314944 0.191912248648141 1.67798502924430 -0.811846486653242 -0.00645584872854835
0.0236930729558028 0.725697240982270 -0.571776066383284 -0.481114642909396 -0.623411799726210 0.00226958877218209
和位置
前6行和6列的值=
-7.98664279308835 -3.90744804351231 -6.92609001695919 -6.38057220301763 6.34627589189950 0.515032878765257
-8.23428663786642 -3.91888491694193 -5.06678793435555 -7.66405701509194 6.18465937874726 0.527740403314418
-8.18128160012481 -3.91458365620100 -6.65571517234057 -6.64026727804025 6.46684166489122 0.509478265627388
-7.82297889594148 -3.73466474001669 -6.83434245810552 -5.84907863164857 6.76798656860034 0.497959367071159
-8.65135591544159 -3.40466585557339 -7.11566232657911 -6.09503181101550 5.95791723669973 0.511429259659808
-7.93848660180123 -3.22292763621706 -6.41517926678420 -7.12188582637202 6.18562296678481 0.514711315467883
位置
的值以及因此而产生的权重和速度
的值超出了我提到的范围。应采取什么措施使位置值和权重矩阵在[-1,1]范围内?我哪里做错了?请帮忙
noP = 10;
Dim = 9;
Velocity=zeros(noP,Dim); %Velocity vector
Position=zeros(noP,Dim); %Position vector
weight_min_range = -1;
weight_max_range = 1;
velocity_clamping_factor = 2;
Vmax=weight_max_range*velocity_clamping_factor;
Vmin=-Vmax;
%////////Cognitive component/////////
pBestScore=zeros(noP);
pBest=zeros(noP,Dim);
pBestScore2=zeros(noP);
%Initialization
for i=1:size(Position,1) % For each Particle
for j=1:size(Position,2) % For each dimension
Position(i,j)=rand();
Velocity(i,j)=rand();
end
end
for PSOITER = 1:IterMax
%INSIDE PSO LOOP : DETAILS SKIPPED
.........
............
%Fitness evaluation by each particle for all training set
for i=1:size(pos,1)
for j=1:size(pos,2)
Velocity(i,j)=inertia*vel(i,j)+c1*rand()*(pBest(i,j)-Position(i,j))+c2*rand()*(gBest(j)-Position(i,j));
Vind1 = Velocity<Vmin;
Vind2 = Velocity>Vmax;
Velocity(Vind1) = Vmin;
Velocity(Vind2) = Vmax;
Position(i,j)= Position(i,j)+ Velocity(i,j);
end
end
您的
Velocity
值似乎都在[-1,1]
范围内
您的代码不包含位置的阈值设置
此外,在每次迭代i,j
时,您将对Velocity
的所有值设置阈值,同时只更新Velocity(i,j)
如果您想同时设定速度
和位置
的阈值,并避免使用循环,您可以将整个健身评估循环替换为:
G = repmat(gBest, Dim, 1);
Velocity = inertia*vel + c1*rand(size(Velocity))*(pBest - Position) + ...
c2*rand(size(Velocity))*(G - Position);
Velocity(Velocity < Vmin) = Vmin;
Velocity(Velocity > Vmax) = Vmax;
Position = Position + Velocity;
Position(Position < Pmin) = Pmin;
Position(Position > Pmax) = Pmax;
这会将您的权重矩阵W
映射到[-1]
中,如下所示:
[0.11444 -0.85202 1.00000;
-1.00000 0.11444 0.18631;
-0.43079 -0.77590 0.11444]
另一种保持正负值相对于零的比例的方法是:
w_max = max(W(:));
w_min = min(W(:));
w_abs_max = max([abs(w_max), abs(w_min)]);
W_norm = -1.0 + (W - w_min)/w_abs_max;
这将通过以下方式将您的权重矩阵映射到[-1]
:
[0.00000 -0.86722 0.79462;
-1.00000 0.00000 0.06448;
-0.48924 -0.79891 0.00000]
请注意此映射如何保留零值和权重大小之间的比率。变量
惯性的值是多少?^。即使我想在I,j循环中做,我对位置和速度设定了阈值,现在我得到的权重值只有-1和1,中间没有中间值。我取Pmin=-1和Pmax=1。我先存储索引然后再更新阈值的方法是否不正确?还有,如果我取Pmin=-1&Pmax=1,为什么结果权重现在只有-1和1?谢谢你的努力和时间,我会很感激的。我不太清楚你的算法是如何工作的,但是这里有一个建议:为什么不让位置和速度在没有阈值的情况下发展,然后在最后标准化权重,使最大值和最小值在[-1,1]范围内?我对算法的了解还不够多,不能再多加评论了。我将在我的答案中添加一个编辑,向您展示如何在更新权重后规范化权重。我当然会尝试上述方法,但在此之前,我想问一下,在计算适合度时,我是将输入特征与权重+偏差相乘。然后我计算这个输出和目标之间的平方误差(目标是[100;010;110])。那么,我应该在这一步中乘以标准化权重,还是与没有标准化的权重相乘?第二,在第二种标准化方法中保留零值的意义是什么?请原谅我的小问题。我在计算位置后应用了这两种方法,因为在适应度计算过程中,位置值与输入特征相乘。我得到的所有权重都是-1,两者之间没有任何值!!我不知所措,我该怎么办?请帮忙
w_max = max(W(:));
w_min = min(W(:));
w_abs_max = max([abs(w_max), abs(w_min)]);
W_norm = -1.0 + (W - w_min)/w_abs_max;
[0.00000 -0.86722 0.79462;
-1.00000 0.00000 0.06448;
-0.48924 -0.79891 0.00000]