Scala 使用Spark MLlib的线性回归仅返回单调预测

Scala 使用Spark MLlib的线性回归仅返回单调预测,scala,apache-spark,linear-regression,apache-spark-mllib,Scala,Apache Spark,Linear Regression,Apache Spark Mllib,检查问题底部的更新信息 小结:我有一个数据集,它的行为不是线性的。我试图使用Spark的MLlib(v1.5.2)来拟合一个更像多项式函数的模型,但结果总是得到一个线性模型。我不知道是否不可能用线性回归得到一个非线性模型 [TL;DR]我正在尝试拟合一个模型,该模型充分反映了以下数据: 我的代码非常简单(非常像每个教程中的代码) 得到的结果在正确的范围内,但它们总是在单调递增的线上。我正试着用我的头去绕它,但我不明白为什么没有更好的曲线拟合 有什么建议吗 谢谢大家 更新 问题是由我们正在使用的

检查问题底部的更新信息

小结:我有一个数据集,它的行为不是线性的。我试图使用Spark的MLlib(v1.5.2)来拟合一个更像多项式函数的模型,但结果总是得到一个线性模型。我不知道是否不可能用线性回归得到一个非线性模型

[TL;DR]我正在尝试拟合一个模型,该模型充分反映了以下数据:

我的代码非常简单(非常像每个教程中的代码)

得到的结果在正确的范围内,但它们总是在单调递增的线上。我正试着用我的头去绕它,但我不明白为什么没有更好的曲线拟合

有什么建议吗

谢谢大家

更新
问题是由我们正在使用的spark和spark ml库的版本引起的。出于某种原因,尽管我提供了更多的特性(输入数据的平方或立方版本),但版本1.5.2并没有拟合出更好的曲线。升级到2.0.0版并从主API(而非RDD API)的已弃用的
LinearRegressionWithSGD
切换到
LinearRegression
后,该算法表现出了预期的性能。用这种新方法,模型拟合出了正确的曲线。

这里没有什么意外。你使用线性模型的形式

Y = βx + ε
因此,拟合结果将始终形成一条穿过原点的线(与例如R不同,默认情况下Spark不拟合截距),只要模型至少稍微正常,它就应该增加到数据的近似分布

虽然StackOverflow的细节可能与主题无关,但您应该从添加更多功能开始。很明显,这里合适的近似值必须是二次的,所以让我们一步一步来说明。我们将从非常粗略的数据近似值开始:

y <- c(0.6, 0.6, 0.6, 0.6, 0.575, 0.55, 0.525, 0.475, 0.45, 0.40, 0.35, 0.30)
df <- data.frame(y=c(y, rev(y)), x=0:23)
plot(df$x, df$y)

谢谢@zero323,尽管我们找到了问题的根源,但您为我们指出了正确的方向。因此,我将把你的答案标为正确答案。我将把真正的问题发布在问题的更新上。
y <- c(0.6, 0.6, 0.6, 0.6, 0.575, 0.55, 0.525, 0.475, 0.45, 0.40, 0.35, 0.30)
df <- data.frame(y=c(y, rev(y)), x=0:23)
plot(df$x, df$y)
lm1 <- lm(y ~ x + 0, df)
lines(df$x, predict(lm1, df), col='red')
lm2 <- lm(y ~ x, df)
lines(df$x, predict(lm2, df), col='blue')
df$x2 <- df$x ** 2
lm3 <- lm(y ~ x + x2, df)
lines(df$x, predict(lm3, df), col='green')
val x = arts(2).toDouble
LabeledPoint(parts(1).toDouble, Vectors.dense(x, x*x))