将结构表中的类型转换为GO中的base.FixedDataGrid

时间:2017-05-02 08:17:48

标签: mongodb go struct

我在将struct table转换为fixedDataGrid时遇到了麻烦,因为我需要将我的数据作为fixedDataGrid,以便我可以使用GoLearn lib中的机器学习方法。

我的结构是这样的:

int idx = 1;
chromeBrowser.EvaluateScriptAsync(
    string.Format(@"
        (function() {
          var i = {0};
          return i;
        })()
    ", idx)
).ContinueWith(x =>
...

所以当我从我的mongo db获取数据时,我得到这样的数据:

type dataStruct struct{
    Sepal_length string
    Sepal_width string
    Petal_length string
    Petal_width string
    Species string
}

有没有办法将我的“结果”从[] dataStruct类型转换为base.FixedDataGrid ??

CreateModel函数:

var results []dataStruct
err := col.Find(nil).All(&results)

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

base.FixedDataGridinterface,因此您需要做的是实现该接口,即实现其所有类型的方法,使用FixedDataGrid类型

由于您要使用[]dataStructdataStruct s片段(未命名类型)作为FixedDataGrid,您必须声明一个新的type dataStructList []dataStruct 键入以便能够向其添加方法,因为您只能将方法添加到命名类型。例如:

FixedDataGrid

现在,如果您查看文档,可以看到RowString接口声明了两个方法SizeDataGrid,但嵌入另一个接口,base.DataGrid接口,这意味着您还需要实现dataStructList声明的方法。因此,根据您的新func (l dataStructList) RowString(int) string { /* ... */ } func (l dataStructList) Size() (int, int) { /* ... */ } func (l dataStructList) GetAttribute(base.Attribute) (base.AttributeSpec, error) { /* ... */ } func (l dataStructList) AllAttributes() []base.Attribute { /* ... */ } func (l dataStructList) AddClassAttribute(base.Attribute) error { /* ... */ } func (l dataStructList) RemoveClassAttribute(base.Attribute) error { /* ... */ } func (l dataStructList) AllClassAttributes() []base.Attribute { /* ... */ } func (l dataStructList) Get(base.AttributeSpec, int) []byte { /* ... */ } func (l dataStructList) MapOverRows([]base.AttributeSpec, func([][]byte, int) (bool, error)) error { /* ... */ } 类型,您可以执行以下操作:

/* ... */

在您实施了dataStructList部分之后,您可以开始使用FixedDataGrid作为var results []dataStruct err := col.Find(nil).All(&results) fdg := dataStructList(results) // you can use fdg as FixedDataGrid ,这样的话:

var results dataStructList // you can use results as FixedDataGrid
err := col.Find(nil).All(&results)

或者

dataStructList

<强>更新

results上实现了所有这些方法之后,您需要的只是函数中func CreateModel(c echo.Context) error { fmt.Println("====> Entry CreateModel function") //var results []dataStruct var Success bool = false Db := db.MgoDb{} Db.Init() defer Db.Close() col := Db.C(db.TrainingDataCollection) var results dataStructList // <--- use the type that implements the interface if err := col.Find(nil).All(&results); err != nil { // <-- pass a pointer to results fmt.Println("ERROR WHILE GETTING THE TRAINING DATA") } else { //fmt.Println("Results All: ", results) Success = true } fmt.Println("=============", results) //Initialises a new KNN classifier cls := knn.NewKnnClassifier("euclidean", "linear", 2) //Do a training-test split trainData, testData := base.InstancesTrainTestSplit(results, 0.55) // <-- this will work because results if of type dataStructList, which implements the base.FixedDataGrid interface. cls.Fit(trainData) //Calculates the Euclidean distance and returns the most popular label predictions, err := cls.Predict(testData) if err != nil { panic(err) } fmt.Println(predictions) // Prints precision/recall metrics confusionMat, err := evaluation.GetConfusionMatrix(testData, predictions) if err != nil { panic(fmt.Sprintf("Unable to get confusion matrix: %s", err.Error())) } fmt.Println(evaluation.GetSummary(confusionMat)) return c.JSON(http.StatusOK, Success) } 变量的类型:

date

答案 1 :(得分:0)

以下是我解决问题的方法:实际上有一个函数InstancesFromMat64(row int, col int, matrix)而不是instances矩阵创建float64,这就是我使用的:

func CreateModel(c echo.Context) error {
    fmt.Println("====> Entry CreateModel function");
    var Success bool = false

    Db := db.MgoDb{}
    Db.Init()
    defer Db.Close()

    col := Db.C(db.TrainingDataCollection)
    var results dataStruct
    if err := col.Find(nil).All(&results); err != nil {
           fmt.Println("ERROR WHILE GETTING THE TRAINING DATA")
    } else {
           Success = true
     }

   Data := make([]float64, len(results*nbAttrs)

   /**** Filling the Data var with my dataset data *****/

   mat := mat64.NewDense(row,nbAttrs,Data)
   inst := base.InstancesFromMat64(row,nbAttrs,mat)

   //Selecting the class attribute for our instance
   attrs := inst.AllAttributes()
   inst.AddClassAttribute(attrs[4])

   //Initialise a new KNN classifier
   cls := knn.NewKnnClassifier("manhattan","linear",3)

   //Training-tessting split
   trainData, testData := base.InstancesTrainTestSplit(inst,0.7)

   /*******          Continue the Model creation                ******/

如果我的回答能帮到某人,我会很高兴。

非常感谢@mkopriva的帮助!