From 6211206b73cb2857d83bc5ce2e455c45990b4b45 Mon Sep 17 00:00:00 2001 From: Bert Chang Date: Fri, 2 May 2014 21:10:55 +0800 Subject: [PATCH] Remove Metric interface, add RBFKernel. --- metrics/pairwise/pairwise.go | 5 ----- metrics/pairwise/rbf_kernel.go | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 metrics/pairwise/rbf_kernel.go diff --git a/metrics/pairwise/pairwise.go b/metrics/pairwise/pairwise.go index a256038..a8df439 100644 --- a/metrics/pairwise/pairwise.go +++ b/metrics/pairwise/pairwise.go @@ -4,11 +4,6 @@ import ( mat "github.com/skelterjohn/go.matrix" ) -type Metric interface { - InnerProduct(vectorX *mat.DenseMatrix, vectorY *mat.DenseMatrix) - Distance(vectorX *mat.DenseMatrix, vectorY *mat.DenseMatrix) -} - func CheckDimMatch(vectorX *mat.DenseMatrix, vectorY *mat.DenseMatrix) bool { if vectorX.Cols() != 1 || vectorY.Cols() != 1 || diff --git a/metrics/pairwise/rbf_kernel.go b/metrics/pairwise/rbf_kernel.go new file mode 100644 index 0000000..22d132b --- /dev/null +++ b/metrics/pairwise/rbf_kernel.go @@ -0,0 +1,33 @@ +package pairwise + +import ( + "errors" + "math" + + mat "github.com/skelterjohn/go.matrix" +) + +type RBFKernel struct { + gamma float64 +} + +func NewRBFKernel(gamma float64) *RBFKernel { + return &RBFKernel{gamma: gamma} +} + +func (self *RBFKernel) InnerProduct(vectorX *mat.DenseMatrix, vectorY *mat.DenseMatrix) (float64, error) { + if !CheckDimMatch(vectorX, vectorY) { + return 0, errors.New("Dimension mismatch") + } + + euclidean := NewEuclidean() + distance, err := euclidean.Distance(vectorX, vectorY) + + if err != nil { + return 0, err + } + + result := math.Exp(self.gamma * math.Pow(distance, 2)) + + return result, nil +}