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。
- 如何预估使用的节点个数?
由于存在通信开销,随着节点数量的增加,分布式训练任务速度会先变快,后变慢。如果您观测到训练任务随着节点数量增加之后,速度变慢,则应该停止增加节点数量。