diff --git a/examples/datasets/iris_binned.csv b/examples/datasets/iris_binned.csv index 0374d4b..ea39bd7 100644 --- a/examples/datasets/iris_binned.csv +++ b/examples/datasets/iris_binned.csv @@ -1,152 +1,151 @@ -Sepal length,Sepal width,Petal length,Petal width,Species -2,3.5,1.4,0.2,Iris-setosa -1,3,1.4,0.2,Iris-setosa -1,3.2,1.3,0.2,Iris-setosa -0,3.1,1.5,0.2,Iris-setosa -1,3.6,1.4,0.2,Iris-setosa -3,3.9,1.7,0.4,Iris-setosa -0,3.4,1.4,0.3,Iris-setosa -1,3.4,1.5,0.2,Iris-setosa -0,2.9,1.4,0.2,Iris-setosa -1,3.1,1.5,0.1,Iris-setosa -3,3.7,1.5,0.2,Iris-setosa -1,3.4,1.6,0.2,Iris-setosa -1,3,1.4,0.1,Iris-setosa -0,3,1.1,0.1,Iris-setosa -4,4,1.2,0.2,Iris-setosa -3,4.4,1.5,0.4,Iris-setosa -3,3.9,1.3,0.4,Iris-setosa -2,3.5,1.4,0.3,Iris-setosa -3,3.8,1.7,0.3,Iris-setosa -2,3.8,1.5,0.3,Iris-setosa -3,3.4,1.7,0.2,Iris-setosa -2,3.7,1.5,0.4,Iris-setosa -0,3.6,1,0.2,Iris-setosa -2,3.3,1.7,0.5,Iris-setosa -1,3.4,1.9,0.2,Iris-setosa -1,3,1.6,0.2,Iris-setosa -1,3.4,1.6,0.4,Iris-setosa -2,3.5,1.5,0.2,Iris-setosa -2,3.4,1.4,0.2,Iris-setosa -1,3.2,1.6,0.2,Iris-setosa -1,3.1,1.6,0.2,Iris-setosa -3,3.4,1.5,0.4,Iris-setosa -2,4.1,1.5,0.1,Iris-setosa -3,4.2,1.4,0.2,Iris-setosa -1,3.1,1.5,0.1,Iris-setosa -1,3.2,1.2,0.2,Iris-setosa -3,3.5,1.3,0.2,Iris-setosa -1,3.1,1.5,0.1,Iris-setosa -0,3,1.3,0.2,Iris-setosa -2,3.4,1.5,0.2,Iris-setosa -1,3.5,1.3,0.3,Iris-setosa -0,2.3,1.3,0.3,Iris-setosa -0,3.2,1.3,0.2,Iris-setosa -1,3.5,1.6,0.6,Iris-setosa -2,3.8,1.9,0.4,Iris-setosa -1,3,1.4,0.3,Iris-setosa -2,3.8,1.6,0.2,Iris-setosa -0,3.2,1.4,0.2,Iris-setosa -2,3.7,1.5,0.2,Iris-setosa -1,3.3,1.4,0.2,Iris-setosa -7,3.2,4.7,1.4,Iris-versicolor -5,3.2,4.5,1.5,Iris-versicolor -7,3.1,4.9,1.5,Iris-versicolor -3,2.3,4,1.3,Iris-versicolor -6,2.8,4.6,1.5,Iris-versicolor -3,2.8,4.5,1.3,Iris-versicolor -5,3.3,4.7,1.6,Iris-versicolor -1,2.4,3.3,1,Iris-versicolor -6,2.9,4.6,1.3,Iris-versicolor -2,2.7,3.9,1.4,Iris-versicolor -1,2,3.5,1,Iris-versicolor -4,3,4.2,1.5,Iris-versicolor -4,2.2,4,1,Iris-versicolor -5,2.9,4.7,1.4,Iris-versicolor -3,2.9,3.6,1.3,Iris-versicolor -6,3.1,4.4,1.4,Iris-versicolor -3,3,4.5,1.5,Iris-versicolor -4,2.7,4.1,1,Iris-versicolor -5,2.2,4.5,1.5,Iris-versicolor -3,2.5,3.9,1.1,Iris-versicolor -4,3.2,4.8,1.8,Iris-versicolor -5,2.8,4,1.3,Iris-versicolor -5,2.5,4.9,1.5,Iris-versicolor -5,2.8,4.7,1.2,Iris-versicolor -5,2.9,4.3,1.3,Iris-versicolor -6,3,4.4,1.4,Iris-versicolor -6,2.8,4.8,1.4,Iris-versicolor -6,3,5,1.7,Iris-versicolor -4,2.9,4.5,1.5,Iris-versicolor -3,2.6,3.5,1,Iris-versicolor -3,2.4,3.8,1.1,Iris-versicolor -3,2.4,3.7,1,Iris-versicolor -4,2.7,3.9,1.2,Iris-versicolor -4,2.7,5.1,1.6,Iris-versicolor -3,3,4.5,1.5,Iris-versicolor -4,3.4,4.5,1.6,Iris-versicolor -6,3.1,4.7,1.5,Iris-versicolor -5,2.3,4.4,1.3,Iris-versicolor -3,3,4.1,1.3,Iris-versicolor -3,2.5,4,1.3,Iris-versicolor -3,2.6,4.4,1.2,Iris-versicolor -5,3,4.6,1.4,Iris-versicolor -4,2.6,4,1.2,Iris-versicolor -1,2.3,3.3,1,Iris-versicolor -3,2.7,4.2,1.3,Iris-versicolor -3,3,4.2,1.2,Iris-versicolor -3,2.9,4.2,1.3,Iris-versicolor -5,2.9,4.3,1.3,Iris-versicolor -2,2.5,3,1.1,Iris-versicolor -3,2.8,4.1,1.3,Iris-versicolor -5,3.3,6,2.5,Iris-virginica -4,2.7,5.1,1.9,Iris-virginica -7,3,5.9,2.1,Iris-virginica -5,2.9,5.6,1.8,Iris-virginica -6,3,5.8,2.2,Iris-virginica -9,3,6.6,2.1,Iris-virginica -1,2.5,4.5,1.7,Iris-virginica -8,2.9,6.3,1.8,Iris-virginica -6,2.5,5.8,1.8,Iris-virginica -8,3.6,6.1,2.5,Iris-virginica -6,3.2,5.1,2,Iris-virginica -5,2.7,5.3,1.9,Iris-virginica -6,3,5.5,2.1,Iris-virginica -3,2.5,5,2,Iris-virginica -4,2.8,5.1,2.4,Iris-virginica -5,3.2,5.3,2.3,Iris-virginica -6,3,5.5,1.8,Iris-virginica -9,3.8,6.7,2.2,Iris-virginica -9,2.6,6.9,2.3,Iris-virginica -4,2.2,5,1.5,Iris-virginica -7,3.2,5.7,2.3,Iris-virginica -3,2.8,4.9,2,Iris-virginica -9,2.8,6.7,2,Iris-virginica -5,2.7,4.9,1.8,Iris-virginica -6,3.3,5.7,2.1,Iris-virginica -8,3.2,6,1.8,Iris-virginica -5,2.8,4.8,1.8,Iris-virginica -5,3,4.9,1.8,Iris-virginica -5,2.8,5.6,2.1,Iris-virginica -8,3,5.8,1.6,Iris-virginica -8,2.8,6.1,1.9,Iris-virginica -9,3.8,6.4,2,Iris-virginica -5,2.8,5.6,2.2,Iris-virginica -5,2.8,5.1,1.5,Iris-virginica -5,2.6,5.6,1.4,Iris-virginica -9,3,6.1,2.3,Iris-virginica -5,3.4,5.6,2.4,Iris-virginica -5,3.1,5.5,1.8,Iris-virginica -4,3,4.8,1.8,Iris-virginica -7,3.1,5.4,2.1,Iris-virginica -6,3.1,5.6,2.4,Iris-virginica -7,3.1,5.1,2.3,Iris-virginica -4,2.7,5.1,1.9,Iris-virginica -6,3.2,5.9,2.3,Iris-virginica -6,3.3,5.7,2.5,Iris-virginica -6,3,5.2,2.3,Iris-virginica -5,2.5,5,1.9,Iris-virginica -6,3,5.2,2,Iris-virginica -5,3.4,5.4,2.3,Iris-virginica -4,3,5.1,1.8,Iris-virginica - +Sepal length,Sepal width,Petal length, Petal width,Species +5.02,3.5,1.4,0.2,Iris-setosa +4.66,3,1.4,0.2,Iris-setosa +4.66,3.2,1.3,0.2,Iris-setosa +4.3,3.1,1.5,0.2,Iris-setosa +4.66,3.6,1.4,0.2,Iris-setosa +5.38,3.9,1.7,0.4,Iris-setosa +4.3,3.4,1.4,0.3,Iris-setosa +4.66,3.4,1.5,0.2,Iris-setosa +4.3,2.9,1.4,0.2,Iris-setosa +4.66,3.1,1.5,0.1,Iris-setosa +5.38,3.7,1.5,0.2,Iris-setosa +4.66,3.4,1.6,0.2,Iris-setosa +4.66,3,1.4,0.1,Iris-setosa +4.3,3,1.1,0.1,Iris-setosa +5.74,4,1.2,0.2,Iris-setosa +5.38,4.4,1.5,0.4,Iris-setosa +5.38,3.9,1.3,0.4,Iris-setosa +5.02,3.5,1.4,0.3,Iris-setosa +5.38,3.8,1.7,0.3,Iris-setosa +5.02,3.8,1.5,0.3,Iris-setosa +5.38,3.4,1.7,0.2,Iris-setosa +5.02,3.7,1.5,0.4,Iris-setosa +4.3,3.6,1,0.2,Iris-setosa +5.02,3.3,1.7,0.5,Iris-setosa +4.66,3.4,1.9,0.2,Iris-setosa +4.66,3,1.6,0.2,Iris-setosa +4.66,3.4,1.6,0.4,Iris-setosa +5.02,3.5,1.5,0.2,Iris-setosa +5.02,3.4,1.4,0.2,Iris-setosa +4.66,3.2,1.6,0.2,Iris-setosa +4.66,3.1,1.6,0.2,Iris-setosa +5.38,3.4,1.5,0.4,Iris-setosa +5.02,4.1,1.5,0.1,Iris-setosa +5.38,4.2,1.4,0.2,Iris-setosa +4.66,3.1,1.5,0.1,Iris-setosa +4.66,3.2,1.2,0.2,Iris-setosa +5.38,3.5,1.3,0.2,Iris-setosa +4.66,3.1,1.5,0.1,Iris-setosa +4.3,3,1.3,0.2,Iris-setosa +5.02,3.4,1.5,0.2,Iris-setosa +4.66,3.5,1.3,0.3,Iris-setosa +4.3,2.3,1.3,0.3,Iris-setosa +4.3,3.2,1.3,0.2,Iris-setosa +4.66,3.5,1.6,0.6,Iris-setosa +5.02,3.8,1.9,0.4,Iris-setosa +4.66,3,1.4,0.3,Iris-setosa +5.02,3.8,1.6,0.2,Iris-setosa +4.3,3.2,1.4,0.2,Iris-setosa +5.02,3.7,1.5,0.2,Iris-setosa +4.66,3.3,1.4,0.2,Iris-setosa +6.82,3.2,4.7,1.4,Iris-versicolor +6.1,3.2,4.5,1.5,Iris-versicolor +6.82,3.1,4.9,1.5,Iris-versicolor +5.38,2.3,4,1.3,Iris-versicolor +6.46,2.8,4.6,1.5,Iris-versicolor +5.38,2.8,4.5,1.3,Iris-versicolor +6.1,3.3,4.7,1.6,Iris-versicolor +4.66,2.4,3.3,1,Iris-versicolor +6.46,2.9,4.6,1.3,Iris-versicolor +5.02,2.7,3.9,1.4,Iris-versicolor +4.66,2,3.5,1,Iris-versicolor +5.74,3,4.2,1.5,Iris-versicolor +5.74,2.2,4,1,Iris-versicolor +6.1,2.9,4.7,1.4,Iris-versicolor +5.38,2.9,3.6,1.3,Iris-versicolor +6.46,3.1,4.4,1.4,Iris-versicolor +5.38,3,4.5,1.5,Iris-versicolor +5.74,2.7,4.1,1,Iris-versicolor +6.1,2.2,4.5,1.5,Iris-versicolor +5.38,2.5,3.9,1.1,Iris-versicolor +5.74,3.2,4.8,1.8,Iris-versicolor +6.1,2.8,4,1.3,Iris-versicolor +6.1,2.5,4.9,1.5,Iris-versicolor +6.1,2.8,4.7,1.2,Iris-versicolor +6.1,2.9,4.3,1.3,Iris-versicolor +6.46,3,4.4,1.4,Iris-versicolor +6.46,2.8,4.8,1.4,Iris-versicolor +6.46,3,5,1.7,Iris-versicolor +5.74,2.9,4.5,1.5,Iris-versicolor +5.38,2.6,3.5,1,Iris-versicolor +5.38,2.4,3.8,1.1,Iris-versicolor +5.38,2.4,3.7,1,Iris-versicolor +5.74,2.7,3.9,1.2,Iris-versicolor +5.74,2.7,5.1,1.6,Iris-versicolor +5.38,3,4.5,1.5,Iris-versicolor +5.74,3.4,4.5,1.6,Iris-versicolor +6.46,3.1,4.7,1.5,Iris-versicolor +6.1,2.3,4.4,1.3,Iris-versicolor +5.38,3,4.1,1.3,Iris-versicolor +5.38,2.5,4,1.3,Iris-versicolor +5.38,2.6,4.4,1.2,Iris-versicolor +6.1,3,4.6,1.4,Iris-versicolor +5.74,2.6,4,1.2,Iris-versicolor +4.66,2.3,3.3,1,Iris-versicolor +5.38,2.7,4.2,1.3,Iris-versicolor +5.38,3,4.2,1.2,Iris-versicolor +5.38,2.9,4.2,1.3,Iris-versicolor +6.1,2.9,4.3,1.3,Iris-versicolor +5.02,2.5,3,1.1,Iris-versicolor +5.38,2.8,4.1,1.3,Iris-versicolor +6.1,3.3,6,2.5,Iris-virginica +5.74,2.7,5.1,1.9,Iris-virginica +6.82,3,5.9,2.1,Iris-virginica +6.1,2.9,5.6,1.8,Iris-virginica +6.46,3,5.8,2.2,Iris-virginica +7.54,3,6.6,2.1,Iris-virginica +4.66,2.5,4.5,1.7,Iris-virginica +7.18,2.9,6.3,1.8,Iris-virginica +6.46,2.5,5.8,1.8,Iris-virginica +7.18,3.6,6.1,2.5,Iris-virginica +6.46,3.2,5.1,2,Iris-virginica +6.1,2.7,5.3,1.9,Iris-virginica +6.46,3,5.5,2.1,Iris-virginica +5.38,2.5,5,2,Iris-virginica +5.74,2.8,5.1,2.4,Iris-virginica +6.1,3.2,5.3,2.3,Iris-virginica +6.46,3,5.5,1.8,Iris-virginica +7.54,3.8,6.7,2.2,Iris-virginica +7.54,2.6,6.9,2.3,Iris-virginica +5.74,2.2,5,1.5,Iris-virginica +6.82,3.2,5.7,2.3,Iris-virginica +5.38,2.8,4.9,2,Iris-virginica +7.54,2.8,6.7,2,Iris-virginica +6.1,2.7,4.9,1.8,Iris-virginica +6.46,3.3,5.7,2.1,Iris-virginica +7.18,3.2,6,1.8,Iris-virginica +6.1,2.8,4.8,1.8,Iris-virginica +6.1,3,4.9,1.8,Iris-virginica +6.1,2.8,5.6,2.1,Iris-virginica +7.18,3,5.8,1.6,Iris-virginica +7.18,2.8,6.1,1.9,Iris-virginica +7.9,3.8,6.4,2,Iris-virginica +6.1,2.8,5.6,2.2,Iris-virginica +6.1,2.8,5.1,1.5,Iris-virginica +6.1,2.6,5.6,1.4,Iris-virginica +7.54,3,6.1,2.3,Iris-virginica +6.1,3.4,5.6,2.4,Iris-virginica +6.1,3.1,5.5,1.8,Iris-virginica +5.74,3,4.8,1.8,Iris-virginica +6.82,3.1,5.4,2.1,Iris-virginica +6.46,3.1,5.6,2.4,Iris-virginica +6.82,3.1,5.1,2.3,Iris-virginica +5.74,2.7,5.1,1.9,Iris-virginica +6.46,3.2,5.9,2.3,Iris-virginica +6.46,3.3,5.7,2.5,Iris-virginica +6.46,3,5.2,2.3,Iris-virginica +6.1,2.5,5,1.9,Iris-virginica +6.46,3,5.2,2,Iris-virginica +6.1,3.4,5.4,2.3,Iris-virginica +5.74,3,5.1,1.8,Iris-virginica diff --git a/examples/instances/instances.go b/examples/instances/instances.go index 585e581..e0c3efe 100644 --- a/examples/instances/instances.go +++ b/examples/instances/instances.go @@ -34,7 +34,7 @@ func main() { // If two decimal places isn't enough, you can update the // Precision field on any FloatAttribute - if attr, ok := rawData.GetAttr(0).(*base.FloatAttribute); !ok { + if attr, ok := rawData.AllAttributes()[0].(*base.FloatAttribute); !ok { panic("Invalid cast") } else { attr.Precision = 4 @@ -44,8 +44,15 @@ func main() { // We can update the set of Instances, although the API // for doing so is not very sophisticated. - rawData.SetAttrStr(0, 0, "1.00") - rawData.SetAttrStr(0, rawData.ClassIndex, "Iris-unusual") + + // First, have to resolve Attribute Specifications + as := base.ResolveAllAttributes(rawData, rawData.AllAttributes()) + + // Attribute Specifications describe where a given column lives + rawData.Set(as[0], 0, as[0].GetAttribute().GetSysValFromString("1.00")) + + // A SetClass method exists as a shortcut + base.SetClass(rawData, 0, "Iris-unusual") fmt.Println(rawData) // There is a way of creating new Instances from scratch. @@ -64,6 +71,21 @@ func main() { attrs[1].GetSysValFromString("A") // Now let's create the final instances set - newInst := base.NewInstancesFromRaw(attrs, 1, newData) + newInst := base.NewDenseInstances() + + // Add the attributes + newSpecs := make([]base.AttributeSpec, len(attrs)) + for i, a := range attrs { + newSpecs[i] = newInst.AddAttribute(a) + } + + // Allocate space + newInst.Extend(1) + + // Write the data + newInst.Set(newSpecs[0], 0, newSpecs[0].GetAttribute().GetSysValFromString("1.0")) + newInst.Set(newSpecs[1], 0, newSpecs[1].GetAttribute().GetSysValFromString("A")) + fmt.Println(newInst) + } diff --git a/examples/knnclassifier/knnclassifier_iris.go b/examples/knnclassifier/knnclassifier_iris.go index 5bcba27..8aa6f9a 100644 --- a/examples/knnclassifier/knnclassifier_iris.go +++ b/examples/knnclassifier/knnclassifier_iris.go @@ -12,7 +12,7 @@ func main() { if err != nil { panic(err) } - rawData.Shuffle() + //Initialises a new KNN classifier cls := knn.NewKnnClassifier("euclidean", 2) diff --git a/examples/trees/trees.go b/examples/trees/trees.go index 2244e6e..893d875 100644 --- a/examples/trees/trees.go +++ b/examples/trees/trees.go @@ -5,15 +5,15 @@ package main import ( "fmt" base "github.com/sjwhitworth/golearn/base" + ensemble "github.com/sjwhitworth/golearn/ensemble" eval "github.com/sjwhitworth/golearn/evaluation" filters "github.com/sjwhitworth/golearn/filters" - ensemble "github.com/sjwhitworth/golearn/ensemble" trees "github.com/sjwhitworth/golearn/trees" "math/rand" "time" ) -func main () { +func main() { var tree base.Classifier @@ -27,12 +27,14 @@ func main () { // Discretise the iris dataset with Chi-Merge filt := filters.NewChiMergeFilter(iris, 0.99) - filt.AddAllNumericAttributes() - filt.Build() - filt.Run(iris) + for _, a := range base.NonClassFloatAttributes(iris) { + filt.AddAttribute(a) + } + filt.Train() + irisf := base.NewLazilyFilteredInstances(iris, filt) // Create a 60-40 training-test split - trainData, testData := base.InstancesTrainTestSplit(iris, 0.60) + trainData, testData := base.InstancesTrainTestSplit(irisf, 0.60) // // First up, use ID3