You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark ML中MinMaxScaler归一化数据的反归一化实现问询

如何在Spark ML中实现MinMaxScaler的反归一化操作

刚好我之前也处理过类似的需求,咱们一步步来搞定这个反归一化:

首先,你已经从训练好的MinMaxScaler中拿到了originalMin和originalMax这两个向量,第一步要把它们转成数组,这样咱们能方便地按索引对应到每个特征列:

// 将MinMaxScaler保存的min和max向量转为数组
val minArray = df_fitted.originalMin.toArray
val maxArray = df_fitted.originalMax.toArray

接下来,咱们需要对DataFrame里的每一列应用反归一化公式X_original = (X_scaled * (max - min)) + min。因为你的列是col_0到col_9,正好和minArray、maxArray的索引一一对应,所以可以用循环来批量生成反归一化后的列:

// 获取当前DataFrame的所有列名
val featureCols = df.columns

// 遍历每个列,生成对应的反归一化列
val denormalizedColumns = featureCols.zipWithIndex.map { case (colName, idx) =>
    // 获取当前列对应的min和max值,转为Spark的Literal类型
    val minVal = lit(minArray(idx))
    val maxVal = lit(maxArray(idx))
    // 应用反归一化公式,并给新列命名(比如原列名加_denorm后缀)
    (col(colName) * (maxVal - minVal) + minVal).alias(s"${colName}_denorm")
}

// 生成反归一化后的DataFrame
val denormalizedDf = df.select(denormalizedColumns: _*)

这样运行之后,denormalizedDf里的每一列就是对应原始特征的反归一化结果啦。拿你给出的第一个例子验证一下:

原col_0值:0.009069428120139292,对应min=1.0,max=804.0
计算过程:0.009069428120139292 * (804.0 - 1.0) + 1.0 ≈ 8.28275,和公式计算的结果一致。

另外,这个代码还自动处理了max == min的特殊情况(比如某个特征所有值都相同),这时候公式里max - min为0,反归一化结果直接等于min,完全符合预期。

内容的提问来源于stack exchange,提问作者diens

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:05:27