Spark Mllib 回归学习笔记二(java):保序回归

来源:互联网 发布:rxjava 知乎 编辑:程序博客网 时间:2024/04/25 22:02

spark2.0.0

保序回归(isotonic regression)

保序回归属于回归算法,对于一个有限的实数集合Y表示观测相应,X集合表示未知的相应值,进行拟合找到一个最小化函数:
这里写图片描述

x是排序的,w是大于0的权重,最终函数被称为保序回归,并且是唯一的。可以看作排序限制下的最小二乘问题。

观察上面的公式,发现减数已不再是y而是x,事实上,保序回归并不假定一条函数,他是将原来的x进行调整,看下面这个动画:

Mllib支持的算法平行化保序回归,有一个参数isotonic,默认true,意为单调递增。
保序回归的结果被视为分段线性函数

预测的规则是:

  • 如果预测输入能准确匹配训练特征,那么返回相关预测,如果有多个预测匹配训练特征,那么就返回其中之一。
  • 如果预测输入比所有的训练特征低或者高,那么最低和最高的训练特征各自返回。如果有多个预测比所有的训练特征低或者高,那么都会返回。
  • 如果预测输入介于两个训练特征,那么预测会被视为分段线性函数和从最接近的训练特征中计算得到的插值。

实例

操作数据

package linear;import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaDoubleRDD;import org.apache.spark.api.java.JavaPairRDD;import org.apache.spark.api.java.JavaRDD;import org.apache.spark.api.java.JavaSparkContext;import org.apache.spark.api.java.function.Function;import org.apache.spark.api.java.function.PairFunction;import org.apache.spark.mllib.regression.IsotonicRegressionModel;import org.apache.spark.mllib.regression.LabeledPoint;import org.apache.spark.mllib.util.MLUtils;import scala.Tuple2;import scala.Tuple3;public class IsotonicRegression {    /**     * @param yinglish_     */    public static void main(String[] args) {        // TODO Auto-generated method stub        SparkConf sparkConf = new SparkConf().setAppName("Regresion").setMaster("local[*]");        JavaSparkContext jsc =  new JavaSparkContext(sparkConf);        //一、加载读取文件,转化为javaRDD        JavaRDD<LabeledPoint> data = MLUtils.loadLibSVMFile(jsc.sc(), "/home/monkeys/sample_isotonic_regression_libsvm_data.txt").toJavaRDD();        //二、操作数据,使其变成标签、特征、权重(设置为1)的输入形式        JavaRDD<Tuple3<Double, Double, Double>> parsedData = data.map(                new Function<LabeledPoint, Tuple3<Double, Double, Double>>(){                    public Tuple3<Double, Double, Double> call(LabeledPoint point){                        return new Tuple3<Double, Double, Double>(new Double(point.label()), new Double(point.features().apply(0)), 1.0);                    }                }                );        //三、把数据六四分,六成做训练集        JavaRDD<Tuple3<Double, Double, Double>>[] splits = parsedData.randomSplit(new double[]{0.6, 0.4}, 11L);        JavaRDD<Tuple3<Double, Double, Double>> training = splits[0];        JavaRDD<Tuple3<Double, Double, Double>> test = splits[1];        //四、训练模型        final IsotonicRegressionModel model = new IsotonicRegression().fit(training);        //五、计算误差        JavaPairRDD<Double, Double> predictionAndLabel = test.mapToPair(                new PairFunction<Tuple3<Double, Double, Double>, Double, Double>(){                    //@Override                    public Tuple2<Double, Double> call (Tuple3<Double, Double, Double> point){                        Double predictedLabel = model.predict(point._2());                        return new Tuple2<Double, Double>(predictedLabel, point._1());//predictedLabel是模型预测出来的标签, point._1是原始真实标签                    }                }                );        Double meanSquaredError = new JavaDoubleRDD(predictionAndLabel.map(                new Function<Tuple2<Double, Double>, Object>(){                    //@Override                    public Object call(Tuple2<Double, Double> pl){                        return Math.pow(pl._1() - pl._2(), 2);                    }                }                ).rdd()).mean();        System.out.println("Mean Squared Error = " + meanSquaredError);    }    private IsotonicRegressionModel fit(            JavaRDD<Tuple3<Double, Double, Double>> training) {        // TODO Auto-generated method stub        return null;    }}

参考资料
官方文档
原献作者博客

1 0
原创粉丝点击