英文:
Convert type from struct table to base.FixedDataGrid in GO
问题
我遇到了一个问题,无法将我的结构表转换为FixedDataGrid,因为我需要将我的数据转换为FixedDataGrid,以便我可以使用GoLearn库中的机器学习方法。
我的结构如下:
type dataStruct struct{
Sepal_length string
Sepal_width string
Petal_length string
Petal_width string
Species string
}
所以当我从MongoDB获取数据时,我会这样获取:
var results []dataStruct
err := col.Find(nil).All(&results)
有没有办法将我的"results"从[]dataStruct类型转换为base.FixedDataGrid类型?
CreateModel函数:
func CreateModel(c echo.Context) error {
fmt.Println("====> 进入CreateModel函数");
//var results []dataStruct
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("获取训练数据时出错")
} else {
//fmt.Println("Results All: ", results)
Success = true
}
fmt.Println("=============",results)
//初始化一个新的KNN分类器
cls := knn.NewKnnClassifier("euclidean", "linear", 2)
//进行训练集和测试集的拆分
trainData, testData := base.InstancesTrainTestSplit(results, 0.55)
cls.Fit(trainData)
//计算欧氏距离并返回最常见的标签
predictions, err := cls.Predict(testData)
if err != nil {
panic(err)
}
fmt.Println(predictions)
//打印精确度/召回率指标
confusionMat, err := evaluation.GetConfusionMatrix(testData, predictions)
if err != nil {
panic(fmt.Sprintf("无法获取混淆矩阵:%s", err.Error()))
}
fmt.Println(evaluation.GetSummary(confusionMat))
return c.JSON(http.StatusOK, Success)
}
非常感谢您的帮助!
英文:
i'm having a trouble converting my struct table to fixedDataGrid, because i need my data to be a fixedDataGrid so that i can use machine learning methods from GoLearn lib.
My struct is like this:
type dataStruct struct{
Sepal_length string
Sepal_width string
Petal_length string
Petal_width string
Species string
}
So when i get my data from my mongo db, i get them like this:
var results []dataStruct
err := col.Find(nil).All(&results)
Is there a way to convert my "results" from []dataStruct type to base.FixedDataGrid ??
CreateModel function:
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 dataStruct
if err := col.Find(nil).All(results); err != nil {
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)
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)
}
Thank you in advance for your help !
答案1
得分: 1
这是我解决问题的方法:实际上有一个函数InstancesFromMat64(row int, col int, matrix)
,它可以从一个float64
矩阵创建instances
,这就是我使用的方法:
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 ******/
// 这里是你的代码,我只翻译了之前的部分
I'll be glad if my answer helps someone.
Thanks a lot @mkopriva for your help !
希望我的回答对某人有所帮助。
非常感谢 @mkopriva 的帮助!
英文:
Here is how i solved the issue: Actually there is a function InstancesFromMat64(row int, col int, matrix)
than creates instances
from a float64
matrix, and this is what i used:
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 ******/
I'll be glad if my answer helps someone.
Thanks a lot @mkopriva for your help !
答案2
得分: 0
base.FixedDataGrid 是一个接口,所以你需要实现该接口,也就是在你想要用作 FixedDataGrid
的类型上实现它的所有方法。
由于你想要使用 []dataStruct
,也就是 dataStruct
的切片,它是一个无名类型,作为 FixedDataGrid
,你需要声明一个新的类型来添加方法,因为你只能给命名类型添加方法。例如像这样:
type dataStructList []dataStruct
现在,如果你查看文档,你会发现 FixedDataGrid
接口声明了两个方法 RowString
和 Size
,但它还嵌入了另一个接口,即 base.DataGrid 接口,这意味着你还需要实现 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) // 你可以将 fdg 用作 FixedDataGrid
或者
var results dataStructList // 你可以将 results 用作 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 // <--- 使用实现了接口的类型
if err := col.Find(nil).All(&results); err != nil { // <-- 传递 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) // <-- 这将起作用,因为 results 的类型是 dataStructList,它实现了 base.FixedDataGrid 接口。
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)
}
英文:
base.FixedDataGrid is an interface
, so what you need to do is to implement that interface, that is, implement all of its methods, on the type you want to use as FixedDataGrid
.
Since you want to use []dataStruct
, a slice of dataStruct
s, which is an unnamed type, as FixedDataGrid
you will have to declare a new type to be able to add methods to it because you can add methods only to named types. For example something like this:
type dataStructList []dataStruct
Now, if you take a look at the documentation, you can see that the FixedDataGrid
interface declares two methods RowString
and Size
but also embeds another interface, the base.DataGrid interface, which means you need to implement the methods declared by DataGrid
as well. So, given your new dataStructList
type, you can do something like this:
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 { /* ... */ }
After you've implemented the /* ... */
parts you can then start using dataStructList
as a FixedDataGrid
, so something like this:
var results []dataStruct
err := col.Find(nil).All(&results)
fdg := dataStructList(results) // you can use fdg as FixedDataGrid
Or
var results dataStructList // you can use results as FixedDataGrid
err := col.Find(nil).All(&results)
Update:
After you've implemented all of those methods on the dataStructList
all you need is the type of the results
variable inside your function:
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)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论