Java面向对象期末复习:从类与对象到多态与接口的核心考点梳理
2026/9/30 4:08:09
对向量特征的每个维度 (x) 做标准化:
在 Flink ML 里,通过两个开关控制:
withMean:是否减均值(默认 false)withStd:是否除以标准差(默认 true)| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
inputCol | Vector | "input" | 待标准化的特征向量 |
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
outputCol | Vector | "output" | 标准化后的向量 |
| Key | 默认值 | 类型 | 说明 |
|---|---|---|---|
inputCol | "input" | String | 输入列名 |
outputCol | "output" | String | 输出列名 |
withMean | false | Boolean | 是否先减去均值(中心化) |
withStd | true | Boolean | 是否按标准差缩放到单位方差 |
标准用法永远是两步:
1)在训练数据上fit()学到每个维度的统计量(均值、方差/标准差)
2)用同一个StandardScalerModel对训练/预测数据transform(),保证线上线下一致
你给的示例在同一份 inputTable 上 fit + transform,演示效果更直观。
importorg.apache.flink.ml.feature.standardscaler.StandardScaler;importorg.apache.flink.ml.feature.standardscaler.StandardScalerModel;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;publicclassStandardScalerExample{publicstaticvoidmain(String[]args){StreamExecutionEnvironmentenv=StreamExecutionEnvironment.getExecutionEnvironment();StreamTableEnvironmenttEnv=StreamTableEnvironment.create(env);DataStream<Row>inputStream=env.fromElements(Row.of(Vectors.dense(-2.5,9,1)),Row.of(Vectors.dense(1.4,-5,1)),Row.of(Vectors.dense(2,-1,-2)));TableinputTable=tEnv.fromDataStream(inputStream).as("input");StandardScalerstandardScaler=newStandardScaler();// 默认 withMean=false, withStd=trueStandardScalerModelmodel=standardScaler.fit(inputTable);TableoutputTable=model.transform(inputTable)[0];for(CloseableIterator<Row>it=outputTable.execute().collect();it.hasNext();){Rowrow=it.next();DenseVectorinputValue=(DenseVector)row.getField(standardScaler.getInputCol());DenseVectoroutputValue=(DenseVector)row.getField(standardScaler.getOutputCol());System.out.printf("Input Value: %s\tOutput Value: %s\n",inputValue,outputValue);}}}这段代码做了什么:
fit():扫描 inputTable,计算每个维度的标准差(以及如果 withMean=true 则计算均值)transform():对每条向量逐维标准化,新增输出列outputStandardScaler用均值/方差,极端值仍会影响统计量,只是通常比 min/max 更稳定。
如果异常值特别多,建议先做截断/清洗,再标准化。
必须做到: