机器学习之线性回归值预测算法
一、 线性回归
什么是回归:从大量的函数结果和自变量反推回函数表达式的过程就是回归。线性回归是利用数理统计中回归分析来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。——主要是解决值预测的问题
一元线性回归:只包括一个自变量(x1)和一个因变量(y),且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。公式:
多元线性回归:如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归分析。公式:
对于一元线性回归公式来说,如果给定两组x,y的值,就可以求得和的值。两点确定一条直线,可以确定和的值。w0我们可以叫做一元线性回归公式的截距,w1可以叫做一元线性回归公式的斜率。
总结:
二、 确定权重的值(确定模型)
当误差公式: 取得最小值时,能确定一条完美的直线,也就是确定一组 值与自变量的关系,拟合出来的一条直线能尽可能的通过更多的点。确定了error的最小值,也就有可能确定一组值。
如何确定error的最小值?
如果将error函数看成自变量关于error的函数,那么可以转换为:
如果将一组权重看成一列向量,表示一列维度组成的向量,就是这组向量的转置。那么现在的问题就是如何找到一组,使得error的值最小。我们可以看出error函数的关系图像大概是一个开口向上的图像,那么当error的导数为0时,此时能得到一组的值对应的error的值最小。
通过求导的方式,理论上可以确定error的最小值,但是由于是一组数据,无法确定error最小下对应的这一组权重 。正向的求导不能得到一组权重值,就不能确定线性回归的公式。那么可以根据数据集来穷举法反向的试,来确定线性回归的公式。
如何反向穷举法求得线性回归的公式(训练线性回归模型)?
已知有线性回归关系的训练数据,已知线性回归的公式:
已知误差函数公式: 要求得在error最小下的一组权重值,以便确定线性回归的公式。我们要确定的这组就是要确定一个模型。确定模型就是确定一组参数,就是确定这组的值。
穷举之前,会有一个初始模型,一般是随机数,假设=1,=1,=1…,有了初始模型那么针对每一条训练数据都能求得一个真实值与模型评估值的平方差,也就是针对一组测试数据,能得到在这组初始模型下error误差函数的值。那么得到的error值是不是最小值?需要不断调节初始模型参数,需要在训练模型时,指定调节初始模型,,…的调节步长step(也叫学习率),迭代去求出每次调节模型后的error值,由于error的值不可能绝对的达到0(如果达到0说明训练出来的模型对应的线性回归公式完全的将所有训练数据集的点穿过),在训练模型之前指定一个最小error值,即:当迭代求出模型的error误差值小于指定的error值就停止迭代,那么当前这组值就是确定好的模型。
如果每次迭代求得模型对应的error大于指定的最小error值,要继续调节这组值,一直迭代到模型的error值小于指定的error值。
三、梯度下降法调节参数
假设和error的函数关系中只有一个维度,那么这个关系其实就是和error的关系,反应图上就是一维平面关系,如果中有两个维度和,那么这个反映到图上就是个三维空间关系,以此类推。
如果中只有一个维度,如下图:
图中①,②,③,④,⑤,⑥,⑦都是图像的切线(斜率),在切点处可以求得对应的error值,如何调节模型得到一组值可以使得到的error值更小,如图,沿着①->②->③方向调节和沿着④->⑤->⑥方向调节,可以使error值更小,这种沿着斜率绝对值减少的方向,沿着梯度的负方向每次迭代调节的方法就叫做梯度下降法。
梯度下降是迭代法的一种,可以用于求解最小二乘问题,在求解error函数的最小值时,可以通过梯度下降法来一步步的迭代求解,得到最小化的error函数和模型参数值。每次按照步长(学习率)来调节值,迭代求出error的最小值,这里的error不可能有一个固定的最小值,只会向着最小值的方向收敛。
判断模型error误差值收敛,也就是停止迭代的两种方式:
- 指定一个error值,当迭代处理过程中得到的error值小于指定的值时,停止迭代。
- 设置迭代次数,当迭代次数达到设置的次数时,停止迭代。
迭代周期:从调整参数开始到计算出error值判断是否大于用户指定的error是一个迭代周期。
当步长比较小时,迭代次数多,训练模型的时间比较长,当步长比较大时,有可能迭代的次数也比较多,训练模型的时间也会相对比较长,需要找到一个合适的步长。
四、Spark Mllib 线性回归案例
package com.bjsxt.lrimport org.apache.log4j.{Level, Logger}
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.mllib.regression.LinearRegressionWithSGD
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.rdd.RDDobject LinearRegression {def main(args: Array[String]) {// 构建Spark对象val conf = new SparkConf().setAppName("LinearRegressionWithSGD").setMaster("local")val sc = new SparkContext(conf)Logger.getRootLogger.setLevel(Level.WARN)// sc.setLogLevel("WARN")//读取样本数据val data = sc.textFile("lpsa.data")val examples: RDD[LabeledPoint] = data.map { line =>val parts = line.split(',')val y = parts(0)val xs = parts(1)//特征值组成向量LabeledPoint(parts(0).toDouble, Vectors.dense(parts(1).split(' ').map(_.toDouble)))}// 二八分,一部分训练,一部分测试val train2TestData = examples.randomSplit(Array(0.8, 0.2), 1L)/** 迭代次数* 训练一个多元线性回归模型收敛(停止迭代)条件:* 1、error值小于用户指定的error值* 2、达到一定的迭代次数*/val numIterations = 100//在每次迭代的过程中 梯度下降算法的下降步长大小 0.1 0.2 0.3 0.4val stepSize = 1val miniBatchFraction = 1val lrs = new LinearRegressionWithSGD()//让训练出来的模型有w0参数,就是有截距lrs.setIntercept(true)//设置步长lrs.optimizer.setStepSize(stepSize)//设置迭代次数lrs.optimizer.setNumIterations(numIterations)//每一次下山后,是否计算所有样本的误差值,1代表所有样本,默认就是1.0lrs.optimizer.setMiniBatchFraction(miniBatchFraction)val model = lrs.run(train2TestData(0))println(model.weights)println(model.intercept)// 对样本进行测试val prediction = model.predict(train2TestData(1).map(_.features))val predictionAndLabel = prediction.zip(train2TestData(1).map(_.label))val print_predict = predictionAndLabel.take(20)println("prediction" + "\t" + "label")for (i <- 0 to print_predict.length - 1) {println(print_predict(i)._1 + "\t" + print_predict(i)._2)}// 计算测试集平均误差val loss = predictionAndLabel.map {case (p, v) =>val err = p - vMath.abs(err)}.reduce(_ + _)val error = loss / train2TestData(1).countprintln("Test RMSE = " + error)// 模型保存// val ModelPath = "model"// model.save(sc, ModelPath)// val sameModel = LinearRegressionModel.load(sc, ModelPath)sc.stop()}
}
运行结果:
2019-09-25 10:13:55 WARN LinearRegressionWithSGD:66 - The input data was not directly cached, which may hurt performance if its parent RDDs are also uncached.
[0.7296067051590363,0.23094665849041549,-0.1359562285885802,0.19004800201024025,0.2745413011485292,-0.31515879010131637,-0.04672248486523373,0.30883491480399367]
2.4764583366071977
2019-09-25 10:13:55 WARN ClosureCleaner:66 - Expected a closure; got com.bjsxt.lr.LinearRegression$$$Lambda$14/410033330
2019-09-25 10:13:55 WARN ClosureCleaner:66 - Expected a closure; got com.bjsxt.lr.LinearRegression$$$Lambda$15/1472031375
prediction label
1.749456972317874 0.3715636
1.8633537772490665 1.3480731
2.6325111666721064 1.7137979
2.3720657017536393 1.8484548
1.011168768081166 2.0476928
2.6730070097763634 2.5533438
3.011702574063707 2.7180005
2.2693119088733686 2.8063861
2.4416666667211793 2.8419982
3.1092859129401047 2.9626924
3.3123201208597277 3.2752562
2.6098535244026935 3.5876769
2019-09-25 10:13:55 WARN ClosureCleaner:66 - Expected a closure; got com.bjsxt.lr.LinearRegression$$$Lambda$19/1958375413
2019-09-25 10:13:55 WARN ClosureCleaner:66 - Expected a closure; got com.bjsxt.lr.LinearRegression$$$Lambda$20/652268444
Test RMSE = 0.5736895056295152Process finished with exit code 0
机器学习之线性回归值预测算法相关推荐
- 机器学习-多元线性回归(Multiple Regression)算法
学习彭亮<深度学习基础介绍:机器学习>课程 与简单线性回归区别 简单线性回归:一个自变量(x) 多元线性回归:多个自变量(x) 多元回归模型 y=β0+β1x1+β2x2+ - +βpxp ...
- 机器学习——利用K-均值聚类算法对未标注数据分组
聚类是一种无监督的学习,它将相似的对象归到同一簇中.它有点像全自动分类.聚类方法几乎可以应用到所有对象,簇内的对象越相似,聚类的效果越好. K-均值(K-means)聚类算法,之所以称之为K-均值是因 ...
- 毕业设计-基于机器学习的短期负荷预测算法
目录 前言 课题背景和意义 实现技术思路 一.电力负荷预测 二.典型负荷预测算法 实现效果图样例 最后 前言
- 【机器学习】线性回归之预测商品的销售额
目录 情境: 一.读取数据 二.分析数据 1.热度图 heatmap() 2.散点图 三.特征集和标签集 1.学会查看数据 2.拆分训练集和测试集 四.线性回归 五.开始预测 六.评价测度 七.模拟效 ...
- 基于RBF网络的信任值预测算法matlab仿真实现
·目录 一.理论基础 二.核心程序 三.测试结果 一.理论基础 测试的数据集有三种趋势型(trend),周期型(seasonal)还有混乱型的(noisy data).三种类型要做训练集增加的测试(i ...
- python 预测算法_通过机器学习的线性回归算法预测股票走势(用Python实现)
本文转自博客园,作者为hsm_computer 原文链接:https://www.cnblogs.com/JavaArchitect/p/11717998.html在笔者的新书里,将通过股票案例讲述P ...
- 通过机器学习的线性回归算法预测股票走势(用Python实现)
在本人的新书里,将通过股票案例讲述Python知识点,让大家在学习Python的同时还能掌握相关的股票知识,所谓一举两得.这里给出以线性回归算法预测股票的案例,以此讲述通过Python的sklearn ...
- python计算股票趋势_通过机器学习的线性回归算法预测股票走势(用Python实现)...
1 波士顿房价数据分析 安装好Python的Sklearn库后,在安装包下的路径中就能看到描述波士顿房价的csv文件,具体路径是"python安装路径\Lib\site-packages\s ...
- python天气预测算法_使用机器学习预测天气(第二部分)
概述 这篇文章我们接着前一篇文章,使用Weather Underground网站获取到的数据,来继续探讨用机器学习的方法预测内布拉斯加州林肯市的天气 上一篇文章我们已经探讨了如何收集.整理.清洗数据. ...
最新文章
- Sonic 开源移动端云真机测试平台 - windows系统下的sonic快速部署演示
- java的多态性学习代码
- 【转】oracle number与java中long、int的对应
- .NET SDK-Style 项目(Core、Standard、.NET5)中的版本号
- php的range函数
- mongoose如何发送html页面,Mongoose/Express/Nodejs尝试从服务器到html传递变量
- JEB 无源码调试 以dvm smali字节码方式,Demo尝试
- note_maven的概念,作用
- 如何测量太阳距离地球的距离
- 介绍Angular的注入服务
- 大话程序猿眼里的高并发架构
- java lock -----锁
- SPSS -正态检验
- 计算机仿真类的论文,最新计算机仿真参考文献 计算机仿真专著类参考文献有哪些...
- 计算机删除默认共享怎样操作,清除windows默认共享方法
- 计算机软考高级 天津落户,官宣:软考高级可作为高级职称人才引进落户上海...
- 软件是一种艺术,汽车是一种工程
- windows 10 系统LCM通信库的编译
- numpy取数组中的行和列
- 基于kinect的人体动作识别系统(算法和代码都放出)