0

我正在寻找类似于前馈神经网络的认知图的权重,不同之处在于没有自连接(因此对角线 = 0 )。权重矩阵是3*3,每个粒子代表需要找到(优化)的权重。在我的应用程序中,我需要将权重的值限制在[-1,1]. So 的范围内,当 PSO 更新其速度和位置方程(摘录如下)时,我选择了那些高于 1 和 -1 的索引并将它们设置为阈值。我检查了速度和位置的值。的前 6 行和 6 列Velocity

-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 行和Position6 列的值 =

-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

的值Positions和因此的权重也Velocity超出了我提到的范围。应该怎么做才能使位置值和权重矩阵在 [-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

在所有计算和 PSO 例程结束后,我得到以下权重矩阵,而不是权重矩阵值在 -1 到 1 的范围内。

    WeightMatrix =

                   0   -6.9261    6.3463
   -7.9866         0    0.5150
   -3.9074   -6.3806         0
4

1 回答 1

0

您的Velocity值似乎都在[-1, 1].

您的代码不包含Position.

此外,您Velocity在每次迭代中对 的所有值进行阈值处理,i,j同时仅更新Velocity(i,j).

如果您想同时设置阈值VelocityPosition避免使用循环,您可以将整个健身评估循环替换为:

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;

或者,您可以允许PositionVelocity在没有阈值的情况下进行进化,并在过程结束时对权重矩阵进行归一化:

w_max = max(W(:));
w_min = min(W(:));
W_norm = -1.0 + (W - w_min)*2.0/(w_max - w_min);

这会将您的权重矩阵映射W[-1 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 1]这将通过以下方式将您的权重矩阵映射到:

[0.00000 -0.86722 0.79462;
-1.00000  0.00000 0.06448;
-0.48924 -0.79891 0.00000]

请注意此映射如何保留零值和权重大小之间的比率。

于 2014-04-12T01:57:48.960 回答