From 4fc0ed0477cf552dff32b91bd648b0998aa34eec Mon Sep 17 00:00:00 2001 From: Bert Chang Date: Fri, 2 May 2014 23:49:06 +0800 Subject: [PATCH] Add euclidean distance test. --- metrics/pairwise/euclidean.go | 7 ++++++- metrics/pairwise/euclidean_test.go | 29 +++++++++++++++++++++-------- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/metrics/pairwise/euclidean.go b/metrics/pairwise/euclidean.go index 696e93f..ff96a75 100644 --- a/metrics/pairwise/euclidean.go +++ b/metrics/pairwise/euclidean.go @@ -23,7 +23,12 @@ func (self *Euclidean) InnerProduct(vectorX *mat.DenseMatrix, vectorY *mat.Dense // We may need to create Metrics / Vector interface for this func (self *Euclidean) Distance(vectorX *mat.DenseMatrix, vectorY *mat.DenseMatrix) (float64, error) { difference, err := vectorY.MinusDense(vectorX) + + if err != nil { + return 0, err + } + result := self.InnerProduct(difference, difference) - return math.Sqrt(result), err + return math.Sqrt(result), nil } diff --git a/metrics/pairwise/euclidean_test.go b/metrics/pairwise/euclidean_test.go index 08c0d9f..14827af 100644 --- a/metrics/pairwise/euclidean_test.go +++ b/metrics/pairwise/euclidean_test.go @@ -7,27 +7,40 @@ import ( mat "github.com/skelterjohn/go.matrix" ) -func TestEuclideanInnerProduct(t *testing.T) { +func TestEuclidean(t *testing.T) { euclidean := NewEuclidean() Convey("Given two vectors", t, func() { vectorX := mat.MakeDenseMatrix([]float64{1, 2, 3}, 3, 1) - vectorY := mat.MakeDenseMatrix([]float64{3, 4, 5}, 3, 1) + vectorY := mat.MakeDenseMatrix([]float64{2, 4, 5}, 3, 1) Convey("When doing inner product", func() { result := euclidean.InnerProduct(vectorX, vectorY) - Convey("The result should be 26", func() { - So(result, ShouldEqual, 26) + Convey("The result should be 25", func() { + So(result, ShouldEqual, 25) + }) + + Convey("When dimension not match", func() { + vectorZ := mat.MakeDenseMatrix([]float64{3, 4, 5}, 1, 3) + + Convey("It should panic with Dimension mismatch", func() { + So(func() { euclidean.InnerProduct(vectorX, vectorZ) }, ShouldPanicWith, "Dimension mismatch") + }) + }) }) - Convey("When dimension not match", func() { - vectorY = mat.MakeDenseMatrix([]float64{3, 4, 5}, 1, 3) + Convey("When calculating distance", func() { + result, err := euclidean.Distance(vectorX, vectorY) - Convey("It should panic with Dimension mismatch", func() { - So(func() { euclidean.InnerProduct(vectorX, vectorY) }, ShouldPanicWith, "Dimension mismatch") + Convey("The err should be nil", func() { + So(err, ShouldBeNil) + }) + + Convey("The result should be 3", func() { + So(result, ShouldEqual, 3) }) })