[SPARK-1260]: faster construction of features with intercept
The current implementation uses `Array(1.0, features: _*)` to construct a new array with intercept. This is not efficient for big arrays because `Array.apply` uses a for loop that iterates over the arguments. `Array.+:` is a better choice here. Also, I don't see a reason to set initial weights to ones. So I set them to zeros. JIRA: https://spark-project.atlassian.net/browse/SPARK-1260 Author: Xiangrui Meng <meng@databricks.com> Closes #161 from mengxr/sgd and squashes the following commits: b5cfc53 [Xiangrui Meng] set default weights to zeros a1439c2 [Xiangrui Meng] faster construction of features with intercept
This commit is contained in:
parent
79e547fe5a
commit
e108b9ab94
|
@ -119,7 +119,7 @@ abstract class GeneralizedLinearAlgorithm[M <: GeneralizedLinearModel]
|
|||
*/
|
||||
def run(input: RDD[LabeledPoint]) : M = {
|
||||
val nfeatures: Int = input.first().features.length
|
||||
val initialWeights = Array.fill(nfeatures)(1.0)
|
||||
val initialWeights = new Array[Double](nfeatures)
|
||||
run(input, initialWeights)
|
||||
}
|
||||
|
||||
|
@ -134,15 +134,15 @@ abstract class GeneralizedLinearAlgorithm[M <: GeneralizedLinearModel]
|
|||
throw new SparkException("Input validation failed.")
|
||||
}
|
||||
|
||||
// Add a extra variable consisting of all 1.0's for the intercept.
|
||||
// Prepend an extra variable consisting of all 1.0's for the intercept.
|
||||
val data = if (addIntercept) {
|
||||
input.map(labeledPoint => (labeledPoint.label, Array(1.0, labeledPoint.features:_*)))
|
||||
input.map(labeledPoint => (labeledPoint.label, labeledPoint.features.+:(1.0)))
|
||||
} else {
|
||||
input.map(labeledPoint => (labeledPoint.label, labeledPoint.features))
|
||||
}
|
||||
|
||||
val initialWeightsWithIntercept = if (addIntercept) {
|
||||
Array(1.0, initialWeights:_*)
|
||||
initialWeights.+:(1.0)
|
||||
} else {
|
||||
initialWeights
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue