Skip to content

Latest commit

 

History

History
71 lines (62 loc) · 3.27 KB

增加一个模型.md

File metadata and controls

71 lines (62 loc) · 3.27 KB

增加一个模型

LMP目前的机器学习模型处于起步阶段,现阶段可以实现增加自己的机器学习模型到项目当中并执行,但是运行环境还没有统一解决。

增加一个模型

所谓的增加一个模型就是给LMP增加一个命令行命令和一些参数,之后就可以通过LMP启动机器学习模型,没错现在看好像并没有必要,但是后期我们的想法是通过命令行配置可以直接调用LMP提取的数据集进行训练,并尽量多的自动化。

所有的模型文件都存储于 lmp/modules 目录下,每一个模型在LMP都称为一个模块module,service.go 用于支持模块功能,不用理睬它,另一个文件 profile_cluster.go 就是用于聚类模型的对接,没错这也是模块的命名规则:

profile_xxx.go

将xxx替换为你的模型名称就可以了。

profile_cluster.go 文件是一个示例,它目前并没有对接进去真正的密度峰值聚类算法模型,只是在我的本地实现了,如果要对接就需要使用exec开启一个进程来执行,和执行插件的方法类似。

该文件你只需要复制一份,修改文件名,之后按照如下步骤修改就可以:

  1. 定义一个命令:
     var profileClusterCommand = cli.Command{
         Name:      "cluster",
         Usage:     "Density peak clustering",
         ArgsUsage: "[APP_NAME]",
         Flags: []cli.Flag{
     	        &cli.StringFlag{
     		        Name:    "data",
     		        Aliases: []string{"d"},
     		        Usage:   "specified the the dataset to run",
     		        Value:   "",
     	        },
             },
         Description: func() string {
             desc := `
                 Density peak clustering, Can be used for anomaly detection.
                     example: ./lmp cluster --model /YOUR_PATH
                     example: ./lmp cluster -m /YOUR_PATH
             `
         return desc
         }(),
         Action: clusterPeak,
    }
    按照你的要求替换 profileXXXXCommand 当中的 XXXX,然后修改Name,Usage等信息,对照着命令行显示的-h帮助信息,很容易修改。
  2. 增加init函数:
    func init() {
       if err := registerModules(&profileClusterCommand); err != nil {
             fmt.Printf("Failed to register module : %s\n", err)
             return
       }
    }
    这个init函数是用来告诉LMP你增加了什么命令,需要把第一步中定义的变量的地址写到 registerModules() 函数中,一定要记得写奥。
  3. 实现你的Action 第一步定义的命令结构的最后一行是Action,这个用于实现你增加这个命令后具体要干的事情,是一个函数的形式,Action字段是函数名,以clusterPeak为例:
    func clusterPeak(ctx *cli.Context) error {
         if ctx.NArg() > 2 {
             return fmt.Errorf("only one or zero argument required")
         }
    
         dataPath := ctx.String("data")
         fmt.Println("data path is: ", dataPath)
    
         // start a process and run your model
    
         return nil
    }
    如何获取命令行得到的参数信息?上面代码的ctx.String()就是来做这件事情的,data 就是你在第一步中增加的 StringFlag字段

之后编译代码,依次执行./lmp -h,./lmp YOUR_COMMAND -h查看吧。