Skip to content

Commit ee2bf2c

Browse files
committed
First Commit
0 parents  commit ee2bf2c

File tree

1 file changed

+167
-0
lines changed

1 file changed

+167
-0
lines changed

FF-SVM.py

Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
import random
2+
import math
3+
import pandas as pd
4+
from sklearn.model_selection import LeaveOneOut
5+
from sklearn.model_selection import cross_val_score
6+
from sklearn import svm
7+
import numpy as np
8+
9+
10+
class FireflyAlgorithm():
11+
12+
def __init__(self, function):
13+
self.D = 121 # dimension of the problem (Gene number)
14+
self.NP = 100 # population size (Firefly number)
15+
self.nFES = 1 # number of function evaluations (repeate number)
16+
self.alpha = 1 # alpha parameter,(randomization parameter)
17+
self.betamin = 0.5 # beta parameter
18+
self.gamma = 1 # gamma parameter (light intensity coefficency)
19+
# sort of fireflies according to fitness value
20+
self.Index = [0] * self.NP
21+
self.Fireflies = [[np.random.rand() for i in range(self.D)] for j in range(self.NP)] # firefly agents,
22+
self.Fireflies_tmp = [[np.random.rand() for i in range(self.D)] for j in range(
23+
self.NP)] # intermediate pop
24+
self.Fitness = [0.0] * self.NP # fitness values (Accuracy)
25+
self.I = [0.0] * self.NP # light intensity
26+
self.nbest = [0.0] * self.NP # the best solution found so far
27+
self.LB = 0 # lower bound
28+
self.UB = 1 # upper bound
29+
self.fbest = None # the best
30+
self.evaluations = 0
31+
self.Fun = function
32+
33+
def alpha_new(self, a):
34+
delta = 1.0 - math.pow((math.pow(10.0, -4.0) / 0.9), 1.0 / float(a))
35+
return (1 - delta) * self.alpha
36+
37+
def sort_ffa(self): # implementation of bubble sort
38+
39+
for i in range(self.NP):
40+
self.Index[i] = i
41+
42+
for i in range(0, (self.NP - 1)):
43+
j = i + 1
44+
for j in range(j, self.NP):
45+
if (self.I[i] > self.I[j]):
46+
z = self.I[i] # exchange attractiveness
47+
self.I[i] = self.I[j]
48+
self.I[j] = z
49+
z = self.Fitness[i] # exchange fitness
50+
self.Fitness[i] = self.Fitness[j]
51+
self.Fitness[j] = z
52+
z = self.Index[i] # exchange indexes
53+
self.Index[i] = self.Index[j]
54+
self.Index[j] = z
55+
56+
57+
def replace_ffa(self): # replace the old population according to the new Index values
58+
# copy original population to a temporary area
59+
for i in range(self.NP):
60+
for j in range(self.D):
61+
self.Fireflies_tmp[i][j] = self.Fireflies[i][j]
62+
63+
# generational selection in the sense of an EA
64+
for i in range(self.NP):
65+
for j in range(self.D):
66+
self.Fireflies[i][j] = self.Fireflies_tmp[self.Index[i]][j]
67+
68+
def FindLimits(self, k):
69+
for i in range(self.D):
70+
if self.Fireflies[k][i] < self.LB:
71+
self.Fireflies[k][i] = self.LB
72+
if self.Fireflies[k][i] > self.UB:
73+
self.Fireflies[k][i] = self.UB
74+
75+
def move_ffa(self):
76+
for i in range(self.NP):
77+
scale = abs(self.UB - self.LB)
78+
for j in range(self.NP):
79+
r = 0.0
80+
for k in range(self.D):
81+
r += (self.Fireflies[i][k] - self.Fireflies[j][k]) * \
82+
(self.Fireflies[i][k] - self.Fireflies[j][k])
83+
r = math.sqrt(r)
84+
if self.I[i] > self.I[j]: # brighter and more attractive
85+
beta0 = 1.0
86+
beta = (beta0 - self.betamin) * math.exp(-self.gamma * math.pow(r, 2.0)) + self.betamin
87+
for k in range(self.D):
88+
r = random.uniform(0, 1)
89+
tmpf = self.alpha * (r - 0.5) * scale
90+
self.Fireflies[i][k] = self.Fireflies[i][
91+
k] * (1.0 - beta) + self.Fireflies_tmp[j][k] * beta + tmpf
92+
self.FindLimits(i)
93+
94+
def Run(self):
95+
while self.evaluations < self.nFES:
96+
97+
# optional reducing of alpha
98+
#self.alpha = self.alpha_new(self.nFES/self.NP)
99+
self.evaluations = self.evaluations + 1
100+
# evaluate new solutions
101+
for i in range(self.NP):
102+
self.Fitness[i] = self.Fun(self.Fireflies[i])
103+
104+
self.I[i] = self.Fitness[i]
105+
106+
107+
# ranking fireflies by their light intensit
108+
self.sort_ffa()
109+
# replace old population
110+
self.replace_ffa()
111+
# move all fireflies to the better locations
112+
self.move_ffa()
113+
114+
bestFirefly = self.Fireflies[self.NP - 1]
115+
116+
return bestFirefly
117+
118+
#File which applied
119+
file_ = "File Name: "
120+
121+
df = pd.read_excel(file_)
122+
123+
y = df['Label'].values
124+
X = df.drop('Label', axis=1).values
125+
126+
127+
def evaluation(feature_possibilities):
128+
feature_possibilities = np.round(feature_possibilities)
129+
130+
feature_possibilities = feature_possibilities > np.float32(0.5)
131+
132+
selectedX = X[:, feature_possibilities]
133+
134+
s = svm.SVC(kernel="poly", C=1)
135+
136+
loocv = LeaveOneOut()
137+
evaluation = cross_val_score(s, selectedX, y, cv=loocv)
138+
139+
return evaluation.mean()
140+
141+
Algorithm = FireflyAlgorithm(evaluation)
142+
Best = Algorithm.Run()
143+
144+
145+
a = np.round(Best)
146+
147+
feature_take_or_not = a > np.float32(0.7)
148+
149+
print(feature_take_or_not)
150+
151+
print(Best)
152+
153+
true_number = np.array(np.unique(feature_take_or_not, return_counts=True)).T
154+
155+
156+
bestX = X[:, gene_take_or_not]
157+
158+
print(true_number)
159+
160+
s = svm.SVC(kernel="linear")
161+
loocv = LeaveOneOut()
162+
evaluation = cross_val_score(s, bestX, y, cv=loocv)
163+
print("Final Accuracy: %.6f%% (%.6f%%)" % (evaluation.mean(), evaluation.std()))
164+
165+
total = ((df.drop("Label", axis=1).columns.values, gene_take_or_not, Best))
166+
167+
df2 = pd.DataFrame(total, ["Features", "Selection", "Importance"])

0 commit comments

Comments
 (0)