我在将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)
提前感谢您的帮助!
答案 0 :(得分:0)
base.FixedDataGrid是interface
,因此您需要做的是实现该接口,即实现其所有类型的方法,使用FixedDataGrid
类型
由于您要使用[]dataStruct
,dataStruct
s片段(未命名类型)作为FixedDataGrid
,您必须声明一个新的type dataStructList []dataStruct
键入以便能够向其添加方法,因为您只能将方法添加到命名类型。例如:
FixedDataGrid
现在,如果您查看文档,可以看到RowString
接口声明了两个方法Size
和DataGrid
,但嵌入另一个接口,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的帮助!