DBSCAN(Density Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法。它将簇定义为密度相连的点的最大集合。把具有高密度的区域划分为簇,可以在噪声的空间数据集中发现任意形状的聚类。您可以使用DBSCAN预测组件基于DBSCAN训练模型来预测新的点数据所属的簇。本文为您介绍DBSCAN预测组件的配置方法。

使用限制

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

可视化配置组件参数

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

通过代码方式配置组件

您也可以通过配置代码的方式,来实现DBSCAN组件的相关功能,具体配置方法如下。
  • Python代码
    df = pd.DataFrame([
            ["id_1", "2.0,3.0"],
            ["id_2", "2.1,3.1"],
            ["id_3", "200.1,300.1"],
            ["id_4", "200.2,300.2"],
            ["id_5", "200.3,300.3"],
            ["id_6", "200.4,300.4"],
            ["id_7", "200.5,300.5"],
            ["id_8", "200.6,300.6"],
            ["id_9", "2.1,3.1"],
            ["id_10", "2.1,3.1"],
            ["id_11", "2.1,3.1"],
            ["id_12", "2.1,3.1"],
            ["id_16", "300.,3.2"]
    ])
    
    inOp1 = BatchOperator.fromDataframe(df, schemaStr='id string, vec string')
    inOp2 = StreamOperator.fromDataframe(df, schemaStr='id string, vec string')
    
    dbscan = DbscanBatchOp()\
        .setIdCol("id")\
        .setVectorCol("vec")\
        .setMinPoints(3)\
        .setEpsilon(0.5)\
        .setPredictionCol("pred")\
        .linkFrom(inOp1)
    
    dbscan.print()
    
    predict = DbscanPredictBatchOp()\
        .setPredictionCol("pred")\
        .linkFrom(dbscan.getSideOutput(0), inOp1)
    
    predict.print()
    
    predict = DbscanPredictStreamOp(dbscan.getSideOutput(0))\
        .setPredictionCol("pred")\
        .linkFrom(inOp2)
    
    predict.print()
    
    StreamOperator.execute()
  • Java代码
    import org.apache.flink.types.Row;
    
    import com.alibaba.alink.operator.batch.source.MemSourceBatchOp;
    import com.alibaba.alink.operator.stream.StreamOperator;
    import com.alibaba.alink.operator.stream.clustering.DbscanPredictStreamOp;
    import com.alibaba.alink.operator.batch.clustering.DbscanPredictBatchOp;
    import com.alibaba.alink.operator.batch.clustering.DbscanBatchOp;
    import com.alibaba.alink.operator.stream.source.MemSourceStreamOp;
    
    import org.junit.Test;
    
    import java.util.Arrays;
    import java.util.List;
    
    public class DbscanPredictBatchOpTest {
    
        @Test
        public void testDbscanPredictBatchop() throws Exception {
            List <Row> dataPoints = Arrays.asList(
                Row.of("id_1", "2.0,3.0"),
                Row.of("id_2", "2.1,3.1"),
                Row.of("id_3", "200.1,300.1"),
                Row.of("id_4", "200.2,300.2"),
                Row.of("id_5", "200.3,300.3"),
                Row.of("id_6", "200.4,300.4"),
                Row.of("id_7", "200.5,300.5"),
                Row.of("id_8", "200.6,300.6"),
                Row.of("id_9", "2.1,3.1"),
                Row.of("id_10", "2.1,3.1"),
                Row.of("id_11", "2.1,3.1"),
                Row.of("id_12", "2.1,3.1"),
                Row.of("id_16", "300.,3.2"));
    
            MemSourceBatchOp inOp1 = new MemSourceBatchOp(dataPoints, "id string, vec string");
            MemSourceStreamOp inOp2 = new MemSourceStreamOp(dataPoints, "id string, vec string");
    
            DbscanBatchOp dbscanBatchOp = new DbscanBatchOp()
                .setIdCol("id")
                .setVectorCol("vec")
                .setMinPoints(3)
                .setEpsilon(0.5)
                .setPredictionCol("pred")
                .linkFrom(inOp1);
            dbscanBatchOp.print();
    
            DbscanPredictBatchOp dbscanPredictBatchOp = new DbscanPredictBatchOp()
                .setPredictionCol("pred")
                .linkFrom(dbscanBatchOp.getSideOutput(0), inOp1);
            dbscanPredictBatchOp.print();
    
            DbscanPredictStreamOp dbscanPredictStreamOp = new DbscanPredictStreamOp(dbscanBatchOp.getSideOutput(0))
                .setPredictionCol("pred")
                .linkFrom(inOp2);
            dbscanPredictStreamOp.print();
            StreamOperator.execute();
        }
    }

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

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

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

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

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

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