离线轻量级大数据平台Spark之MLib机器学习库线性回归实例
1、线性回归
线性回归是利用称为线性回归方程的函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析方法,只有一个自变量的情况称为简单回归,大于一个自变量情况的叫做多元回归,在实际情况中大多数都是多元回归。
线性回归(Linear Regression)问题属于监督学习(Supervised Learning)范畴,又称分类(Classification)或归纳学习(Inductive Learning)。这类分析中训练数据集中给出的数据类型是确定的。机器学习的目标是,对于给定的一个训练数据集,通过不断的分析和学习产生一个联系属性集合和类标集合的分类函数(Classification Function)或预测函数)Prediction Function),这个函数称为分类模型(Classification Model——或预测模型(Prediction Model)。通过学习得到的模型可以是一个决策树、规格集、贝叶斯模型或一个超平面。通过这个模型可以对输入对象的特征向量预测或对对象的类标进行分类。
回归问题中通常使用最小二乘(Least Squares)法来迭代最优的特征中每个属性的比重,通过损失函数(Loss Function)或错误函数(Error Function)定义来设置收敛状态,即作为梯度下降算法的逼近参数因子。
实例中给出了如何导入训练集数据,将其解析为带标签点的RDD,然后使用了LinearRegressionWithSGD 算法来建立一个简单的线性模型来预测标签的值,最后计算了均方差来评估预测值与实际值的吻合度。
线性回归分析的整个过程可以简单描述为如下三个步骤:
寻找合适的预测函数,即上文中的 h(x) ,用来预测输入数据的判断结果。这个过程是非常关键的,需要对数据有一定的了解或分析,知道或者猜测预测函数的“大概”形式,比如是线性函数还是非线性函数,若是非线性的则无法用线性回归来得出高质量的结果。
构造一个Loss函数(损失函数),该函数表示预测的输出(h)与训练数据标签之间的偏差,可以是二者之间的差(h-y)或者是其他的形式(如平方差开方)。综合考虑所有训练数据的“损失”,将Loss求和或者求平均,记为 J(θ) 函数,表示所有训练数据预测值与实际类别的偏差。
显然, J(θ) 函数的值越小表示预测函数越准确(即h函数越准确),所以这一步需要做的是找到 J(θ) 函数的最小值。找函数的最小值有不同的方法,Spark中采用的是梯度下降法(stochastic gradient descent,SGD)。
2、Java开发
Java开发上,引入spark-mllib_2.11-2.0.1.jar、spark-mllib-local_2.11-2.0.1.jar、spark-catalyst_2.11-2.0.1.jar。
参考spark的example案例的代码,输出sklr.jar包并提交执行。
bin/spark-submit --class sk.mlib.LinearRegressionWithSGDDemo --master local /tmp/sklr.jar
代码如下:
package sk.mlib;import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
import scala.Tuple2;
import org.apache.spark.api.java.JavaDoubleRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.mllib.linalg.Vectors;
import org.apache.spark.mllib.regression.LabeledPoint;
import org.apache.spark.mllib.regression.LinearRegressionModel;
import org.apache.spark.mllib.regression.LinearRegressionWithSGD;public class LinearRegressionWithSGDDemo {public static void main(String[] args) {SparkConf conf = new SparkConf().setAppName("LinearRegressionWithSGDDemo");JavaSparkContext sc = new JavaSparkContext(conf);sc.setLogLevel("OFF");//关闭日志输出,方便查看输出结果// Load and parse the dataString path = "/tmp/lpsa.data";JavaRDD<String> data = sc.textFile(path);JavaRDD<LabeledPoint> parsedData = data.map(new Function<String, LabeledPoint>() {public LabeledPoint call(String line) {String[] parts = line.split(",");String[] features = parts[1].split(" ");double[] v = new double[features.length];for (int i = 0; i < features.length - 1; i++) {v[i] = Double.parseDouble(features[i]);}//打印map结果System.out.println(Double.parseDouble(parts[0])+"|"+Vectors.dense(v));return new LabeledPoint(Double.parseDouble(parts[0]), Vectors.dense(v));}});parsedData.cache();// Building the modelint numIterations = 100;double stepSize = 0.00000001;final LinearRegressionModel model =LinearRegressionWithSGD.train(JavaRDD.toRDD(parsedData), numIterations, stepSize);// Evaluate model on training examples and compute training errorJavaRDD<Tuple2<Double, Double>> valuesAndPreds = parsedData.map(new Function<LabeledPoint, Tuple2<Double, Double>>() {public Tuple2<Double, Double> call(LabeledPoint point) {double prediction = model.predict(point.features());//打印预测结果System.out.println(prediction+"|"+point.label());return new Tuple2<>(prediction, point.label());}});double MSE = new JavaDoubleRDD(valuesAndPreds.map(new Function<Tuple2<Double, Double>, Object>() {public Object call(Tuple2<Double, Double> pair) {//打印偏差结果System.out.println(pair._1()+":"+pair._2()+"|"+Math.pow(pair._1() - pair._2(), 2.0));return Math.pow(pair._1() - pair._2(), 2.0);}}).rdd()).mean();System.out.println("training Mean Squared Error = " + MSE);// Save and load modelmodel.save(sc.sc(), "/tmp/LinearRegressionWithSGDModel");LinearRegressionModel sameModel = LinearRegressionModel.load(sc.sc(), "/tmp/LinearRegressionWithSGDModel");sc.stop();}
}
/*执行结果:* training Mean Squared Error = 7.451032827699878*/
3、测试数据,在/spark-2.0.1-bin-hadoop2.7/data/mllib/ridge-data/lpsa.data
离线轻量级大数据平台Spark之MLib机器学习库线性回归实例相关推荐
- 离线轻量级大数据平台Spark之MLib机器学习库Word2Vec实例
Word2Vecword2vec能将文本中出现的词向量化,可以在捕捉语境信息的同时压缩数据规模.Word2Vec实际上是两种不同的方法:Continuous Bag of Words (CBOW) 和 ...
- 离线轻量级大数据平台Spark之MLib机器学习库TF-IDF实例
TF-IDF(termfrequency–inverse document frequency)是TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度.字词的 ...
- 离线轻量级大数据平台Spark之MLib机器学习库SVM实例
支持向量机,因其英文名为support vector machine,故一般简称SVM,通俗来讲,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终 ...
- 离线轻量级大数据平台Spark之MLib机器学习库概念学习
Mlib机器学习库 1.1机器学习概念 机器学习有很多定义,倾向于下面这个定义.机器学习是对能通过经验自动改进的计算机算法的研究.机器学习依赖数据经验并评估和优化算法所运行出的模型.机器学习算法尝试根 ...
- 离线轻量级大数据平台Spark之MLib机器学习库朴素贝叶斯实例
1.朴素贝叶斯介绍 表示事件B已经发生的前提下,事件A发生的概率,叫做事件B发生下事件A的条件概率,公式为: 贝叶斯定理: 从已知P(A|B)获得P(B|A)值. 假设A和B代表两类互相影响的事件,如 ...
- 离线轻量级大数据平台Spark之MLib机器学习库聚类算法KMeans实例
1.KMeans算法 所谓聚类问题,就是给定一个元素集合D,其中每个元素具有n个可观察属性,使用某种算法将D划分成k个子集,要求每个子集内部的元素之间相异度尽可能低,而不同子集的元素相异度尽可能高.其 ...
- 离线轻量级大数据平台Spark之MLib机器学习协同过滤ALS实例
1.协同过滤 协同过滤(Collaborative Filtering,简称CF,WIKI上的定义是:简单来说是利用某个兴趣相投.拥有共同经验之群体的喜好来推荐感兴趣的资讯给使用者,个人透过合作的机制 ...
- 离线轻量级大数据平台Spark之单机部署及Java开发
1.Spark平台基本介绍 Spark 由加州大学伯克利分校 AMP 实验室 (Algorithms, Machines, and PeopleLab) 开发,可用来构建大型的.低延迟的数据分析应用程 ...
- 离线轻量级大数据平台Spark之JavaRDD关联join操作
对两个RDD进行关联操作,如: 1)文件post_data.txt包含:post_id\title\content 2)文件train.txt包含:dev_id\post_id\praise\time ...
最新文章
- Linux命令基础--uname
- mysql ssl_cipher_mysql添加用户:出现Field 'ssl_cipher' doesn't have a defa
- 计算机组装与维修单元卷,计算机组装与维修期中考试试卷及答案
- 51 NOD 1049 最大子段和 动态规划 模板 板子 DP
- JBoss BPM Travel Agency演示与现代BPM数据集成
- ZOj 2104——Let the Balloon Rise
- 【blockly教程】第五章 循环结构
- js判断复选框是否被选中
- Centos 启用网卡出现 no link present. Check cable
- 诗词文中的地名(名人生卒地、生卒年、名人籍贯)
- python装饰器详解-python装饰器的详细解析
- matlab2016一条命令设置坐标轴标签旋转角度、字体大小和字体!
- 计算思维在计算机科学中的应用,计算思维在离散数学中的应用.pdf
- 基于java(springboot框架)的购物商城系统 开题报告
- tomcat7中get请求中文乱码问题
- Word2010专项试题(1)
- 详解Java中Comparable和Comparator接口的区别
- Swift —— Moya和高阶函数
- 由国内媒体的“非典”报道看信息生态问题-引文
- RabbitMQ入门其一:环境搭建和Hello World