package com.home.spark.ml import org.apache.spark.SparkConf import org.apache.spark.ml.feature.MaxAbsScaler import org.apache.spark.ml.linalg.Vectors import org.apache.spark.sql.SparkSession /** * @Description: 絕對值最大標准化:MaxAbsScaler * 同樣是對某一個特征操作,各特征值除以最大絕對值,因此縮放到[-1,1]之間。且不移動中心點。不會將稀疏矩陣變得稠密。 * 例如一個叫長度的特征,有三個樣本有此特征,特征向量為[-1000,100,10],最大絕對值為1000, * 轉換為[-1000/1000,100/100,10/1000]=[-1,0.1,0.01]。 * * 如果最大絕對值是一個離群點,顯然這種處理方式是很不合理的 **/ object Ex_MaxAbsScaler { def main(args: Array[String]): Unit = { val conf: SparkConf = new SparkConf(true).setMaster("local[2]").setAppName("spark ml") val spark = SparkSession.builder().config(conf).getOrCreate() val dataFrame = spark.createDataFrame(Seq( (0, Vectors.dense(1.0, 0.1, -8.0)), (1, Vectors.dense(2.0, 1.0, -4.0)), (2, Vectors.dense(4.0, 10.0, 8.0)) )).toDF("id", "features") val scaler = new MaxAbsScaler() .setInputCol("features") .setOutputCol("scaledFeatures") // Compute summary statistics and generate MaxAbsScalerModel val scalerModel = scaler.fit(dataFrame) // rescale each feature to range [-1, 1] val scaledData = scalerModel.transform(dataFrame) scaledData.select("*").show() spark.stop() } }