Kernel Functions

LA home
Computing
 Algorithms
 Bioinformatics
 FP,  λ
 Logic,  π
 MML
 Prog.Langs

FP
 Haskell
  Haskell98
   Type Classes
    Functor
    Monad
    Kernels
    ?Function?
    ?Pair?

Kernel functions in Haskell, [kernel.hs]:

module Main where           -- Some test on Kernels

-- -----------------kernels--LA--csse--Monash--.au--7/2005--
class Kernel t where
  k :: t -> t -> Double                    --kernel function
  d :: t -> t -> Double                           --distance
  d x y = sqrt( k x x  -  2 * k x y  +  k y y )    --default

-- --------------------------------------some-standard-fns--
matching x y = if x==y then 1.0 else 0.0

innerProduct2 (x1,x2)    (y1,y2)    = x1*x2 + y1*y2   -- x.y
innerProduct3 (x1,x2,x3) (y1,y2,y3) = x1*x2 + y1*y2 + x2*y3

poly l p  k x y = ( k x y + l ) ** p  --the "polynomial" kernel

normalise k x y = k x y / sqrt( k x x * k y y )

-- ----------------------------------------------instances--
instance Kernel Bool where k = matching    -- Bool

instance Kernel Int where  k = matching    -- Int

instance Kernel Char where k = matching    -- Char

instance Kernel Double where  k x y = x*y  -- Double

-- ghc doesn't like the next alternative without
-- ghc -fglasgow-exts
-- instance Kernel (Double,Double) where k = innerProduct2  -- (D,D)
-- but...
-- ghc (plain) accepts this alternative...
instance (Kernel t, Kernel u) => Kernel (t,u) where  -- pair (t,u)
  k (x1,x2) (y1,y2) = k x1 y1  +  k x2 y2

instance (Kernel t) => Kernel [t] where    -- [t], i.e. list of t
  k [] [] = 1.0
  k [] _  = 0.0
  k _  [] = 0.0
  k (x:xs) (y:ys) = 1.0 + k x y + k xs ys
  
data Coord = Coord Double Double    -- e.g. 2-D coordinates

instance Kernel Coord where            -- make up something
  k (Coord x1 x2) (Coord y1 y2) =
    normalise (poly 1.0 2 innerProduct2) (x1,x2) (y1,y2)   -- say

-- --------------------------------------------------tests--
l1 = [1::Int, 2, 3]
l2 = [1, 4]
r1 = (1.0, 2.0) :: (Double,Double)
r2 = (3.0, 4.0) :: (Double,Double)
c1 = Coord 1.0 2.0
c2 = Coord 3.0 4.0
main = putStrLn "Kernel tests, L.Allison, CSSE, Monash, .au, 7/2005"
 >> putStrLn( "[Bool] : " ++ show( k [True] [True,False] ) )
 >> putStrLn( "[Int]  : " ++
    show( [(k l1 l1, d l1 l1), (k l1 l2, d l1 l2), (k l2 l2, d l2 l2)] ) )
 >> putStrLn( "Strings: " ++
    show( [k ("John", "Smith") ("Jon", "Smythe"),
           k ("John", "Smith") ("Fred", "Bloggs") ] ) )
 >> putStrLn( "(Double,Double) : " ++
    show( [(k r1 r1, d r1 r1), (k r1 r2, d r1 r2), (k r2 r2, d r2 r2)] ) )
 >> putStrLn( "Coord  : " ++ show[ k c1 c1, k c1 c2, k c2 c2] ) 
-- ----------------------------------------------------------
-- for use with:  L.Allison, J.Func.Prog. 15(1) pp.15-32 2005
--                http://dx.doi.org/10.1017/S0956796804005301
-- ----------------------------------------------------------

for use with the [inductive programming] (artificial-intelligence / machine-learning in Haskell) project.

window on the wide world:

Computer Science Education Week

Linux
 Ubuntu
free op. sys.
OpenOffice
free office suite,
ver 3.4+

The GIMP
~ free photoshop
Firefox
web browser
FlashBlock
like it says!

Haskell:
(:) cons
[x1,...] list
[ ]list
(++) append
\ λ :-)
:: has type

© L. Allison   http://www.allisons.org/ll/   (or as otherwise indicated),
Faculty of Information Technology (Clayton), Monash University, Australia 3800 (6/'05 was School of Computer Science and Software Engineering, Fac. Info. Tech., Monash University,
was Department of Computer Science, Fac. Comp. & Info. Tech., '89 was Department of Computer Science, Fac. Sci., '68-'71 was Department of Information Science, Fac. Sci.)
Created with "vi (Linux + Solaris)",  charset=iso-8859-1,  fetched Friday, 18-Apr-2014 18:03:42 EST.