Skip to content

Commit

Permalink
Making some changes to improve speed (some ideas taken from shogun's …
Browse files Browse the repository at this point in the history
…implementation)
  • Loading branch information
helq committed Nov 9, 2017
1 parent 56816fe commit 28a3bd1
Showing 1 changed file with 15 additions and 28 deletions.
43 changes: 15 additions & 28 deletions string_kernel.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,46 +3,33 @@
# Kernel defined by Lodhi et al. (2002)
def ssk(s, t, n, lbda, accum=False):
lens, lent = len(s), len(t)
#dynamic = (-1)*np.ones( (n+1, lens, lent) )
#k_prim = (-1)*np.ones( (n+1, lens, lent) )
k_prim = np.zeros( (n, lens, lent) )
indices = { x : [i for i, e in enumerate(t) if e == x] for x in set(s) }

k_prim[0,:,:] = 1

for i in range(1,n):
for sj in range(i,lens):
toret = 0.
for tk in range(i,lent):
x = s[sj-1]
toret = lbda * k_prim[i, sj-1, tk]
for k_ in indices[x]:
if k_ >= tk:
break
toret += k_prim[i-1, sj-1, k_] * (lbda**(tk-k_+1))
k_prim[i,sj,tk] = toret
if s[sj-1]==t[tk-1]: # trick taken from shogun implemantion of SSK
toret = lbda * (toret + lbda*k_prim[i-1,sj-1,tk-1])
else:
toret *= lbda
k_prim[i,sj,tk] = toret + lbda * k_prim[i, sj-1, tk]

def k(sj, tk, n):
# print( "k({},{},{})".format(s, t, n) )
if n <= 0:
raise "Error, n must be bigger than zero"
if min(sj, tk) < n:
# print( "k({},{},{}) => 0".format(s, t, n) )
return 0.
x = s[sj-1]
toret = k(sj-1, tk, n)
for k_ in indices[x]:
if k_ >= tk:
break
toret += lbda**2 * k_prim[n-1, sj-1, k_]
# print( "k({},{},{}) => {}".format(s, t, n, toret) )
return toret

if accum:
toret = sum( k(lens, lent, i) for i in range(1, min(n,lens,lent)+1) )
else:
toret = k(lens, lent, n)
start = 0 if accum else n-1
k = 0.
for i in range(n):
for sj in range(i,lens):
for tk in range(i,lent):
if s[sj]==t[tk]:
k += lbda*lbda*k_prim[i,sj,tk]

# print( [len(list(i for (sj,tk,i) in k_prim if i==m-1)) for m in range(n)] )
return toret
return k

def string_kernel(xs, ys, n, lbda):
if len(xs.shape) != 2 or len(ys.shape) != 2 or xs.shape[1] != 1 or ys.shape[1] != 1:
Expand Down

0 comments on commit 28a3bd1

Please sign in to comment.