%livy.pyspark
from pyspark.mllib.regression import LabeledPoint
from pyspark.mllib.regression import LinearRegressionWithSGD
data = [LabeledPoint(float(i[0]), [float(i[1])]) for i in vddf.collect()]
lrm =LinearRegressionWithSGD.train(sc.parallelize(data),step=0.00001,iterations=10000,convergenceTol=0.00001,intercept=True)
print(lrm.weights)
print(lrm.intercept)
vddf: dataframe数据
LabeledPoint: 格式标准化
sc.parallelize(data): 转RDD数据格式
step: 步长
iterations:迭代次数
convergenceTol: 停止条件
intercept: 偏移量
LinearRegressionWithSGD很蛋疼,看源码用的是随机梯度下降,精度特别差,如果是数据源带偏移量,该偏移量大小对拟合结果影响很大,不应该出现的情况。
如果对精度要求比较高的话,可以自己写段最小二乘的代码:
import numpy as np
import pandas as pd
test=pd.read_csv("C:\\Users\\Administrator\\Desktop\\iris.csv")
ols_matrix_x=np.matrix(test.iloc[:,2:4],dtype=np.float64)
ols_matrix_y=np.matrix(test.iloc[:,1],dtype=np.float64).T
b=(ols_matrix_x.T*ols_matrix_x).I*ols_matrix_x.T*ols_matrix_y
print u"参数项矩阵为{0}".format(b)