Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Spark ML矢量汇编程序返回奇怪的输出_Scala_Apache Spark_Apache Spark Mllib_Apache Spark Ml - Fatal编程技术网

Scala Spark ML矢量汇编程序返回奇怪的输出

Scala Spark ML矢量汇编程序返回奇怪的输出,scala,apache-spark,apache-spark-mllib,apache-spark-ml,Scala,Apache Spark,Apache Spark Mllib,Apache Spark Ml,我在VectorAssembler中遇到了一种非常奇怪的行为,我想知道是否有其他人见过这种情况 我的情况很简单。我解析来自CSV文件的数据,其中有一些标准的Int和Double字段,我还计算一些额外的列。我的解析函数返回以下内容: val joined = countPerChannel ++ countPerSource //two arrays of Doubles joined (label, orderNo, pageNo, Vectors.dense(joinedCounts)) M

我在
VectorAssembler
中遇到了一种非常奇怪的行为,我想知道是否有其他人见过这种情况

我的情况很简单。我解析来自
CSV
文件的数据,其中有一些标准的
Int
Double
字段,我还计算一些额外的列。我的解析函数返回以下内容:

val joined = countPerChannel ++ countPerSource //two arrays of Doubles joined
(label, orderNo, pageNo, Vectors.dense(joinedCounts))
My main函数使用如下解析函数:

val parsedData = rawData.filter(row => row != header).map(parseLine)
val data = sqlContext.createDataFrame(parsedData).toDF("label", "orderNo", "pageNo","joinedCounts")
val assembler = new VectorAssembler()
                           .setInputCols(Array("orderNo", "pageNo", "joinedCounts"))
                           .setOutputCol("features")

val assemblerData = assembler.transform(data)
[3.2,17.0,15.0,[0.0,0.0,0.0,0.0,3.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,4.0,0.0,0.0,2.0]]
然后我使用
矢量汇编程序
,如下所示:

val parsedData = rawData.filter(row => row != header).map(parseLine)
val data = sqlContext.createDataFrame(parsedData).toDF("label", "orderNo", "pageNo","joinedCounts")
val assembler = new VectorAssembler()
                           .setInputCols(Array("orderNo", "pageNo", "joinedCounts"))
                           .setOutputCol("features")

val assemblerData = assembler.transform(data)
[3.2,17.0,15.0,[0.0,0.0,0.0,0.0,3.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,4.0,0.0,0.0,2.0]]
因此,当我在数据进入
矢量汇编程序之前打印一行数据时,它看起来如下所示:

val parsedData = rawData.filter(row => row != header).map(parseLine)
val data = sqlContext.createDataFrame(parsedData).toDF("label", "orderNo", "pageNo","joinedCounts")
val assembler = new VectorAssembler()
                           .setInputCols(Array("orderNo", "pageNo", "joinedCounts"))
                           .setOutputCol("features")

val assemblerData = assembler.transform(data)
[3.2,17.0,15.0,[0.0,0.0,0.0,0.0,3.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,4.0,0.0,0.0,2.0]]
在使用VectorAssembler的转换函数后,我打印同一行数据,并得到以下结果:

[3.2,(18,[0,1,6,9,14,17],[17.0,15.0,3.0,1.0,4.0,2.0])]

到底发生了什么事?
矢量汇编程序做了什么?我已经仔细检查了所有的计算,甚至遵循了简单的Spark示例,看不出我的代码有什么问题。你能吗

输出没有什么奇怪的。你的向量似乎有很多零元素,因此
spark
使用了它的稀疏表示

进一步解释:

看起来你的向量是由18个元素(维度)组成的

向量中的索引
[0,1,6,9,14,17]
包含按顺序排列的非零元素
[17.0,15.0,3.0,1.0,4.0,2.0]

稀疏向量表示是一种节省计算空间的方法,因此计算更容易、更快。更多关于稀疏表示的信息

现在当然可以将稀疏表示转换为密集表示,但这需要付出代价


如果您对获取特征重要性感兴趣,那么我建议您查看一下。

我可以更改吗?另外,我正在使用线性回归算法,希望获取每个输入的系数。这种稀疏表示法会使获得这些系数变得更困难吗?它不会使获得这些系数更困难。你可以将稀疏向量转换为稠密向量,因为我相信它只是一个向量输出,在索引和元素之间有一个简单的映射。我在手机上,我现在无法编码,但这是一段单行代码。非常感谢你澄清这一点。所以当我得到我的系数输出时,我会得到每个输入的所有系数吗?或者我会得到一个不同的代表?