Skip to content

Commit 17f068a

Browse files
authored
Add files via upload
1 parent 30993f3 commit 17f068a

File tree

3 files changed

+155
-123
lines changed

3 files changed

+155
-123
lines changed

Main.m

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,43 @@
1-
%-------------------------------------------------------------------------%
2-
% Binary Harris Hawk Optimization (BHHO) source codes demo version %
3-
% %
4-
% Programmer: Jingwei Too %
5-
% %
6-
% E-Mail: jamesjames868@gmail.com %
7-
%-------------------------------------------------------------------------%
1+
%-------------------------------------------------------------------%
2+
% Binary Harris Hawk Optimization (BHHO) demo version %
3+
%-------------------------------------------------------------------%
84

95

10-
%---Inputs-----------------------------------------------------------------
11-
% feat: features
12-
% label: labelling
13-
% N: Number of hawks
14-
% T: Maximum number of iterations
15-
%---Outputs----------------------------------------------------------------
16-
% sFeat: Selected features
17-
% Sf: Selected feature index
18-
% Nf: Number of selected features
19-
% curve: Convergence curve
20-
%--------------------------------------------------------------------------
6+
%---Inputs-----------------------------------------------------------
7+
% feat : feature vector (instances x features)
8+
% label : label vector (instance x 1)
9+
% N : Number of hawks
10+
% max_Iter : Maximum number of iterations
2111

12+
%---Outputs----------------------------------------------------------
13+
% sFeat : Selected features
14+
% Sf : Selected feature index
15+
% Nf : Number of selected features
16+
% curve : Convergence curve
17+
%--------------------------------------------------------------------
2218

2319

2420
%% Binary Harris Hawk Optimization
2521
clc, clear, close;
2622
% Benchmark data set
2723
load ionosphere.mat;
24+
2825
% Set 20% data as validation set
29-
ho=0.2;
26+
ho = 0.2;
3027
% Hold-out method
31-
HO=cvpartition(label,'HoldOut',ho,'Stratify',false);
28+
HO = cvpartition(label,'HoldOut',ho,'Stratify',false);
29+
3230
% Parameter setting
33-
N=10; T=100;
31+
N = 10;
32+
max_Iter = 100;
3433
% Binary Harris Hawk Optimization
35-
[sFeat,Sf,Nf,curve]=jBHHO(feat,label,N,T,HO);
36-
% Plot convergence curve
37-
figure(); plot(1:T,curve); xlabel('Number of iterations');
38-
ylabel('Fitness Value'); title('BHHO'); grid on;
34+
[sFeat,Sf,Nf,curve] = jBHHO(feat,label,N,max_Iter,HO);
3935

36+
% Plot convergence curve
37+
plot(1:max_Iter,curve);
38+
xlabel('Number of iterations');
39+
ylabel('Fitness Value');
40+
title('BHHO'); grid on;
4041

4142

4243

jBHHO.m

Lines changed: 109 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -1,144 +1,170 @@
1-
function [sFeat,Sf,Nf,curve]=jBHHO(feat,label,N,T,HO)
1+
function [sFeat,Sf,Nf,curve] = jBHHO(feat,label,N,max_Iter,HO)
22

3-
fun=@jFitnessFunction;
4-
D=size(feat,2); X=zeros(N,D);
5-
for i=1:N
6-
for d=1:D
3+
beta = 1.5;
4+
ub = 1;
5+
lb = 0;
6+
7+
fun = @jFitnessFunction;
8+
dim = size(feat,2);
9+
X = zeros(N,dim);
10+
for i = 1:N
11+
for d = 1:dim
712
if rand() > 0.5
8-
X(i,d)=1;
13+
X(i,d) = 1;
914
end
1015
end
1116
end
12-
fitR=inf; fit=zeros(1,N); Y=zeros(1,D); Z=zeros(1,D);
13-
beta=1.5; ub=1; lb=0; t=1; curve=inf;
14-
%---Iteration start-------------------------------------------------------
15-
while t <= T
16-
for i=1:N
17-
fit(i)=fun(feat,label,X(i,:),HO);
17+
fitR = inf;
18+
fit = zeros(1,N);
19+
Y = zeros(1,dim);
20+
Z = zeros(1,dim);
21+
22+
curve = inf;
23+
t = 1;
24+
%---Iteration start-------------------------------------------------
25+
while t <= max_Iter
26+
for i = 1:N
27+
fit(i) = fun(feat,label,X(i,:),HO);
1828
if fit(i) < fitR
19-
fitR=fit(i); Xrb=X(i,:);
29+
fitR = fit(i);
30+
Xrb = X(i,:);
2031
end
2132
end
22-
Xm=mean(X,1);
23-
for i=1:N
24-
E0=-1+2*rand();
25-
E=2*E0*(1-(t/T));
33+
X_mu = mean(X,1);
34+
for i = 1:N
35+
E0 = -1 + 2 * rand();
36+
E = 2 * E0 * (1 - (t / max_Iter));
2637
if abs(E) >= 1
27-
q=rand();
38+
q = rand();
2839
if q >= 0.5
29-
k=randi([1,N]); r1=rand(); r2=rand();
30-
for d=1:D
31-
Xn=X(k,d)-r1*abs(X(k,d)-2*r2*X(i,d));
32-
S=1/(1+exp(-Xn));
40+
k = randi([1,N]);
41+
r1 = rand();
42+
r2 = rand();
43+
for d = 1:dim
44+
Xn = X(k,d) - r1 * abs(X(k,d) - 2 * r2 * X(i,d));
45+
S = 1 / (1 + exp(-Xn));
3346
if rand() < S
34-
X(i,d)=1;
35-
else
36-
X(i,d)=0;
47+
X(i,d)= 1;
48+
else
49+
X(i,d) = 0;
3750
end
3851
end
3952
elseif q < 0.5
40-
r3=rand(); r4=rand();
41-
for d=1:D
42-
Xn=(Xrb(d)-Xm(d))-r3*(lb+r4*(ub-lb));
43-
S=1/(1+exp(-Xn));
53+
r3 = rand();
54+
r4 = rand();
55+
for d = 1:dim
56+
Xn = (Xrb(d) - X_mu(d)) - r3 * (lb + r4 * (ub - lb));
57+
S = 1 / (1 + exp(-Xn));
4458
if rand() < S
45-
X(i,d)=1;
59+
X(i,d) = 1;
4660
else
47-
X(i,d)=0;
61+
X(i,d) = 0;
4862
end
4963
end
5064
end
5165
elseif abs(E) < 1
52-
J=2*(1-rand()); r=rand();
53-
if r >= 0.5 && abs(E) >= 0.5
54-
for d=1:D
55-
DX=Xrb(d)-X(i,d);
56-
Xn=DX-E*abs(J*Xrb(d)-X(i,d));
57-
S=1/(1+exp(-Xn));
66+
J = 2 * (1 - rand());
67+
r = rand();
68+
if r >= 0.5 && abs(E) >= 0.5
69+
for d = 1:dim
70+
DX = Xrb(d) - X(i,d);
71+
Xn = DX - E * abs(J * Xrb(d) - X(i,d));
72+
S = 1 / (1 + exp(-Xn));
5873
if rand() < S
59-
X(i,d)=1;
74+
X(i,d) = 1;
6075
else
61-
X(i,d)=0;
76+
X(i,d) = 0;
6277
end
6378
end
64-
elseif r >= 0.5 && abs(E) < 0.5
65-
for d=1:D
66-
DX=Xrb(d)-X(i,d);
67-
Xn=Xrb(d)-E*abs(DX);
68-
S=1/(1+exp(-Xn));
79+
elseif r >= 0.5 && abs(E) < 0.5
80+
for d = 1:dim
81+
DX = Xrb(d) - X(i,d);
82+
Xn = Xrb(d) - E * abs(DX);
83+
S = 1 / (1 + exp(-Xn));
6984
if rand() < S
70-
X(i,d)=1;
85+
X(i,d) = 1;
7186
else
72-
X(i,d)=0;
87+
X(i,d) = 0;
7388
end
7489
end
75-
elseif r < 0.5 && abs(E) >= 0.5
76-
LF=jLevyDistribution(beta,D);
77-
for d=1:D
78-
Yn=Xrb(d)-E*abs(J*Xrb(d)-X(i,d));
79-
S=1/(1+exp(-Yn));
90+
elseif r < 0.5 && abs(E) >= 0.5
91+
LF = jLevyDistribution(beta,dim);
92+
for d = 1:dim
93+
Yn = Xrb(d) - E * abs(J * Xrb(d) - X(i,d));
94+
S = 1 / (1 + exp(-Yn));
8095
if rand() < S
81-
Y(d)=1;
96+
Y(d) = 1;
8297
else
83-
Y(d)=0;
98+
Y(d) = 0;
8499
end
85-
Zn=Y(d)+rand()*LF(d);
86-
S=1/(1+exp(-Zn));
100+
Zn = Y(d) + rand() * LF(d);
101+
S = 1 / (1 + exp(-Zn));
87102
if rand() < S
88-
Z(d)=1;
103+
Z(d) = 1;
89104
else
90-
Z(d)=0;
105+
Z(d) = 0;
91106
end
92107
end
93-
fitY=fun(feat,label,Y,HO); fitZ=fun(feat,label,Z,HO);
108+
fitY = fun(feat,label,Y,HO);
109+
fitZ = fun(feat,label,Z,HO);
94110
if fitY <= fit(i)
95-
fit(i)=fitY; X(i,:)=Y;
111+
fit(i) = fitY;
112+
X(i,:) = Y;
96113
end
97114
if fitZ <= fit(i)
98-
fit(i)=fitZ; X(i,:)=Z;
115+
fit(i) = fitZ;
116+
X(i,:) = Z;
99117
end
100-
elseif r < 0.5 && abs(E) < 0.5
101-
LF=jLevyDistribution(beta,D);
102-
for d=1:D
103-
Yn=Xrb(d)-E*abs(J*Xrb(d)-Xm(d));
104-
S=1/(1+exp(-Yn));
118+
elseif r < 0.5 && abs(E) < 0.5
119+
LF = jLevyDistribution(beta,dim);
120+
for d = 1:dim
121+
Yn = Xrb(d) - E * abs(J * Xrb(d) - X_mu(d));
122+
S = 1 / (1 + exp(-Yn));
105123
if rand() < S
106-
Y(d)=1;
124+
Y(d) = 1;
107125
else
108-
Y(d)=0;
126+
Y(d) = 0;
109127
end
110-
Zn=Y(d)+rand()*LF(d);
111-
S=1/(1+exp(-Zn));
128+
Zn = Y(d) + rand() * LF(d);
129+
S = 1 / (1 + exp(-Zn));
112130
if rand() < S
113-
Z(d)=1;
131+
Z(d) = 1;
114132
else
115-
Z(d)=0;
133+
Z(d) = 0;
116134
end
117135
end
118-
fitY=fun(feat,label,Y,HO); fitZ=fun(feat,label,Z,HO);
136+
fitY = fun(feat,label,Y,HO);
137+
fitZ = fun(feat,label,Z,HO);
119138
if fitY <= fit(i)
120-
fit(i)=fitY; X(i,:)=Y;
139+
fit(i) = fitY;
140+
X(i,:) = Y;
121141
end
122142
if fitZ <= fit(i)
123-
fit(i)=fitZ; X(i,:)=Z;
143+
fit(i) = fitZ;
144+
X(i,:) = Z;
124145
end
125146
end
126147
end
127148
end
128-
curve(t)=fitR;
149+
curve(t) = fitR;
129150
fprintf('\nIteration %d Best (BHHO)= %f',t,curve(t))
130-
t=t+1;
151+
t = t + 1;
131152
end
132-
Pos=1:D; Sf=Pos(Xrb==1); Nf=length(Sf); sFeat=feat(:,Sf);
153+
Pos = 1:dim;
154+
Sf = Pos(Xrb == 1);
155+
Nf = length(Sf);
156+
sFeat = feat(:,Sf);
133157
end
134158

135159

136-
function LF=jLevyDistribution(beta,D)
137-
nume=gamma(1+beta)*sin(pi*beta/2);
138-
deno=gamma((1+beta)/2)*beta*2^((beta-1)/2);
139-
sigma=(nume/deno)^(1/beta);
140-
u=randn(1,D)*sigma; v=randn(1,D);
141-
step=u./abs(v).^(1/beta); LF=0.01*step;
160+
function LF = jLevyDistribution(beta,dim)
161+
nume = gamma(1 + beta) * sin(pi * beta / 2);
162+
deno = gamma((1 + beta) / 2) * beta * 2 ^ ((beta - 1) / 2);
163+
sigma = (nume / deno) ^ (1 / beta);
164+
u = randn(1,dim) * sigma;
165+
v = randn(1,dim);
166+
step = u ./ abs(v) .^ (1 / beta);
167+
LF = 0.01 * step;
142168
end
143169

144170

jFitnessFunction.m

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,33 @@
11
% Notation: This fitness function is for demonstration
22

3-
function fitness=jFitnessFunction(feat,label,X,HO)
4-
if sum(X==1)==0
5-
fitness=inf;
3+
function cost = jFitnessFunction(feat,label,X,HO)
4+
if sum(X == 1) == 0
5+
cost = inf;
66
else
7-
fitness=jwrapperKNN(feat(:,X==1),label,HO);
7+
cost = jwrapperKNN(feat(:, X == 1),label,HO);
88
end
99
end
1010

1111

12-
function ER=jwrapperKNN(sFeat,label,HO)
12+
function error = jwrapperKNN(sFeat,label,HO)
1313
%---// Parameter setting for k-value of KNN //
14-
k=5;
15-
xtrain=sFeat(HO.training==1,:); ytrain=label(HO.training==1);
16-
xvalid=sFeat(HO.test==1,:); yvalid=label(HO.test==1);
17-
Model=fitcknn(xtrain,ytrain,'NumNeighbors',k);
18-
pred=predict(Model,xvalid);
19-
N=length(yvalid); correct=0;
20-
for i=1:N
14+
k = 5;
15+
16+
xtrain = sFeat(HO.training == 1,:);
17+
ytrain = label(HO.training == 1);
18+
xvalid = sFeat(HO.test == 1,:);
19+
yvalid = label(HO.test == 1);
20+
21+
Model = fitcknn(xtrain,ytrain,'NumNeighbors',k);
22+
pred = predict(Model,xvalid);
23+
num_valid = length(yvalid);
24+
correct = 0;
25+
for i = 1:num_valid
2126
if isequal(yvalid(i),pred(i))
22-
correct=correct+1;
27+
correct = correct + 1;
2328
end
2429
end
25-
Acc=correct/N;
26-
ER=1-Acc;
30+
Acc = correct / num_valid;
31+
error = 1 - Acc;
2732
end
2833

0 commit comments

Comments
 (0)