您可以使用高斯混合模型预测组件基于训练好的高斯混合模型进行聚类预测。本文为您介绍高斯混合模型预测组件的配置方法。

使用限制

支持的计算引擎为MaxCompute和Flink。

可视化配置组件参数

PAI-Designer支持通过可视化的方式,配置组件参数。
页签 参数 描述
字段设置 向量列名 向量列对应的列名。
算法保留列名 选择算法保留的列名称。
参数设置 预测结果列名 预测结果列的列名称。
预测详细信息列名 预测详细信息列的列名。
组件多线程现成个数 组件多线程的线程个数,默认为1。
执行调优 节点个数 单个节点内存大小参数配对使用。取值为[1, 9999]的正整数。具体配置方法,详情请参见附录:如何预估资源的使用量
单个节点内存大小,单位M 取值范围为1024 MB~64*1024 MB,具体配置方法,详情请参见附录:如何预估资源的使用量

通过代码方式配置组件

您也可以通过配置代码的方式,来实现高斯混合模型训练组件的相关功能,具体配置方法如下。
  • Python代码
    df_data = pd.DataFrame([
        ["-0.6264538 0.1836433"],
        ["-0.8356286 1.5952808"],
        ["0.3295078 -0.8204684"],
        ["0.4874291 0.7383247"],
        ["0.5757814 -0.3053884"],
        ["1.5117812 0.3898432"],
        ["-0.6212406 -2.2146999"],
        ["11.1249309 9.9550664"],
        ["9.9838097 10.9438362"],
        ["10.8212212 10.5939013"],
        ["10.9189774 10.7821363"],
        ["10.0745650 8.0106483"],
        ["10.6198257 9.9438713"],
        ["9.8442045 8.5292476"],
        ["9.5218499 10.4179416"],
    ])
    
    data = BatchOperator.fromDataframe(df_data, schemaStr='features string')
    dataStream = StreamOperator.fromDataframe(df_data, schemaStr='features string')
    
    gmm = GmmTrainBatchOp() \
        .setVectorCol("features") \
        .setEpsilon(0.)
    
    model = gmm.linkFrom(data)
    
    predictor = GmmPredictBatchOp() \
        .setPredictionCol("cluster_id") \
        .setVectorCol("features") \
        .setPredictionDetailCol("cluster_detail")
    
    predictor.linkFrom(model, data).print()
    
    predictorStream = GmmPredictStreamOp(model) \
        .setPredictionCol("cluster_id") \
        .setVectorCol("features") \
        .setPredictionDetailCol("cluster_detail")
    
    predictorStream.linkFrom(dataStream).print()
    
    StreamOperator.execute()
  • Java代码
    import org.apache.flink.types.Row;
    
    import com.alibaba.alink.operator.batch.BatchOperator;
    import com.alibaba.alink.operator.batch.clustering.GmmPredictBatchOp;
    import com.alibaba.alink.operator.batch.clustering.GmmTrainBatchOp;
    import com.alibaba.alink.operator.batch.source.MemSourceBatchOp;
    import com.alibaba.alink.operator.stream.StreamOperator;
    import com.alibaba.alink.operator.stream.clustering.GmmPredictStreamOp;
    import com.alibaba.alink.operator.stream.source.MemSourceStreamOp;
    import org.junit.Test;
    
    import java.util.Arrays;
    import java.util.List;
    
    public class GmmPredictBatchOpTest {
        @Test
        public void testGmmPredictBatchOp() throws Exception {
            List <Row> df_data = Arrays.asList(
                Row.of("-0.6264538 0.1836433"),
                Row.of("-0.8356286 1.5952808"),
                Row.of("0.3295078 -0.8204684"),
                Row.of("0.4874291 0.7383247"),
                Row.of("0.5757814 -0.3053884"),
                Row.of("1.5117812 0.3898432"),
                Row.of("-0.6212406 -2.2146999"),
                Row.of("11.1249309 9.9550664"),
                Row.of("9.9838097 10.9438362"),
                Row.of("10.8212212 10.5939013"),
                Row.of("10.9189774 10.7821363"),
                Row.of("10.0745650 8.0106483"),
                Row.of("10.6198257 9.9438713"),
                Row.of("9.8442045 8.5292476"),
                Row.of("9.5218499 10.4179416")
            );
            BatchOperator <?> data = new MemSourceBatchOp(df_data, "features string");
            StreamOperator <?> dataStream = new MemSourceStreamOp(df_data, "features string");
            BatchOperator <?> gmm = new GmmTrainBatchOp()
                .setVectorCol("features")
                .setEpsilon(0.);
            BatchOperator <?> model = gmm.linkFrom(data);
            BatchOperator <?> predictor = new GmmPredictBatchOp()
                .setPredictionCol("cluster_id")
                .setVectorCol("features")
                .setPredictionDetailCol("cluster_detail");
            predictor.linkFrom(model, data).print();
            StreamOperator <?> predictorStream = new GmmPredictStreamOp(model)
                .setPredictionCol("cluster_id")
                .setVectorCol("features")
                .setPredictionDetailCol("cluster_detail");
            predictorStream.linkFrom(dataStream).print();
            StreamOperator.execute();
        }
    }

附录:如何预估资源的使用量

您可以参考以下内容,来预估资源的使用量。
  • 如何预估每个节点使用的内存大小?

    将模型的大小乘以30,即为每个节点使用的内存大小。

    例如:输入数据(模型)的大小为1 GB,则每个节点使用的内存大小可以配置为30 GB。

  • 如何预估使用的节点个数?

    由于存在通信开销,随着节点数量的增加,分布式训练任务速度会先变快,后变慢。如果您观测到训练任务随着节点数量增加之后,速度变慢,则应该停止增加节点数量。