news 2026/4/19 4:21:38

Flink ML KNN 入门基于 Table API 的近邻分类

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Flink ML KNN 入门基于 Table API 的近邻分类

1. 输入列与输出列

输入列(Input Columns)

参数名类型默认值含义
featuresColVector"features"特征向量列
labelColInteger"label"标签列(训练/评估用,也可用于对比)

输出列(Output Columns)

参数名类型默认值含义
predictionColInteger"prediction"预测标签列

说明:Flink ML 的Vector通常是DenseVectorSparseVector(特征列必须是向量类型)。

2. 参数(Parameters)

KnnModel 需要的参数

Key默认值类型必填含义
k5Integer选择最近邻的数量
featuresCol"features"String特征列名
predictionCol"prediction"String输出预测列名

Knn 额外需要的参数

Key默认值类型必填含义
labelCol"label"String标签列名

3. Java 示例代码(原理 + 流程)

下面是你贴的示例逻辑做一个“工程化解读”:

  1. 构造训练集trainTable(features, label)
  2. 构造待预测集predictTable(features, label)(这里 label 是“期望值/对照值”,不是必须列,但方便打印对比)
  3. knn.fit(trainTable)生成knnModel
  4. knnModel.transform(predictTable)输出结果表,新增prediction
  5. collect 输出并打印 features、expected、prediction

需要注意的一个坑:label 类型

文档说labelColInteger,但你贴的代码训练数据里是1.0/2.0/3.0这种Double。示例里又用:

doubleexpectedResult=(Double)row.getField(knn.getLabelCol());doublepredictionResult=(Double)row.getField(knn.getPredictionCol());

这会让人误以为 prediction 也是 Double。为了更“规范且不踩坑”,建议你在自己项目里统一 label 为Integer(或至少保持 train/predict/输出一致)。

下面我给一个“更规范版本”的示例(仅改了 label 为 Integer,并显式设置列名,逻辑不变)。

更规范的示例(建议用这个)

importorg.apache.flink.ml.classification.knn.Knn;importorg.apache.flink.ml.classification.knn.KnnModel;importorg.apache.flink.ml.linalg.DenseVector;importorg.apache.flink.ml.linalg.Vectors;importorg.apache.flink.streaming.api.datastream.DataStream;importorg.apache.flink.streaming.api.environment.StreamExecutionEnvironment;importorg.apache.flink.table.api.Table;importorg.apache.flink.table.api.bridge.java.StreamTableEnvironment;importorg.apache.flink.types.Row;importorg.apache.flink.util.CloseableIterator;publicclassKnnExample{publicstaticvoidmain(String[]args)throwsException{StreamExecutionEnvironmentenv=StreamExecutionEnvironment.getExecutionEnvironment();StreamTableEnvironmenttEnv=StreamTableEnvironment.create(env);// 训练数据:features(Vector) + label(Integer)DataStream<Row>trainStream=env.fromElements(Row.of(Vectors.dense(2.0,3.0),1),Row.of(Vectors.dense(2.1,3.1),1),Row.of(Vectors.dense(200.1,300.1),2),Row.of(Vectors.dense(200.2,300.2),2),Row.of(Vectors.dense(200.3,300.3),2),Row.of(Vectors.dense(2.8,3.2),3),Row.of(Vectors.dense(300.0,3.2),4),Row.of(Vectors.dense(2.4,3.2),5),Row.of(Vectors.dense(2.5,3.2),5));TabletrainTable=tEnv.fromDataStream(trainStream).as("features","label");// 待预测数据:这里保留 label 作为期望值/对照值(可选)DataStream<Row>predictStream=env.fromElements(Row.of(Vectors.dense(4.0,4.1),5),Row.of(Vectors.dense(300.0,42.0),2));TablepredictTable=tEnv.fromDataStream(predictStream).as("features","label");// 创建 Knn,并设置关键参数Knnknn=newKnn().setK(4).setFeaturesCol("features").setLabelCol("label").setPredictionCol("prediction");// 训练模型KnnModelknnModel=knn.fit(trainTable);// 预测TableoutputTable=knnModel.transform(predictTable)[0];// 打印结果:features + expected(label) + predictionfor(CloseableIterator<Row>it=outputTable.execute().collect();it.hasNext();){Rowrow=it.next();DenseVectorfeatures=(DenseVector)row.getField(knn.getFeaturesCol());Integerexpected=(Integer)row.getField(knn.getLabelCol());Integerprediction=(Integer)row.getField(knn.getPredictionCol());System.out.printf("Features: %-15s \tExpected: %s \tPrediction: %s\n",features,expected,prediction);}}}

4. 输出结果怎么看?

输出表一般会包含:

  • 原始输入列:features、(可选)label
  • 新增输出列:prediction

你打印时就能看到:

  • Features:待预测样本的向量
  • Expected:样本原本的标签(如果你在 predictTable 里带了 label)
  • Prediction:KNN 预测出来的标签

5. 实战建议(很关键)

1)特征缩放非常重要

KNN 完全依赖“距离”。如果你的特征尺度差异很大(比如一个特征是 0~1,另一个是 0~10000),距离会被大尺度特征主导,结果很容易失真。常见做法是:

  • 先用StandardScaler标准化
  • 或做 MinMax 归一化

2)k 的选择是个“偏差-方差”平衡

  • k 小:更敏感,容易受噪声影响(方差大)
  • k 大:更平滑,但可能把边界抹平(偏差大)

工程上建议从 3/5/7/9 这类奇数开始试(减少投票平局的概率)。

3)训练数据量大时的性能与资源

KNN 的预测开销通常和训练集规模相关(需要找近邻)。训练集很大时:

  • 可能需要索引/近似近邻(ANN)思路(具体要看 Flink ML 当前实现能力)
  • 或对数据做分桶、预聚类、抽样
  • 或考虑换更适合大规模在线推理的模型(线性模型、树模型等)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 21:27:17

AI分镜连续生成实战指南:3分钟掌握导演级镜头语言

AI分镜连续生成实战指南&#xff1a;3分钟掌握导演级镜头语言 【免费下载链接】next-scene-qwen-image-lora-2509 项目地址: https://ai.gitcode.com/hf_mirrors/lovis93/next-scene-qwen-image-lora-2509 传统分镜制作中&#xff0c;创作者常常面临镜头语言碎片化的困…

作者头像 李华
网站建设 2026/4/17 16:39:32

基于YOLO的工业级目标检测部署实战:从模型到GPU加速

基于YOLO的工业级目标检测部署实战&#xff1a;从模型到GPU加速 在一条高速运转的SMT贴片生产线上&#xff0c;每分钟有超过200块PCB板流过质检工位。传统人工目检早已无法匹配这样的节拍&#xff0c;而基于规则的传统机器视觉又难以应对焊点虚焊、元件偏移、极性反接等复杂缺陷…

作者头像 李华
网站建设 2026/4/17 8:32:57

YOLO模型训练太慢?试试我们的高性能GPU算力服务

YOLO模型训练太慢&#xff1f;试试我们的高性能GPU算力服务 在智能工厂的质检流水线上&#xff0c;一台摄像头每秒捕捉数百帧图像&#xff0c;系统需要实时识别出微小的零件缺陷。工程师们早已选定了YOLO——这个以“一次前向传播完成检测”著称的目标检测利器。但现实却令人沮…

作者头像 李华
网站建设 2026/4/16 21:07:54

3分钟解决Fiji启动缓慢:Windows用户必备优化指南

3分钟解决Fiji启动缓慢&#xff1a;Windows用户必备优化指南 【免费下载链接】fiji A "batteries-included" distribution of ImageJ :battery: 项目地址: https://gitcode.com/gh_mirrors/fi/fiji 作为图像处理领域的专业工具&#xff0c;Fiji在Windows系统上…

作者头像 李华
网站建设 2026/4/17 19:36:03

HDFS 数据块

hdfs fsck /benchmarks/TestDFSIO/io_data/test_io_0 -files -blocks/benchmarks/TestDFSIO/io_data/test_io_0 104857600 bytes, replicated: replication=3

作者头像 李华
网站建设 2026/4/18 6:16:00

YOLOv9-e-ReParam发布:重参数化技术提升GPU推理速度

YOLOv9-e-ReParam发布&#xff1a;重参数化技术提升GPU推理速度 在智能制造与边缘AI加速融合的今天&#xff0c;工业相机每秒捕捉上千帧图像已成常态。但问题也随之而来——模型精度上去了&#xff0c;产线却“等不起”推理延迟。一个典型的场景是&#xff1a;某电子元件分拣系…

作者头像 李华