news 2026/5/23 18:52:09

Flink ML K-Means 离线聚类 + 在线增量聚类(mini-batch + decayFactor)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Flink ML K-Means 离线聚类 + 在线增量聚类(mini-batch + decayFactor)

一、K-Means(离线版):有限数据上的迭代聚类

1)输入列(Input Columns)

参数名类型默认值说明
featuresColVector"features"特征向量

2)输出列(Output Columns)

参数名类型默认值说明
predictionColInteger"prediction"预测所属簇 ID(簇中心编号)

3)参数(Parameters)详解

KMeansModel(预测侧)参数
Key默认值类型说明
distanceMeasureEuclideanDistanceMeasure.NAMEString距离度量(当前支持欧式距离)
featuresCol"features"String特征列名
predictionCol"prediction"String输出列名
k2Integer簇数量(最大聚类数)
KMeans(训练侧)额外参数
Key默认值类型说明
initMode"random"String初始化方式(当前支持 random)
seednullLong随机种子(保证可复现)
maxIter20Integer最大迭代次数

4)Java 示例代码解读(离线 KMeans)

示例流程很标准:

  1. 构造输入数据(DenseVector 流)
  2. DataStream → Table,并命名为features
  3. kmeans.fit(table)训练得到KMeansModel
  4. model.transform(table)输出每条数据的簇 ID
  5. collect 打印 features + clusterId

关键代码片段:

DataStream<DenseVector>inputStream=env.fromElements(Vectors.dense(0.0,0.0),Vectors.dense(0.0,0.3),Vectors.dense(0.3,0.0),Vectors.dense(9.0,0.0),Vectors.dense(9.0,0.6),Vectors.dense(9.6,0.0));TableinputTable=tEnv.fromDataStream(inputStream).as("features");KMeanskmeans=newKMeans().setK(2).setSeed(1L);KMeansModelkmeansModel=kmeans.fit(inputTable);TableoutputTable=kmeansModel.transform(inputTable)[0];

输出打印(预测列是 Integer):

DenseVectorfeatures=(DenseVector)row.getField(kmeans.getFeaturesCol());intclusterId=(Integer)row.getField(kmeans.getPredictionCol());

二、Online K-Means:无界流上的持续聚类(mini-batch + 遗忘)

1)为什么需要 Online K-Means?

离线 KMeans 训练出来的中心是“固定”的。
但很多业务数据分布会随时间变化,例如:

  • 用户行为习惯变了
  • 商品/内容热点变化
  • 流量来源变化

这时你希望模型能“持续学习”,让聚类中心跟着数据漂移而更新,就需要 Online K-Means。

2)Online K-Means 的核心思想(mini-batch + decayFactor)

Online K-Means 基于“mini-batch KMeans”的更新规则,并加入遗忘机制(decay):

  • 每次从训练流中积累一个 mini-batch
  • 基于这个 batch 计算临时中心(estimated centroids)
  • 用加权平均更新旧中心(original centroids):

decayFactor 解释(非常关键)

  • decayFactor = 1:历史与新数据同等重要(几乎不遗忘)
  • decayFactor = 0:完全由最新数据决定中心(强遗忘)
  • 值越小 → 遗忘越强 → 模型越“跟新”
  • 值越大 → 趋于稳定 → 变化越慢

3)输入输出列(Online)

输入列同离线:

参数名类型默认值说明
featuresColVector"features"特征向量

输出列同离线:

参数名类型默认值说明
predictionColInteger"prediction"所属簇 ID

4)参数(OnlineKMeans)详解

OnlineKMeansModel(预测侧)
Key默认值类型说明
distanceMeasureEuclideanDistanceMeasure.NAMEString距离度量(欧式距离)
featuresCol"features"String特征列名
predictionCol"prediction"String输出列名
k2Integer簇数量
OnlineKMeans(训练侧)额外参数
Key默认值类型说明
batchStrategyCOUNT_STRATEGYStringmini-batch 构造策略
globalBatchSize32Integer全局 batch 大小
decayFactor0.0Double遗忘系数(历史中心贡献缩放)
seednullLong随机种子

5)Java 示例代码解读(OnlineKMeans)

示例里做了非常“演示型”的设计:训练数据分两段周期性出现,观察聚类结果如何随时间变化。

(1)训练流是无限流,周期性吐两批不同分布的数据
  • trainData1:大致在 (0~10) 附近
  • trainData2:分布跳到了 (10,100) 与 (-10,-100) 两块

这等于让数据分布发生“漂移”,你就能看到在线聚类中心被新数据影响。

(2)predict 也是周期性吐同一组预测点
List<Row>predictData=Arrays.asList(Row.of(Vectors.dense(10.0,10.0)),Row.of(Vectors.dense(-10.0,10.0)));

输出里会不停打印:

  • 两个点是否被分到同一个簇
    因为随着训练数据改变、中心改变,聚类结果可能随时间变化。
(3)初始化模型数据 initialModelData

在线聚类必须有初始中心,否则没法开始迭代。示例使用:

.setInitialModelData(KMeansModelData.generateRandomModelData(tEnv,2,2,0.0,0))

含义是:

  • k=2 个中心
  • 每个中心 2 维
  • 随机生成初始中心
(4)globalBatchSize=6:每 6 条数据更新一次中心
.setGlobalBatchSize(6)

这与训练数据每批 6 条刚好对应,便于演示“每批更新一次”的效果。

三、离线 KMeans vs 在线 OnlineKMeans:怎么选?

选离线 KMeans 的典型场景

  • 你有明确的历史数据窗口(按天、按周)
  • 模型周期性训练发布,追求稳定可控
  • 线上只是推理(transform),不希望训练影响延迟

选 OnlineKMeans 的典型场景

  • 数据持续流入且分布变化快
  • 你希望模型能持续适应新模式(概念漂移)
  • 你可以接受聚类结果随时间变化

四、实战建议(非常重要)

1)KMeans 之前强烈建议做标准化

KMeans 基于距离(欧式距离),特征尺度不同会导致“某个维度支配聚类”。典型做法:

  • VectorAssembler(拼特征)
  • StandardScaler(标准化)
  • KMeans / OnlineKMeans

2)k 的选择不要拍脑袋

常见方法:

  • 肘部法(Elbow)
  • 轮廓系数(Silhouette)
  • 结合业务可解释性(比如用户分群常选 5/8/10)

3)OnlineKMeans 的 decayFactor 是控制“跟新程度”的旋钮

简单经验:

  • 数据分布很稳定:decayFactor 接近 1
  • 数据漂移明显:decayFactor 取 0.1~0.5 让模型更灵活
  • 想快速跟随热点:decayFactor 更小

4)batch size 与更新频率要结合吞吐与稳定性

  • batch 小:更新快但抖动大
  • batch 大:更稳定但响应慢

五、小结

Flink ML 的 KMeans 家族可以覆盖绝大多数“聚类/分群”需求:

  • KMeans(离线):有限数据、迭代训练、中心稳定
  • OnlineKMeans(在线):无界流、mini-batch 更新、支持遗忘机制

掌握了k / maxIter / globalBatchSize / decayFactor这些关键参数,你就能把聚类从“demo”落到“线上可用”。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/22 1:35:53

正规式 `ab*a` 描述的是以 `a` 开头、中间有任意多个 `b`(包括零个)、最后再以 `a` 结尾的字符串,即形如 `aa`, `aba`, `abba`, `abbba`

正规式 ab*a 描述的是以 a 开头、中间有任意多个 b&#xff08;包括零个&#xff09;、最后再以 a 结尾的字符串&#xff0c;即形如 aa, aba, abba, abbba 等。在词法分析中&#xff0c;这类正规式常用于识别特定模式的标识符或关键字结构。 为了将该正规式转化为可执行的自动机…

作者头像 李华
网站建设 2026/5/9 19:44:22

解析GEO:定义、价值与忽视的代价

在数字化时代&#xff0c;地理信息已成为连接虚拟世界与现实场景的关键纽带&#xff0c;而GEO&#xff08;Geographic Information Object&#xff0c;地理信息对象&#xff09;作为地理信息应用的核心载体&#xff0c;正深刻影响着商业运营、公共服务、个人生活等多个领域。不…

作者头像 李华
网站建设 2026/5/23 0:04:37

西门子 PLC_PVC 送料配料系统控制程序画面实例分享

西门子PLC_PVC送料配料系统控制程序画面实例&#xff0c;结构采用S7-314CWincc 程序内容包括1.配料系统物料分配2.模拟量转换&#xff0c;监测压力&#xff0c;称重程序&#xff0c;3.PROFIBUS通讯系统4.配方管理程序块5.变频器&#xff08;1拖6&#xff09;控制 项目包括&…

作者头像 李华
网站建设 2026/5/10 20:21:52

探索FX5U程序框架模板(10轴):开启运动控制新征程

FX5U程序框架模板&#xff08;10轴&#xff09; 程序由老工程师费尽心力的整理&#xff0c;把控制允许整理成简单的模板架构程序。 程序讲解 1 轴的参数初始化 2 自动启动条件 3 安全条件&#xff08;台湾称许可条件&#xff0c;这个可以避免运动打架&#xff0c;很重要&#x…

作者头像 李华
网站建设 2026/5/21 16:22:58

2022最新款切条机切带机程序,开启高效切割新时代

2022最新款程序&#xff0c;切条机切带机选用中达优控定长送料触摸屏一体机程序 三菱work2编辑软件&#xff0c;能用于超声切带和热切 配有触摸屏软件 送料方式可以自由选择&#xff0c;根据实际切长的用夹手加滚筒送料&#xff0c;切短的用滚筒送料&#xff0c;任意调整切割…

作者头像 李华
网站建设 2026/5/13 22:37:17

关闭Windows自动更新的6种方法【实用指南】Win11永久关闭系统自动更新

由于微软更新策略变更&#xff0c;出厂预装系统是无法禁用更新功能的&#xff0c;在联网检测到版本较低的情况下微软将强制推送更新通知。 那么如何彻底禁止Windows 11自动更新? win11更新怎么关闭&#xff1f;windows禁止更新工具插件,Win11永久关闭更新要怎么操作&#x…

作者头像 李华