java 向量化计算_机器学习代码实战

本文介绍了如何使用Java语言构建线性回归模型,以解决水泥质量预测问题。通过线性回归的基本概念、最小二乘法和梯度下降,详细讲解了模型训练过程,包括特征缩放、向量化计算和模型训练与测试。最终得到一个预测水泥质量的线性回归模型,展示了模型的预测效果和参数优化的重要性。
摘要由CSDN通过智能技术生成

概述

线性回归是机器学习的最基本算法,本文向读者介绍了线性回归的原理和使用,以及如何通过Java语言编写线性回归的模型代码。并且以水泥质量预测为例构造出一个水泥质量预测模型。还通过线性回归介绍了机器学习的基本概念,如回归、最小二乘法和梯度下降等。本文可以作为机器学习甚至是深度学习的入门文章。

要解决的问题

本文将使用一批水泥成分的样本数据(附件中的 ConcreteTable.csv 文件),让程序学习这些样本数据,来得到一个较好的水泥质量预测模型。下面的表 1 中 摘取了一小部分这些水泥样本数据:

表1. 部分水泥样本数据

08077a566f7a3fec0b2aca5114b09f53.png

表 1 中 ,每行是一个样本,1-7 列是每立方米混合物中各个成分的重量(单位:千克),第 8 列是已使用天数,第 9 列 是该行水泥样本的强度(单位:MPa)。前 8 列 是水泥的输入属性,最后 1 列是输出,我们要让机器学习这些样本后得到一个模型,这个模型可以输入样本表格之外的数据,预测出水泥的强度。一般这个模型会对应一个公式,可以通过机器学习中很多算法实现,如线性回归,神经网络等,由于这个问题相对较为简单,所以我们通过最基本的线性回归算法来实现,后续文章中会介绍通过神经网络等算法来解决稍微复杂的问题。

线性回归模型

线性回归简介

首先我们简单介绍下线性回归(Linear Regression),线性回归是假设特证属性之间满足线性关系,利用数理统计中回归分析,即根据给定的样本数据训练,来确定两种或两种以上特征属性与输出属性之间的相互依赖关系并得出一个线性模型的分析方法。

如图 1 所示,以平面点为例,如果有 N 个样本点,线性回归算法就是求一条曲线 y =h(x)。使得各点到这个曲线的距离的绝对值之和最小。

图 1. 平面线性回归

5e060920db14ee2d1fa72d58f8929004.png

具体方法可以用迭代实现,设曲线为 y=ax+b,即一条直线, a 和 b 是我们要求得参数,则步骤如下:

先分别给 a 和 b一 个初始的参数(比如 1 )对所有样本进行计算得到 N 个 计算出的 y 值 ,计算出的 y 值 与样本中真实 y 值 之差的绝对值就得到误差(也称为损失)。然后想办法重新调整 a 和 b 参数,再循环上面步骤,得到一个新的更小一些的误差,如此循环使误差越来越小,直到误差收敛为一个基本固定的值为止,这时候得到最终的 a 和 b 的 参数,带入模型公式 y =ax+b,这个公式就可以近似的模拟输入样本之外的新数据,得到近似的结果。如下面图 2 所 示就是这个迭代的过程,随着迭代的进行,生成的曲线与样本点的距离越来越近:

图 2. 线性回归迭代过程

fb30acf272cdb70b0dba2895c0879d9f.png

在平面例子中只有一个自变量 x ,更普遍的情况是有多个自变量即多个特征,假设有 n 个 特征,则线性回归的公式可表示为:

da2c0bdcf46cc7e8e1c8521b0ebddb1e.png

这里包括多个自变量 x 和 一个因变量 y ,b 是偏移量,也称为 0 参数,且因变量和自变量之间是线性关系,这种多个自变量和因变量的关系的分析称为多元线性回归分析。现实中有很多这样的分析例子,如房屋的面积,房间数等自变量和房价的关系等,都是线性回归的例子。

公式中如果设定 n 等于 8 ,则 8 个自变量 x 就对应水泥混合物表 1 中 的 8 个水泥特征值,如水泥含量,矿渣含量,煤灰含和凝固时间量等,水泥强度就是因变量 y ,θ 是每个特征值的权重参数,即每个特征对水泥强度质量的重要程度。我们的目标就是要求所有 θ 参数和 b 参 数的值,然后代入到线性回归公式中,来预测样本之外的水泥配料数据对应的水泥强度。

接下来,将线性回归的公式稍微整理一下,将偏移量 b 合 并到参数 θ 中用

3bdffb422d1e36aca144bff4976525e7.png表示,并且多加一个对应的因变量 >

18b428e75b063ac39b56dc2f37d8b126.png恒等于 1 ),将自变量 x 与参数 θ 用向量来表示,即:

4cc95e3a46c2948b07a5c2c1d9b52cfb.png

则线性回归公式可用向量表示为:

55bd2f119284f111efcc7aaf5d160c14.png

通常将

1328192a71c5ca16525056212d2212fc.png称为假设函数 (Hypothetical Function),那么我们现在就是要求解一组 θ ,求解的过程也称为寻找最优参数 θ ,如何求解呢?方法有很多,这里我们使用最常用也是最经典的最小二乘法。

最小二乘法

前面提到过,通过迭代,计算所有样本数据的 y 值再与真实 y 值求差,最后取其绝对值,得到的就是误差,要让这个误差尽量最小,最小二乘法(Least Squares)就是基于这个思想的方法,先看其公式:

4f3781954dadedf19c5e2695b78a0f39.png

上式中 m 是样本总数量,

feec9790645020917cb3ccd0ec42ffb9.png是计算出的 y 值 ,

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/* * 基于数组的向量实现 */ package dsa; public class Vector_Array implements Vector { private final int N = 1024;//数组的容量 private int n = 0;//向量的实际规模 private Object[] A;//对象数组 //构造函数 public Vector_Array() { A = new Object[N]; n = 0; } //返回向量中元素数目 public int getSize() { return n; } //判断向量是否为空 public boolean isEmpty() { return (0 == n) ? true : false; } //取秩为r的元素 public Object getAtRank(int r)//O(1) throws ExceptionBoundaryViolation { if (0 > r || r >= n) throw new ExceptionBoundaryViolation("意外:秩越界"); return A[r]; } //将秩为r的元素替换为obj public Object replaceAtRank(int r, Object obj) throws ExceptionBoundaryViolation { if (0 > r || r >= n) throw new ExceptionBoundaryViolation("意外:秩越界"); Object bak = A[r]; A[r] = obj; return bak; } //插入obj,作为秩为r的元素;返回该元素 public Object insertAtRank(int r, Object obj) throws ExceptionBoundaryViolation { if (0 > r || r > n) throw new ExceptionBoundaryViolation("意外:秩越界"); if (n >= N) throw new ExceptionBoundaryViolation("意外:数组溢出"); for (int i=n; i>r; i--) A[i] = A[i-1];//后续元素顺次后移 A[r] = obj;//插入 n++;//更新当前规模 return obj; } //删除秩为r的元素 public Object removeAtRank(int r) throws ExceptionBoundaryViolation { if (0 > r || r >= n) throw new ExceptionBoundaryViolation("意外:秩越界"); Object bak = A[r]; for (int i=r; i<n; i++) A[i] = A[i+1];//后续元素顺次前移 n--;//更新当前规模 return bak; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值