From 5c302a11ea3a69729c84f8d0af2a1908f44b2e33 Mon Sep 17 00:00:00 2001 From: Ross Hendrickson Date: Tue, 19 Aug 2014 20:13:26 -0500 Subject: [PATCH 1/2] Add average perceptron file Rough out logic flow for an average perceptron Fleshed out example data. Working on FixedDataGrid support. Dont use Binary use Float Update processData to use base helpers to read csv Move class to end of feature list Add test for processData process data to instances Create path fixed Add test around Fit. First steps Modified example, added tests, small fixes --- .../averageperceptionexample.go | 34 ++ examples/datasets/house-votes-84.csv | 436 ++++++++++++++++++ perceptron/average.go | 196 ++++++++ perceptron/average_test.go | 108 +++++ 4 files changed, 774 insertions(+) create mode 100644 examples/averageperceptron/averageperceptionexample.go create mode 100644 examples/datasets/house-votes-84.csv create mode 100644 perceptron/average.go create mode 100644 perceptron/average_test.go diff --git a/examples/averageperceptron/averageperceptionexample.go b/examples/averageperceptron/averageperceptionexample.go new file mode 100644 index 0000000..5c0987e --- /dev/null +++ b/examples/averageperceptron/averageperceptionexample.go @@ -0,0 +1,34 @@ +package main + +import ( + "fmt" + base "github.com/sjwhitworth/golearn/base" + evaluation "github.com/sjwhitworth/golearn/evaluation" + perceptron "github.com/sjwhitworth/golearn/perceptron" + "math/rand" +) + +func main() { + + rand.Seed(4402201) + + rawData, err := base.ParseCSVToInstances("../datasets/house-votes-84.csv", true) + if err != nil { + panic(err) + } + + //Initialises a new AveragePerceptron classifier + cls := perceptron.NewAveragePerceptron(10, 1.2, 0.5, 0.3) + + //Do a training-test split + trainData, testData := base.InstancesTrainTestSplit(rawData, 0.50) + fmt.Println(trainData) + fmt.Println(testData) + cls.Fit(trainData) + + predictions := cls.Predict(testData) + + // Prints precision/recall metrics + confusionMat := evaluation.GetConfusionMatrix(testData, predictions) + fmt.Println(evaluation.GetSummary(confusionMat)) +} diff --git a/examples/datasets/house-votes-84.csv b/examples/datasets/house-votes-84.csv new file mode 100644 index 0000000..2aac34c --- /dev/null +++ b/examples/datasets/house-votes-84.csv @@ -0,0 +1,436 @@ +v16,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,party +1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +-1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican +-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,democrat +1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,democrat +1,1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,democrat +1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,democrat +1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,democrat +1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,republican +1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican +-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,democrat +-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,republican +-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,republican +-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,democrat +-1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,1,democrat +-1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,republican +-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,republican +1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,democrat +1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,democrat +-1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,republican +1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,democrat +1,1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,democrat +1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,democrat +1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,democrat +1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,democrat +-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,democrat +1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,democrat +1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,democrat +1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,democrat +1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,republican +1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,democrat +-1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican +-1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,democrat +1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,1,democrat +1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican +1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,democrat +-1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican +1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,republican +1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,republican +-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,democrat +-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,democrat +-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,democrat +1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,democrat +1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,democrat +-1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,democrat +-1,1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,democrat +1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,democrat +-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,democrat +1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,democrat +-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican +1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,democrat +1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican +-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,democrat +-1,1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,democrat +-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,republican +1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,republican +1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +-1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,democrat +-1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican +-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,democrat +1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,democrat +1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,democrat +1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,1,-1,republican +1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,republican +-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,democrat +1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,democrat +-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,democrat +1,1,1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,-1,republican +-1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,democrat +1,1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,republican +1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,democrat +-1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,-1,democrat +-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,-1,democrat +1,-1,1,1,1,1,1,-1,1,1,1,1,1,1,1,-1,democrat +1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,1,-1,democrat +-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,republican +-1,1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,democrat +1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,democrat +1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican +-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,-1,democrat +-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican +1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,-1,democrat +-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,republican +1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,democrat +1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,democrat +1,1,1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,democrat +1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,democrat +1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,democrat +1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,democrat +1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,1,-1,democrat +1,1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,democrat +1,1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,democrat +-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,democrat +1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,democrat +-1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,democrat +-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,democrat +-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,democrat +1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,democrat +1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,republican +-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,democrat +-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,democrat +1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,democrat +1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,democrat +-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,democrat +1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,democrat +1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,democrat +1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,republican +1,-1,1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,democrat +-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican +1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,republican +1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,republican +1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,democrat +1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican +1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,1,democrat +1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,democrat +-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,democrat +-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,democrat +1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,democrat +-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican +-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,republican +1,-1,-1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,democrat +1,-1,-1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,democrat +1,1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,democrat +1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,republican +1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,1,1,-1,republican +1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,1,1,-1,republican +1,-1,1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,1,1,democrat +-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,democrat +1,-1,-1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,democrat +1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican +1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,democrat +1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,republican +1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,1,democrat +1,1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +-1,1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,democrat +1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,democrat +1,-1,-1,1,-1,-1,1,1,1,1,1,1,-1,1,1,-1,democrat +-1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican +-1,1,1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,republican +-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,1,-1,republican +-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,democrat +-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +-1,-1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,democrat +1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,democrat +1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,1,-1,democrat +1,-1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,democrat +1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,1,-1,republican +-1,1,1,-1,-1,1,1,-1,-1,-1,1,1,1,1,1,-1,democrat +-1,-1,1,1,-1,-1,1,1,1,1,1,1,-1,1,-1,1,democrat +1,1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,1,1,republican +1,1,-1,1,1,1,1,1,1,-1,1,1,1,-1,1,1,republican +-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,1,democrat +1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,democrat +-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,democrat +1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,democrat +1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,1,1,-1,democrat +-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,democrat +1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,democrat +1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,republican +1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,democrat +-1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,democrat +1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,democrat +-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,democrat +1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,democrat +1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,democrat +-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,democrat +1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,democrat +1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,democrat +1,-1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,democrat +-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,democrat +-1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,1,-1,republican +1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,democrat +-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican +-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,democrat +1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,democrat +1,-1,-1,1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,1,democrat +-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican +-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,democrat +1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,republican +-1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,democrat +-1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,democrat +1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,democrat +1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,democrat +1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,democrat +1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,democrat +1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,-1,republican +1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,-1,democrat +1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,republican +1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,republican +1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,democrat +1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,democrat +1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,democrat +1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,democrat +1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,democrat +1,1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +-1,-1,1,1,1,1,1,-1,-1,-1,1,1,1,1,1,1,democrat +-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,democrat +-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,democrat +1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,democrat +-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,democrat +-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,democrat +-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,democrat +1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,republican +-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,republican +1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican +1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,democrat +1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,democrat +1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,republican +1,-1,1,1,1,1,1,1,-1,1,1,-1,1,1,1,-1,republican +1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican +1,-1,1,-1,1,1,1,-1,-1,1,1,-1,1,1,1,-1,republican +-1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,democrat +1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +-1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,democrat +1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,republican +1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,democrat +1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,democrat +-1,1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,democrat +1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,republican +1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,1,1,-1,republican +1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,1,democrat +1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,republican +1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,democrat +1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,democrat +1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,democrat +1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,democrat +-1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,republican +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,republican +1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,democrat +-1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican +-1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican +1,1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,democrat +1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican +1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,democrat +1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,democrat +-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,republican +1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,republican +1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,democrat +1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,democrat +1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,democrat +-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,democrat +1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,democrat +-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,democrat +-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,democrat +1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,democrat +1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,republican +1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,republican +-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,democrat +1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,democrat +1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,democrat +1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,democrat +-1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,democrat +1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,republican +1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,republican +-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,democrat +-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,republican +1,-1,-1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,-1,republican +1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican +-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,democrat +-1,1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,republican +-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,republican +1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican +1,-1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,democrat +1,-1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,democrat +-1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,democrat +1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,democrat +1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,democrat +-1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,democrat +1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,democrat +1,1,-1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,democrat +1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,democrat +1,1,1,1,-1,-1,1,1,1,1,1,1,-1,1,1,1,democrat +-1,-1,1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,democrat +-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,republican +1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,1,1,republican +-1,1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,democrat +1,-1,1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,democrat +1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,democrat +1,-1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,1,-1,republican +1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,democrat +1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,republican +-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican +-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican +-1,1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,democrat +-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +1,1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,democrat +-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,1,republican +1,-1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,-1,-1,democrat +1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,democrat +1,-1,1,1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +1,-1,1,-1,1,1,1,1,1,-1,-1,1,1,1,1,1,republican +-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,republican +-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,democrat +1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,democrat +-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,democrat +-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,democrat +1,-1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,democrat +1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,democrat +-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,democrat +-1,1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,-1,democrat +-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,republican +1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,democrat +1,1,1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,democrat +1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican +1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,democrat +-1,1,-1,1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,democrat +-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,democrat +-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,democrat +1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,democrat +1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,1,democrat +-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,republican +1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,democrat +1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,democrat +1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,democrat +-1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,republican +1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,republican +1,-1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,democrat +1,-1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,democrat +1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,republican +1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,democrat +1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,1,republican +1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +-1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,1,democrat +1,-1,1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,republican +1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,democrat +1,-1,-1,1,1,1,1,1,1,1,1,-1,1,1,1,1,republican +-1,-1,1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,democrat +1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,1,1,-1,republican +1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,democrat +1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,republican +-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican +-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican +-1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,1,-1,democrat +1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +1,1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,-1,-1,democrat +-1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,democrat +1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,democrat +-1,1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,republican +1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,republican +-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,-1,democrat +-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,democrat +-1,1,1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,democrat +1,-1,1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,democrat +1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,republican +1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,democrat +-1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,democrat +-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,democrat +1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,-1,democrat +1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican +-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,democrat +1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,democrat +-1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,republican +1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican +1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican +1,1,1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,democrat +-1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,-1,democrat +-1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,democrat +1,1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,democrat +1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,democrat +-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,democrat +-1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,democrat +-1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,democrat +-1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,democrat +-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,democrat +-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,democrat +-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,democrat +1,1,1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,republican +-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,republican +1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,democrat +1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,democrat +1,1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,democrat +1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,democrat +1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,democrat +-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +-1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,republican +-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,republican +1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,republican +-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,republican +1,1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican +1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1,democrat +-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,democrat +1,1,-1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,democrat +-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican +1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,republican +1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,democrat +1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican +1,1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,-1,republican +1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,democrat +1,-1,1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,democrat +1,1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,republican +1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,-1,democrat +1,1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,democrat +1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,democrat +1,1,1,1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,republican +1,-1,1,1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,democrat +1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,democrat +1,-1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,democrat +1,-1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,1,democrat +-1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,democrat +1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,democrat +1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,1,-1,republican +1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,1,democrat +1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,1,democrat +1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,1,1,-1,republican +1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,democrat +1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,republican +1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican +-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican diff --git a/perceptron/average.go b/perceptron/average.go new file mode 100644 index 0000000..4c102ef --- /dev/null +++ b/perceptron/average.go @@ -0,0 +1,196 @@ +package perceptron + +import ( + base "github.com/sjwhitworth/golearn/base" + "math" +) + +const MaxEpochs = 10 + +type AveragePerceptron struct { + TrainingData base.FixedDataGrid + weights []float64 + edges []float64 + bias float64 + threshold float64 + learningRate float64 + trainError float64 + trained bool + count float64 +} + +type instance struct { + class string + features []float64 +} + +type instances []instance + +func (p *AveragePerceptron) updateWeights(features []float64, correction float64) { + + for i, _ := range p.weights { + fv := &features[i] + if fv != nil { + update := p.learningRate * correction * *fv + p.weights[i] = update + p.edges[i]++ + } + } + + p.average() +} + +func (p *AveragePerceptron) average() { + + for i, fcount := range p.edges { + wv := &p.weights[i] + if wv != nil { + p.weights[i] = (p.count**wv + fcount) / (fcount + 1) + } + } + p.count++ +} + +func (p *AveragePerceptron) score(datum instance) float64 { + score := 0.0 + + for i, wv := range p.weights { + score += datum.features[i] * wv + } + + if score >= p.threshold { + return 1.0 + } + return -1.0 + +} + +func (p *AveragePerceptron) Fit(trainingData base.FixedDataGrid) { + + epochs := 0 + p.trainError = 0.1 + learning := true + + data := processData(trainingData) + for learning { + for _, datum := range data { + response := p.score(datum) + expected := 0.0 + correction := expected - response + + if expected != response { + p.updateWeights(datum.features, correction) + p.trainError += math.Abs(correction) + } + } + + epochs++ + + if epochs >= MaxEpochs { + learning = false + } + } + + p.average() + p.trained = true + p.TrainingData = trainingData +} + +// param base.IFixedDataGrid +// return base.IFixedDataGrid +func (p *AveragePerceptron) Predict(what base.FixedDataGrid) base.FixedDataGrid { + + if !p.trained { + panic("Cannot call Predict on an untrained AveragePerceptron") + } + + data := processData(what) + + allAttrs := base.CheckCompatable(what, p.TrainingData) + if allAttrs == nil { + // Don't have the same Attributes + return nil + } + + // Remove the Attributes which aren't numeric + allNumericAttrs := make([]base.Attribute, 0) + for _, a := range allAttrs { + if fAttr, ok := a.(*base.FloatAttribute); ok { + allNumericAttrs = append(allNumericAttrs, fAttr) + } + } + + ret := base.GeneratePredictionVector(what) + classAttr := ret.AllClassAttributes()[0] + classSpec, err := ret.GetAttribute(classAttr) + if err != nil { + panic(err) + } + + for i, datum := range data { + result := p.score(datum) + if result > 0.0 { + ret.Set(classSpec, i, base.PackU64ToBytes(1)) + } else { + ret.Set(classSpec, 1, []byte{0, 0, 0, 0, 0, 0, 0, 0}) + } + } + + return ret +} + +func processData(x base.FixedDataGrid) instances { + _, rows := x.Size() + + result := make(instances, rows) + + // Retrieve numeric non-class Attributes + numericAttrs := base.NonClassFloatAttributes(x) + numericAttrSpecs := base.ResolveAttributes(x, numericAttrs) + + // Retrieve class Attributes + classAttrs := x.AllClassAttributes() + if len(classAttrs) != 1 { + panic("Only one classAttribute supported!") + } + + // Check that the class Attribute is categorical + // (with two values) or binary + classAttr := classAttrs[0] + if attr, ok := classAttr.(*base.CategoricalAttribute); ok { + if len(attr.GetValues()) != 2 { + panic("To many values for Attribute!") + } + } else if _, ok := classAttr.(*base.BinaryAttribute); ok { + } else { + panic("Wrong class Attribute type!") + } + + // Convert each row + x.MapOverRows(numericAttrSpecs, func(row [][]byte, rowNo int) (bool, error) { + // Allocate a new row + probRow := make([]float64, len(numericAttrSpecs)) + + // Read out the row + for i, _ := range numericAttrSpecs { + probRow[i] = base.UnpackBytesToFloat(row[i]) + } + + // Get the class for the values + class := base.GetClass(x, rowNo) + instance := instance{class, probRow} + result[rowNo] = instance + return true, nil + }) + return result +} + +func NewAveragePerceptron(features int, learningRate float64, startingThreshold float64, trainError float64) *AveragePerceptron { + + weights := make([]float64, features) + edges := make([]float64, features) + + p := AveragePerceptron{nil, weights, edges, startingThreshold, learningRate, trainError, 0.0, false, 0} + + return &p +} diff --git a/perceptron/average_test.go b/perceptron/average_test.go new file mode 100644 index 0000000..d1c9cb5 --- /dev/null +++ b/perceptron/average_test.go @@ -0,0 +1,108 @@ +package perceptron + +import ( + "fmt" + "github.com/sjwhitworth/golearn/base" + "github.com/sjwhitworth/golearn/evaluation" + "path/filepath" + "testing" +) + +func TestProcessData(t *testing.T) { + absPath, _ := filepath.Abs("../examples/datasets/house-votes-84.csv") + rawData, err := base.ParseCSVToInstances(absPath, true) + trainData, _ := base.InstancesTrainTestSplit(rawData, 0.5) + + if err != nil { + t.Fatal("Could not test processData. Could not load CSV") + } + + if rawData == nil { + t.Fatal("Could not test processData. Could not load CSV") + } + + result := processData(trainData) + _, size := trainData.Size() + + if len(result) != size { + t.Errorf("Expected %d, Got %d", size, len(result)) + } +} + +func TestFit(t *testing.T) { + + a := NewAveragePerceptron(10, 1.2, 0.5, 0.3) + + if a == nil { + + t.Errorf("Unable to create average perceptron") + } + + absPath, _ := filepath.Abs("../examples/datasets/house-votes-84.csv") + rawData, err := base.ParseCSVToInstances(absPath, true) + if err != nil { + t.Fail() + } + + trainData, _ := base.InstancesTrainTestSplit(rawData, 0.7) + a.Fit(trainData) + + if a.trained == false { + t.Errorf("Perceptron was not trained") + } + +} + +func TestPredict(t *testing.T) { + + a := NewAveragePerceptron(10, 1.2, 0.5, 0.3) + + if a == nil { + + t.Errorf("Unable to create average perceptron") + } + + absPath, _ := filepath.Abs("../examples/datasets/house-votes-84.csv") + rawData, err := base.ParseCSVToInstances(absPath, true) + if err != nil { + t.Fail() + } + + trainData, testData := base.InstancesTrainTestSplit(rawData, 0.5) + a.Fit(trainData) + + if a.trained == false { + t.Errorf("Perceptron was not trained") + } + + predictions := a.Predict(testData) + cf := evaluation.GetConfusionMatrix(testData, predictions) + fmt.Println(evaluation.GetSummary(cf)) + fmt.Println(trainData) + fmt.Println(testData) + if evaluation.GetAccuracy(cf) < 0.65 { + t.Errorf("Perceptron not trained correctly") + } +} + +func TestCreateAveragePerceptron(t *testing.T) { + + a := NewAveragePerceptron(10, 1.2, 0.5, 0.3) + + if a == nil { + + t.Errorf("Unable to create average perceptron") + } +} + +func BenchmarkFit(b *testing.B) { + + a := NewAveragePerceptron(10, 1.2, 0.5, 0.3) + absPath, _ := filepath.Abs("../examples/datasets/house-votes-84.csv") + rawData, _ := base.ParseCSVToInstances(absPath, true) + trainData, _ := base.InstancesTrainTestSplit(rawData, 0.5) + b.ResetTimer() + for i := 0; i < b.N; i++ { + a.Fit(trainData) + } +} From 04e6c8a414d96f81d159056ad65e7cc79d26c574 Mon Sep 17 00:00:00 2001 From: Richard Townsend Date: Thu, 15 Jan 2015 22:53:44 +0000 Subject: [PATCH 2/2] Rebasing against master --- examples/averageperceptron/averageperceptionexample.go | 2 +- perceptron/average.go | 2 +- perceptron/average_test.go | 6 +++++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/examples/averageperceptron/averageperceptionexample.go b/examples/averageperceptron/averageperceptionexample.go index 5c0987e..4b28991 100644 --- a/examples/averageperceptron/averageperceptionexample.go +++ b/examples/averageperceptron/averageperceptionexample.go @@ -29,6 +29,6 @@ func main() { predictions := cls.Predict(testData) // Prints precision/recall metrics - confusionMat := evaluation.GetConfusionMatrix(testData, predictions) + confusionMat, _ := evaluation.GetConfusionMatrix(testData, predictions) fmt.Println(evaluation.GetSummary(confusionMat)) } diff --git a/perceptron/average.go b/perceptron/average.go index 4c102ef..b4d0249 100644 --- a/perceptron/average.go +++ b/perceptron/average.go @@ -106,7 +106,7 @@ func (p *AveragePerceptron) Predict(what base.FixedDataGrid) base.FixedDataGrid data := processData(what) - allAttrs := base.CheckCompatable(what, p.TrainingData) + allAttrs := base.CheckCompatible(what, p.TrainingData) if allAttrs == nil { // Don't have the same Attributes return nil diff --git a/perceptron/average_test.go b/perceptron/average_test.go index d1c9cb5..f95d90c 100644 --- a/perceptron/average_test.go +++ b/perceptron/average_test.go @@ -76,7 +76,11 @@ func TestPredict(t *testing.T) { } predictions := a.Predict(testData) - cf := evaluation.GetConfusionMatrix(testData, predictions) + cf, err := evaluation.GetConfusionMatrix(testData, predictions) + if err != nil { + t.Errorf("Couldn't get confusion matrix: %s", err) + t.Fail() + } fmt.Println(evaluation.GetSummary(cf)) fmt.Println(trainData) fmt.Println(testData)