LMP目前的机器学习模型处于起步阶段,现阶段可以实现增加自己的机器学习模型到项目当中并执行,但是运行环境还没有统一解决。
所谓的增加一个模型就是给LMP增加一个命令行命令和一些参数,之后就可以通过LMP启动机器学习模型,没错现在看好像并没有必要,但是后期我们的想法是通过命令行配置可以直接调用LMP提取的数据集进行训练,并尽量多的自动化。
所有的模型文件都存储于 lmp/modules
目录下,每一个模型在LMP都称为一个模块module,service.go
用于支持模块功能,不用理睬它,另一个文件 profile_cluster.go
就是用于聚类模型的对接,没错这也是模块的命名规则:
profile_xxx.go
将xxx替换为你的模型名称就可以了。
profile_cluster.go
文件是一个示例,它目前并没有对接进去真正的密度峰值聚类算法模型,只是在我的本地实现了,如果要对接就需要使用exec开启一个进程来执行,和执行插件的方法类似。
该文件你只需要复制一份,修改文件名,之后按照如下步骤修改就可以:
- 定义一个命令:
按照你的要求替换
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帮助信息,很容易修改。 - 增加init函数:
这个init函数是用来告诉LMP你增加了什么命令,需要把第一步中定义的变量的地址写到
func init() { if err := registerModules(&profileClusterCommand); err != nil { fmt.Printf("Failed to register module : %s\n", err) return } }
registerModules()
函数中,一定要记得写奥。 - 实现你的Action
第一步定义的命令结构的最后一行是Action,这个用于实现你增加这个命令后具体要干的事情,是一个函数的形式,Action字段是函数名,以clusterPeak为例:
如何获取命令行得到的参数信息?上面代码的ctx.String()就是来做这件事情的,data 就是你在第一步中增加的 StringFlag字段
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 }
之后编译代码,依次执行./lmp -h
,./lmp YOUR_COMMAND -h
查看吧。