Scala 用MLlib扩展数据集

Scala 用MLlib扩展数据集,scala,apache-spark,machine-learning,apache-spark-mllib,apache-spark-ml,Scala,Apache Spark,Machine Learning,Apache Spark Mllib,Apache Spark Ml,我正在使用spark MLlib对以下数据集进行缩放: +---+--------------+ | id| features| +---+--------------+ | 0|[1.0,0.1,-1.0]| | 1| [2.0,1.1,1.0]| | 0|[1.0,0.1,-1.0]| | 1| [2.0,1.1,1.0]| | 1|[3.0,10.1,3.0]| +---+--------------+ 您可以在以下位置找到此数据集的链接: 执行标准缩放后,我得到以下

我正在使用spark MLlib对以下数据集进行缩放:

+---+--------------+
| id|      features|
+---+--------------+
|  0|[1.0,0.1,-1.0]|
|  1| [2.0,1.1,1.0]|
|  0|[1.0,0.1,-1.0]|
|  1| [2.0,1.1,1.0]|
|  1|[3.0,10.1,3.0]|
+---+--------------+
您可以在以下位置找到此数据集的链接:

执行标准缩放后,我得到以下结果:

+---+--------------+------------------------------------------------------------+
|id |features      |stdScal_06f7a85f98ef__output                                |
+---+--------------+------------------------------------------------------------+
|0  |[1.0,0.1,-1.0]|[1.1952286093343936,0.02337622911060922,-0.5976143046671968]|
|1  |[2.0,1.1,1.0] |[2.390457218668787,0.2571385202167014,0.5976143046671968]   |
|0  |[1.0,0.1,-1.0]|[1.1952286093343936,0.02337622911060922,-0.5976143046671968]|
|1  |[2.0,1.1,1.0] |[2.390457218668787,0.2571385202167014,0.5976143046671968]   |
|1  |[3.0,10.1,3.0]|[3.5856858280031805,2.3609991401715313,1.7928429140015902]  |
+---+--------------+------------------------------------------------------------+
如果我执行最小/最大缩放(设置
val minMax=new MinMaxScaler().setMin(5).setMax(10).setInputCol(“功能”)
),我会得到以下结果:

+---+--------------+-------------------------------+
| id|      features|minMaxScal_21493d63e2bf__output|
+---+--------------+-------------------------------+
|  0|[1.0,0.1,-1.0]|                  [5.0,5.0,5.0]|
|  1| [2.0,1.1,1.0]|                  [7.5,5.5,7.5]|
|  0|[1.0,0.1,-1.0]|                  [5.0,5.0,5.0]|
|  1| [2.0,1.1,1.0]|                  [7.5,5.5,7.5]|
|  1|[3.0,10.1,3.0]|               [10.0,10.0,10.0]|
+---+--------------+-------------------------------+
请查找以下代码:

// loading dataset
val scaleDF = spark.read.parquet("/data/simple-ml-scaling")
// using standardScaler
import org.apache.spark.ml.feature.StandardScaler
val ss = new StandardScaler().setInputCol("features") 
ss.fit(scaleDF).transform(scaleDF).show(false)

// using min/max scaler
import org.apache.spark.ml.feature.MinMaxScaler
val minMax = new MinMaxScaler().setMin(5).setMax(10).setInputCol("features") 
val fittedminMax = minMax.fit(scaleDF) 
fittedminMax.transform(scaleDF).show()
我知道标准化和最小/最大缩放的公式,但无法理解它是如何得出第三列中的值的,请帮助我解释其背后的数学原理。

中的Spark分别处理每个功能。根据我们的文件:

使用列摘要统计信息(也称为最小-最大规格化或重缩放),将每个特征单独重缩放到公共范围[min,max]线性

$$Rescaled(e_i)=\frac{e_i-e_{min}{e_{max}-e_{min}*(max-min)+min$$

[……]

因此,
features
数组中的每列都将单独缩放。 在这种情况下,
MinMaxScaler
的最小值设置为5,最大值设置为10

因此,每列的计算结果如下:

  • 在第一列中,最小值为1.0,最大值为3.0。我们有1.0->5.0和3.0->10.0。2.0将成为7.5
  • 在第二列中,最小值为0.1,最大值为10.1。我们有0.1->5.0和10.1->10.0。列中唯一的其他值为1.1,将变为((1.1-0.1)/(10.1-0.1))*(10.0-5.0)+5.0=5.5(遵循正常的最小-最大公式)
  • 在第三列中,最小值为-1.0,最大值为3.0。所以我们知道-1.0->5.0和3.0->10.0。1,它在中间,将变成7.5。

  • 请将显示的数据放在代码段中以提高可读性在MinMaxScaler中将最小值设置为5,将最大值设置为10。您希望得到什么值?我只是想了解导致上述输出的计算结果,我无法协调计算结果。我添加了一个答案来回答该问题。如果有什么不清楚的地方,请告诉我。