1.1线性回归的数学表达








1.2线性回归的java代码实现

java实现一元线性回归:

public class DataPoint {public float x;public float y;public DataPoint(float x,float y){  //DataPoint类的构造函数this.x = x;this.y = y;}
}
//RegressionLine类,用于处理一元线性回归问题
import java.math.BigDecimal;
import java.util.ArrayList;
public class RegressionLine {private float sumX = 0;//训练集x的和private float sumY = 0;//训练集y的和private float sumXX = 0;//x*x的和private float sumYY = 0;//y*y的和private float sumXY = 0;//x*y的和private float sumDeltaY;//y与yi的差private float sumDeltaY2; // sumDeltaY的平方和//误差private float sse;//残差平方和private float sst;//总平方和private float E;private float[] xy;private ArrayList<String> listX;//x的链表private ArrayList<String> listY;//y的链表private double XMin,XMax,YMin,YMax;private float a0;//线性系数a0
private float a1;//线性系数a1private int pn;  //训练集数据个数 private boolean coefsValid;
//类RegressionLine的构造函数 public RegressionLine(){XMax = 0;YMax = 0;pn = 0;xy = new float[2];listX = new ArrayList<>();listY = new ArrayList<>();}//类RegressionLine的有参构造函数public RegressionLine(DataPoint data[]){pn = 0;xy = new float[2];listX = new ArrayList();listY = new ArrayList();for(int i = 0;i<data.length;++i){addDatapoint(data[i]);//添加数据集的方法addDatapoint}}public int getDataPointCount(){return pn;}public float getA0(){validateCoefficients();return a0;}public float getA1(){validateCoefficients();return a1;}public double getSumX(){return sumX;}public double getSumY() {return sumY;}public double getSumXX() {return sumXX;}public double getSumYY() {return sumYY;}public double getSumXY() {return sumXY;}public double getXMin() {return XMin;}public double getXMax() {return XMax;}public double getYMax() {return YMax;}public double getYMin() {return YMin;}//添加训练集数据的方法public void addDatapoint(DataPoint dataPoint){sumX += dataPoint.x;sumY += dataPoint.y;sumXX += dataPoint.x*dataPoint.x;sumYY += dataPoint.y*dataPoint.y;sumXY += dataPoint.x*dataPoint.y;if(dataPoint.x > XMax){XMax = dataPoint.x;}if (dataPoint.y > YMax){YMax = dataPoint.y;}xy[0] = dataPoint.x ;//?xy[1] = dataPoint.y ;//?if(dataPoint.x !=0 && dataPoint.y != 0){System.out.print("("+xy[0]+",");System.out.println(xy[1]+")");try{listX.add(pn,String.valueOf(xy[0]));listY.add(pn,String.valueOf(xy[1]));}catch (Exception e){e.printStackTrace();}}++pn;coefsValid = false;}//计算预测值y的方法public float at(float x){if(pn < 2)return Float.NaN;validateCoefficients();return a0 + a1 * x;}//重置此类的方法public void reset(){pn = 0;sumX = sumY = sumXX = sumXY = 0;coefsValid = false;}//计算系数a0,a1的方法private void validateCoefficients(){if (coefsValid)return;if (pn >= 2){float xBar = (float)sumX/pn;float yBar = (float)sumY/pn;a1 = (float)((pn*sumXY - sumX*sumY)/(pn*sumXX - sumX*sumX));a0 = (yBar - a1*xBar);}else {a0 = a1 = Float.NaN;}coefsValid = true;}//计算判定系数R^2的方法public double getR(){for (int i = 0;i < pn;i++){float Yi = Float.parseFloat(listY.get(i).toString());float Y = at(Float.parseFloat(listX.get(i).toString()));float deltaY = Yi - Y;float deltaY2 = deltaY*deltaY;sumDeltaY2 += deltaY2;float deltaY1 = (Yi - (float) (sumY/pn))*(Yi - (float) (sumY/pn)) ;sst += deltaY1;}//sst = sumYY - (sumY*sumY)/pn;E = 1 - sumDeltaY2/sst;return round(E,4);}//返回经处理过的判定系数的方法public double round(double v,int scale){BigDecimal b = new BigDecimal(Double.toString(v));BigDecimal one = new BigDecimal("1");return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).floatValue();}}
//测试类
import java.util.Scanner;
public class LinearRegression {private static final int MAX_POINTS = 10;//定义最大的训练集数据个数private double E;public static void main(String args[]){   //测试主方法DataPoint[] data = new DataPoint[MAX_POINT];  //创建数据集对象数组data[]
//创建线性回归类对象line,并且初始化类RegressionLine line = new RegressionLine(constructDates(data));
//调用printSums方法打印Sum变量printSums(line);
//调用printLine方法并打印线性方程printLine(line);}//构建数据方法private static DataPoint[] constructDates(DataPoint date[]){Scanner sc = new Scanner(System.in);float x,y;for(int i = 0;i<3;i++){System.out.println("请输入第"+(i+1)+"个x的值:");x = sc.nextFloat();System.out.println("请输入第"+(i+1)+"个y的值:");y = sc.nextFloat();date[i] = new DataPoint(x,y);}return date;}//打印Sum数据方法private static void printSums(RegressionLine line){System.out.println("\n数据点个数 n = "+line.getDataPointCount());System.out.println("\nSumX = "+line.getSumX());System.out.println("SumY = "+line.getSumY());System.out.println("SumXX = "+line.getSumXX());System.out.println("SumXY = "+line.getSumXY());System.out.println("SumYY = "+line.getSumYY());}//打印回归方程方法private static void printLine(RegressionLine line){System.out.println("\n回归线公式:y = "+line.getA1()+"x + " + line.getA0());//System.out.println("Hello World!");System.out.println("误差: R^2 = " + line.getR());}
}

测试结果:

输入测试数据如下


程序运行结果为:

线性回归的推导与java代码相关推荐

  1. 机器学习——线性回归数学推导

    文章目录 线性回归数学推导 基础知识 线性回归的计算 利用矩阵知识对线性公式进行整合 误差项的分析 似然函数的理解 矩阵求偏导 线性回归的最终求解 实验 1 二维直线实验 2 三维平面实验 3 利用最 ...

  2. java反编译是什么_什么是Java代码的编译与反编译?

    Java代码的编译与反编译 2017-02-21 Hollis 数盟 一.什么是编译 1.利用编译程序从源语言编写的源程序产生目标程序的过程. 2.用编译程序产生目标程序的动作. 编译就是把高级语言变 ...

  3. 怎么给java代码瘦身_Eclipse Xtend对Java说:我帮你瘦身

    Java程序员在使用Ruby编程时会有一种解放的感觉,一种从Java那繁琐的语法环境进入一个无拘无束.自由国度的感觉.随着Clojure和Scala等新语言的出现,这种对比的感觉会越来越强烈.Ruby ...

  4. Java代码与计算机内核

    本文章来源于:https://github.com/Zeb-D/my-review ,请star 强力支持,你的支持,就是我的动力. [TOC] 本文导读 肉眼看计算机是由CPU.内存.显示器这些硬件 ...

  5. 二元逻辑回归 · 数学推导过程及代码实现完全解析

    文章目录 概述 两个重要函数 预测的基本思想 二元逻辑回归 线性模型的简单回顾 从线性回归到二元逻辑回归 参数怎么估计 梯度下降 牛顿迭代 最近修改:2021/6/17 原文<从二元逻辑回归到多 ...

  6. AC自动机算法详解以及Java代码实现

    详细介绍了AC自动机算法详解以及Java代码实现. 文章目录 1 概念和原理 2 节点定义 3 构建Trie前缀树 3.1 案例演示 4 构建fail失配指针 4.1 案例演示 5 匹配文本 5.1 ...

  7. 编写高性能Java代码的最佳实践

    编写高性能Java代码的最佳实践 摘要:本文首先介绍了负载测试.基于APM工具的应用程序和服务器监控,随后介绍了编写高性能Java代码的一些最佳实践.最后研究了JVM特定的调优技巧.数据库端的优化和架 ...

  8. cmd怎么实现Java你好_java环境配置以及如何在cmd窗口运行java代码

    对于初学java的人来说,电脑的环境配置也许会让你头疼,但只要你认真一些学习,相信对你来说都是OK的啦~ 首先回到桌面,选择我的电脑,单击右键属性,进入高级系统设置,点击环境变量设置.用户变量选择Te ...

  9. Android 使用java 代码获取res 里面的value 定义的数组

    现在res value 里面定义了一个array.xml 内容如下 <?xml version="1.0" encoding="utf-8"?> & ...

最新文章

  1. 52是什么水平_送礼送什么白酒,适合送礼的白酒推荐,看这篇最新白酒送礼指南就行了...
  2. 从零开始学Pytorch(十五)之数据增强
  3. Java面向对象之object类自带的方法解析(equals与==、toString方法、instanceof方法、参数传递问题)
  4. python数据挖掘需要的库_python数据挖掘需要学的内容
  5. JavaWeb项目服务端获取客户端的IP地址
  6. 对比不同的JSON字符串或者对象转的字符串
  7. MapGISnbsp;K9nbsp;SP3amp;nb…
  8. canvas 绘画
  9. 计算机网络:家庭无线网组建方案
  10. 入手评测 i7 1255u和i5 1235U选哪个好
  11. Java 实现短信验证功能(个人测试,不需要项目上线,利用容联云)
  12. linux高性能服务器编程PDF源代码下载
  13. 【读书笔记 1】《读大江大河 有感》
  14. 用Flutter实现小Q聊天机器人(二)
  15. 穿越火线游戏服务器停服维护中,cf停机维护
  16. 数组大小分配(动态内存分配)
  17. html5 head标签
  18. linux脚本实时监控,linux实时监控命令
  19. mysql安装未响应_MySQL安装未响应解决方法
  20. Mac配置开发环境(后端)和软件安利

热门文章

  1. 在IT技术圈混,怎么能不知道这几个公众号?
  2. uniapp修改字体
  3. 无法安装驱动程序 此计算机上不存在英特尔适配器,win10系统提示无法安装驱动程序,此计算机中没有Intel适配器怎么办...
  4. Matlab添加包libsvm svmtrain已被删除。 请改用fitcsvm。
  5. oracle 的exp是什么,oracle中exp和imp是什么,oracle中exp和imp有何区别 | 学步园
  6. 阿里云化身“智能云管”,助力中国联通首次实现大规模平台自主运维
  7. oracle 建索引 00054,ora-00054 表被lock导致资源忙等待不能操作案例
  8. 屏幕录制和视频剪辑Filmage Screen
  9. mp4类文件的AAC编码完美修复方法
  10. 强化学习DRL--策略学习(Actor-Critic)