对 Spark ML 和 Tensorflow 的线性回归结果感到困惑
Puzzled by Linear Regression Results from Spark ML and Tensorflow
我在上面程序的第 55 行之后添加了 "print("w=", W.eval(), "b=", b.eval())"。我得到的结果是:
w= [[ 3.5245235 ]
[ 1.50171268]] b= 1.14499
所以 y=3.5245235x1 + 1.50171268x2 +1.14499。
我使用了和上面程序相同的数据(文件格式稍后附上),运行程序https://github.com/apache/spark/blob/master/examples/src/main/java/org/apache/spark/examples/ml/JavaLinearRegressionWithElasticNetExample.java
结果是:
系数:[0.3827266230806965,5.1690760222564425]截距:82.22008153614573
迭代次数:6
目标历史:[0.5,0.41583549697777683,0.15548328325638935,0.15439025905767773,0.15432368309706285,0.15432368309449543]
所以 y=0.3827266230806965x1+5.1690760222564425x2 + 82.22008153614573.
我很困惑为什么同样的问题结果会如此不同?我用Spark程序的数据格式是:
354 1:84 2:46
190 1:73 2:20
405 1:65 2:52
263 1:70 2:30
451 1:76 2:57
302 1:69 2:25
288 1:63 2:28
385 1:72 2:36
402 1:79 2:57
365 1:75 2:44
209 1:27 2:24
290 1:89 2:31
346 1:65 2:52
254 1:57 2:23
395 1:59 2:60
434 1:69 2:48
220 1:60 2:34
374 1:79 2:51
308 1:75 2:50
220 1:82 2:34
311 1:59 2:46
181 1:67 2:23
274 1:85 2:37
303 1:55 2:40
244 1:63 2:30
答案很简单,spark模型不是线性回归。
线性回归最小化|| y - Wx ||_2^2
Spark 模型是弹性网络,它最小化了 || y - Wx ||_2^2
+ a1 || W ||_2^2 + a2 || W ||_1
如果您希望此 spark 代码是线性回归 删除 正则化项:
.setRegParam(0.3)
.setElasticNetParam(0.8);
并增加迭代次数以确保收敛。
参见 。代码有同样的问题。修复将与那里的答案相同。另外,learning_rate 太小了(设置为 .001),步数需要为 100000。选择这些初始值是非常有技术性的(一位专家和我谈过这个)。
我在上面程序的第 55 行之后添加了 "print("w=", W.eval(), "b=", b.eval())"。我得到的结果是:
w= [[ 3.5245235 ] [ 1.50171268]] b= 1.14499
所以 y=3.5245235x1 + 1.50171268x2 +1.14499。
我使用了和上面程序相同的数据(文件格式稍后附上),运行程序https://github.com/apache/spark/blob/master/examples/src/main/java/org/apache/spark/examples/ml/JavaLinearRegressionWithElasticNetExample.java 结果是:
系数:[0.3827266230806965,5.1690760222564425]截距:82.22008153614573 迭代次数:6 目标历史:[0.5,0.41583549697777683,0.15548328325638935,0.15439025905767773,0.15432368309706285,0.15432368309449543]
所以 y=0.3827266230806965x1+5.1690760222564425x2 + 82.22008153614573.
我很困惑为什么同样的问题结果会如此不同?我用Spark程序的数据格式是:
354 1:84 2:46
190 1:73 2:20
405 1:65 2:52
263 1:70 2:30
451 1:76 2:57
302 1:69 2:25
288 1:63 2:28
385 1:72 2:36
402 1:79 2:57
365 1:75 2:44
209 1:27 2:24
290 1:89 2:31
346 1:65 2:52
254 1:57 2:23
395 1:59 2:60
434 1:69 2:48
220 1:60 2:34
374 1:79 2:51
308 1:75 2:50
220 1:82 2:34
311 1:59 2:46
181 1:67 2:23
274 1:85 2:37
303 1:55 2:40
244 1:63 2:30
答案很简单,spark模型不是线性回归。
线性回归最小化|| y - Wx ||_2^2
Spark 模型是弹性网络,它最小化了 || y - Wx ||_2^2 + a1 || W ||_2^2 + a2 || W ||_1
如果您希望此 spark 代码是线性回归 删除 正则化项:
.setRegParam(0.3)
.setElasticNetParam(0.8);
并增加迭代次数以确保收敛。
参见