基本算法——回归
目录
创建工程
加载数据
分析属性
创建与评估回归模型
线性回归
回归树
评估
完整代码
结论
本节将通过分析能源效率数据集(Tsanas和Xifara,2012)学习基本的回归算法。我们将基 于建筑的结构特点(比如表面、墙体与屋顶面积、高度、紧凑度)研究它们的加热与冷却负载要 求。研究者使用一个模拟器设计了12种不同的房屋配置,这些房屋配置通过改变18种建筑特征得 出,他们总共模拟了768种建筑。
我们的首要目标是系统分析每种建筑特征对目标变量——加热或冷却负载——产生的影响。 第二个目标是比较经典线性回归模型相对于其他方法(比如SVM回归、随机森林、神经网络)的 性能。这个任务中,我们将使用Weka库。
创建工程
接着使用上一篇文章的工程:
加载数据
// 加载数据CSVLoader loader = new CSVLoader();loader.setFieldSeparator(","); // 设置CSV文件的字段分隔符为逗号loader.setSource(new File(PATH)); // 设置数据源为CSV文件Instances data = loader.getDataSet(); // 从CSV文件中加载数据集
分析属性
进行属性分析之前,先了解要处理什么。总共有8个属性描述建筑特征,有两个目标变量:
heating与cooling。
创建与评估回归模型
首先,在特征位置设置分类属性,为加热负载建立学习模型。第二个目标变量(冷却负载)现在可以移除:
/** 构建回归模型*/// 设置类别索引为Y1(加热负荷),即目标变量data.setClassIndex(data.numAttributes() - 2); // 设置类别索引为倒数第二个属性,表示Y1// 移除最后一个属性Y2,因为Y2是另一个目标变量,我们只处理Y1Remove remove = new Remove();remove.setOptions(new String[]{"-R", String.valueOf(data.numAttributes())}); // 移除最后一个属性remove.setInputFormat(data); // 设置输入格式data = Filter.useFilter(data, remove); // 应用过滤器,移除最后一个属性
线性回归
首先,使用LinearRegression类创建一个基本的线性回归模型。正如在分类示例中所做的 那样,先初始化一个新模型实例,传递参数与数据,并调用buildClassifier(Instances)方 法:
// 构建线性回归模型LinearRegression model = new LinearRegression();model.buildClassifier(data); // 使用数据训练线性回归模型System.out.println(model); // 输出线性回归模型的详细信息
结果如下:
Y1 =-64.774 * X1 +-0.0428 * X2 +0.0163 * X3 +-0.089 * X4 +4.1699 * X5 +19.9327 * X7 +0.2038 * X8 +83.9329
线性回归模型构建了一个函数,它把输入变量线性组合在一起,对加热负载进行评估。特征 前面的数字解释特征对目标变量的影响:符号表示正面影响或负面影响,而大小对应于影响程度。 比如特征X1(相对紧凑度),它与加热负载是负相关的,而玻璃窗面积与加热负载是正相关的。
这两个特征也对最后加热负载的评估有明显影响。
使用交叉验证技术可以对模型性能做类似评估。 做10折交叉验证(10-fold cross-validation)如下:
// 10折交叉验证Evaluation evaluation = new Evaluation(data); // 创建评估对象evaluation.crossValidateModel(model, data, 10, new Random(1), new String[]{}); // 执行10折交叉验证System.out.println(evaluation.toSummaryString()); // 输出交叉验证的概要信息double[] coefficients = model.coefficients(); // 获取线性回归模型的系数
结果如下:
Correlation coefficient 0.956
Mean absolute error 2.0923
Root mean squared error 2.9569
Relative absolute error 22.8555 %
Root relative squared error 29.282 %
Total Number of Instances 768
回归树
另一个方法是构建一组回归模型,每一个模型对应于数据中与其自身相关的部分。图3-5展 示了回归模型与回归树之间的主要不同。回归模型指的是一个与所有数据达到最好拟合的独立模 型;而回归树是一组回归模型,每个模型只对一部分数据进行建模。Weka中的M5类用于实现回归树。创建模型时,遵从步骤与前面一样:初始化模型、传递参 数与数据、调用buildClassifier(Instances)方法。
// 构建回归树模型(M5P模型)M5P m5p = new M5P();m5p.setOptions(new String[]{""}); // 设置选项,这里为空m5p.buildClassifier(data); // 使用数据训练M5P回归树模型System.out.println(m5p); // 输出M5P回归树模型的详细信息
结果如下:
M5 pruned model tree:
(using smoothed linear models)X1 <= 0.75 :
| X7 <= 0.175 :
| | X1 <= 0.65 : LM1 (48/1.264%)
| | X1 > 0.65 : LM2 (96/3.201%)
| X7 > 0.175 :
| | X1 <= 0.65 : LM3 (80/3.652%)
| | X1 > 0.65 :
| | | X7 <= 0.325 : LM4 (80/3.724%)
| | | X7 > 0.325 :
| | | | X1 <= 0.675 : LM5 (20/1.687%)
| | | | X1 > 0.675 :
| | | | | X8 <= 2.5 : LM6 (24/1.314%)
| | | | | X8 > 2.5 :
| | | | | | X8 <= 4.5 : LM7 (24/2.737%)
| | | | | | X8 > 4.5 :
| | | | | | | X1 <= 0.7 : LM8 (4/0.91%)
| | | | | | | X1 > 0.7 : LM9 (8/1.265%)
X1 > 0.75 :
| X1 <= 0.805 :
| | X7 <= 0.175 : LM10 (48/5.775%)
| | X7 > 0.175 :
| | | X7 <= 0.325 : LM11 (40/5.26%)
| | | X7 > 0.325 : LM12 (40/5.756%)
| X1 > 0.805 :
| | X7 <= 0.175 :
| | | X8 <= 1.5 :
| | | | X7 <= 0.05 :
| | | | | X2 <= 539 : LM13 (4/0%)
| | | | | X2 > 539 : LM14 (12/4.501%)
| | | | X7 > 0.05 :
| | | | | X1 <= 0.94 : LM15 (12/4.329%)
| | | | | X1 > 0.94 : LM16 (4/0.226%)
| | | X8 > 1.5 :
| | | | X1 <= 0.94 : LM17 (48/5.693%)
| | | | X1 > 0.94 : LM18 (16/1.119%)
| | X7 > 0.175 :
| | | X1 <= 0.84 :
| | | | X7 <= 0.325 :
| | | | | X8 <= 2.5 : LM19 (8/3.901%)
| | | | | X8 > 2.5 : LM20 (12/3.913%)
| | | | X7 > 0.325 : LM21 (20/5.632%)
| | | X1 > 0.84 :
| | | | X7 <= 0.325 : LM22 (60/4.548%)
| | | | X7 > 0.325 :
| | | | | X3 <= 306.25 : LM23 (40/4.504%)
| | | | | X3 > 306.25 : LM24 (20/6.934%)LM num: 1
Y1 = 72.2602 * X1 + 0.0053 * X3 + 41.5669 * X7 - 0.0049 * X8 - 37.6688LM num: 2
Y1 = -14.6772 * X1 + 0.0053 * X3 + 40.2316 * X7 + 0.0181 * X8 + 15.649LM num: 3
Y1 = 84.5112 * X1 + 0.0053 * X3 + 13.9115 * X7 - 0.1471 * X8 - 42.4943LM num: 4
Y1 = -2.8359 * X1 + 0.0053 * X3 + 4.3146 * X7 - 0.0111 * X8 + 12.0357LM num: 5
Y1 = -6.0295 * X1 + 0.0053 * X3 + 4.3146 * X7 - 0.0524 * X8 + 16.0295LM num: 6
Y1 = -4.3262 * X1 + 0.0053 * X3 + 4.3146 * X7 - 0.0665 * X8 + 14.5905LM num: 7
Y1 = -4.3262 * X1 + 0.0053 * X3 + 4.3146 * X7 - 0.0888 * X8 + 14.5832LM num: 8
Y1 = -4.3262 * X1 + 0.0053 * X3 + 4.3146 * X7 - 0.1025 * X8 + 14.5352LM num: 9
Y1 = -0.8154 * X1 + 0.0053 * X3 + 4.3146 * X7 - 0.1025 * X8 + 11.9531LM num: 10
Y1 = 105.9033 * X1 + 0.0113 * X3 + 59.6616 * X7 + 0.0975 * X8 - 58.7462LM num: 11
Y1 = 81.6537 * X1 + 0.0113 * X3 + 10.8932 * X7 + 0.0559 * X8 - 33.0837LM num: 12
Y1 = 64.6565 * X1 + 0.0113 * X3 + 10.8932 * X7 - 0.0337 * X8 - 18.0037LM num: 13
Y1 = 3.2622 * X1 - 0.0018 * X2 + 0.0164 * X3 + 44.6313 * X7 + 0.0592 * X8 + 11.9461LM num: 14
Y1 = 9.1337 * X1 - 0.0018 * X2 + 0.0164 * X3 - 0.0494 * X6 + 44.6313 * X7 + 0.0592 * X8 + 7.321LM num: 15
Y1 = 11.8776 * X1 - 0.0018 * X2 + 0.0164 * X3 - 0.0428 * X6 + 44.6313 * X7 + 0.0592 * X8 + 7.0198LM num: 16
Y1 = 3.2622 * X1 - 0.0018 * X2 + 0.0164 * X3 + 44.6313 * X7 + 0.0592 * X8 + 14.1593LM num: 17
Y1 = 35.1381 * X1 - 0.0018 * X2 + 0.0164 * X3 + 16.7723 * X7 + 0.0592 * X8 - 10.1661LM num: 18
Y1 = 3.2622 * X1 - 0.0018 * X2 + 0.0164 * X3 + 16.7723 * X7 + 0.0592 * X8 + 16.4949LM num: 19
Y1 = 8.5464 * X1 - 0.0012 * X2 + 0.029 * X3 + 15.2851 * X7 - 0.2151 * X8 + 7.86LM num: 20
Y1 = 8.5464 * X1 - 0.0012 * X2 + 0.029 * X3 + 15.2851 * X7 - 0.0475 * X8 + 7.4789LM num: 21
Y1 = 8.5464 * X1 - 0.0012 * X2 + 0.029 * X3 + 15.2851 * X7 + 0.013 * X8 + 8.5537LM num: 22
Y1 = 1.4309 * X1 - 0.0012 * X2 + 0.1248 * X3 + 9.5464 * X7 + 0.0373 * X8 - 10.9927LM num: 23
Y1 = 5.1744 * X1 - 0.0012 * X2 + 0.0633 * X3 + 9.5464 * X7 + 0.0235 * X8 + 5.7355LM num: 24
Y1 = 5.1744 * X1 - 0.0012 * X2 + 0.0761 * X3 + 9.5464 * X7 - 0.0805 * X8 + 3.4386Number of Rules : 24
这棵树总共有13个叶子,每个叶子对应于一个线性方程。
评估
// 10折交叉验证evaluation = new Evaluation(data); // 重新创建评估对象evaluation.crossValidateModel(m5p, data, 10, new Random(1), new String[]{}); // 执行10折交叉验证System.out.println(evaluation.toSummaryString()); // 输出交叉验证的概要信息
结果如下:
Correlation coefficient 0.996
Mean absolute error 0.6497
Root mean squared error 0.9164
Relative absolute error 7.0972 %
Root relative squared error 9.0753 %
Total Number of Instances 768
完整代码
private static String PATH = ClassUtils.getDefaultClassLoader().getResource("ENB2012_data.csv").getPath();public static void main(String[] args) throws Exception {// 加载数据CSVLoader loader = new CSVLoader();loader.setFieldSeparator(","); // 设置CSV文件的字段分隔符为逗号loader.setSource(new File(PATH)); // 设置数据源为CSV文件Instances data = loader.getDataSet(); // 从CSV文件中加载数据集/** 构建回归模型*/// 设置类别索引为Y1(加热负荷),即目标变量data.setClassIndex(data.numAttributes() - 2); // 设置类别索引为倒数第二个属性,表示Y1// 移除最后一个属性Y2,因为Y2是另一个目标变量,我们只处理Y1Remove remove = new Remove();remove.setOptions(new String[]{"-R", String.valueOf(data.numAttributes())}); // 移除最后一个属性remove.setInputFormat(data); // 设置输入格式data = Filter.useFilter(data, remove); // 应用过滤器,移除最后一个属性// 构建线性回归模型LinearRegression model = new LinearRegression();model.buildClassifier(data); // 使用数据训练线性回归模型System.out.println(model); // 输出线性回归模型的详细信息// 10折交叉验证Evaluation evaluation = new Evaluation(data); // 创建评估对象evaluation.crossValidateModel(model, data, 10, new Random(1), new String[]{}); // 执行10折交叉验证System.out.println(evaluation.toSummaryString()); // 输出交叉验证的概要信息double[] coefficients = model.coefficients(); // 获取线性回归模型的系数// 构建回归树模型(M5P模型)M5P m5p = new M5P();m5p.setOptions(new String[]{""}); // 设置选项,这里为空m5p.buildClassifier(data); // 使用数据训练M5P回归树模型System.out.println(m5p); // 输出M5P回归树模型的详细信息// 10折交叉验证evaluation = new Evaluation(data); // 重新创建评估对象evaluation.crossValidateModel(m5p, data, 10, new Random(1), new String[]{}); // 执行10折交叉验证System.out.println(evaluation.toSummaryString()); // 输出交叉验证的概要信息}
结论
对于线性回归模型:
(1)相关性系数(Correlation coefficient)为0.956,表明模型预测值与实际值之间有较强的相关性。
(2)平均绝对误差(Mean absolute error)为2.0923,表示预测值与实际值之间的平均绝对差距。
(3)均方根误差(Root mean squared error)为2.9569,它衡量了预测值与实际值之间的标准偏差。
(4)相对绝对误差(Relative absolute error)和相对均方根误差(Root relative squared error)分别为22.8555%和29.282%,这些指标是相对于实际值的误差比例。
对于M5模型树:
(1)相关性系数为0.996,比线性回归模型更高,说明M5模型树的预测值与实际值的相关性更强。
(2)平均绝对误差降低到0.6497,表明M5模型树的预测更为准确。
(3)均方根误差也降低到0.9164,说明预测值与实际值的偏差更小。
(4)相对绝对误差和相对均方根误差分别降低到7.0972%和9.0753%,显示M5模型树在相对误差上也有显著改善。
相关文章:

基本算法——回归
目录 创建工程 加载数据 分析属性 创建与评估回归模型 线性回归 回归树 评估 完整代码 结论 本节将通过分析能源效率数据集(Tsanas和Xifara,2012)学习基本的回归算法。我们将基 于建筑的结构特点(比如表面、墙体与屋顶面…...

深度学习——神经网络中前向传播、反向传播与梯度计算原理
一、前向传播 1.1 概念 神经网络的前向传播(Forward Propagation)就像是一个数据处理的流水线。从输入层开始,按照网络的层次结构,每一层的神经元接收上一层神经元的输出作为自己的输入,经过线性变换(加权…...

解决git push报错:not valid: is this a git repository?
今天想把代码更新到仓库里,执行git push origin master:main的时候报错:not valid: is this a git repository? 查了好多方法都没用。后来经过这篇文章的启发:https://zhuanlan.zhihu.com/p/301518109 可能是由于校园网的问题,…...

树形查询转成TreeNode[],添加新节点
在使用PrimeVue的TreeTable组件时,需要将带有层级的数据转换为TreeNode[]类型的数据结构。TreeNode是PrimeVue中定义的一个接口,用于表示树节点。通常,带有层级的数据是一个嵌套的对象或数组,其中每个对象可能包含子对象ÿ…...

【Rust自学】8.2. Vector + Enum的应用
8.2.0. 本章内容 第八章主要讲的是Rust中常见的集合。Rust中提供了很多集合类型的数据结构,这些集合可以包含很多值。但是第八章所讲的集合与数组和元组有所不同。 第八章中的集合是存储在堆内存上而非栈内存上的,这也意味着这些集合的数据大小无需在编…...

攻防世界web第十题Web_python_template_injection
这是题目,从题目上看是一个python模板注入类型的题目。 首先测试是否存在模板注入漏洞,构造http://61.147.171.105:57423/{{config}} 得到 说明存在模板注入漏洞,继续注入 构造http://61.147.171.105:57423/{{‘’.class.mro}}: 得到 再构造…...

vmware 修改Ubuntu终端字体大小
1. 2、 3、 4、 5、 6、点击select...

API 设计:从基础到最佳实践
https://levelup.gitconnected.com/api-design-101-from-basics-to-best-practices-a0261cdf8886 在本次深入研究中,我们将从基础开始,逐步了解 API 设计,并逐步实现定义卓越 API 的最佳实践。 作为开发人员,您可能熟悉其中的许多…...

ROUGE指标在自然语言处理中的应用:从理论到实践
引言 你是否曾经遇到过机器生成的文本摘要与原文内容不符的情况?或者在使用机器翻译时,发现译文虽然“看起来”正确,但语义却与原文相差甚远?在自然语言处理(NLP)领域,如何科学地评估生成文本的…...

GraalVM:云原生时代的Java虚拟机
1. 概述 GraalVM是由Oracle公司开发的一款高性能、多语言的虚拟机平台。它不仅兼容传统的JVM字节码执行,还引入了即时编译(JIT)技术的革新,以及对多种编程语言的支持。GraalVM旨在通过提供更高效的执行环境来满足云计算环境中日益…...

Linux 信号集与信号掩码
目录 一、引言 二、信号集是什么 三、信号集关键函数 1.信号集的创建与初始化 2.信号的添加与删除 3.信号集的阻塞与解除阻塞 四、信号集实际应用场景 五、信号掩码的作用 六、信号掩码相关函数 1.sigprocmask 函数 2.sigemptyset 和 sigfillset 函数 七、信号掩码注…...

如何设置Edge浏览器访问软件
使用Edge浏览器访问分销ERP A\V系列软件时会出现各种报错,如何设置Edge浏览器使其正常访问,请看下面的具体操作。 一、打开Edge浏览器,点击右上角的 设置及其他,如图: 二、在弹出界面中,点击 扩展ÿ…...

DL笔记:旋转编码RoPE
1 背景 由于计算资源限制,目前的LLM大多在较短的上下文长度中进行训练,在推理中,如果超出预训练的长度,模型的性能将会显著降低 ——>需要一个可提供外推性的位置编码最经典的绝对位置编码就是原始Transformer中的那个sinusoi…...

C语言自定义类型与文件操作
构造类型 枚举类型 若定义不相关的常量使用宏定义;若定义一组相关的常量使用枚举。switch中case后访问的就是枚举。 定义: 我们一般情况下定义常量使用宏定义(#define),宏定义适合没有关联关系的常量;但有时需要对一组有关联关系…...

《计算机网络A》单选题-复习题库解析-3
目录 106、MAN通常是指( ) 107、下列因素中,不会影响信道数据传输速率的是( ) 108、以太网交换机进行转发决策时使用的PDU地址是( ) 109、下列机制中,可以解决因数据帧丢失而…...

VM虚拟机配置ubuntu网络
目录 桥接模式 NAT模式 桥接模式 特点:ubuntu的IP地址与主机IP的ip地址不同 第一部分:VM虚拟机给ubuntu的网络适配器,调为桥接模式 第二部分:保证所桥接的网络可以上网 第三部分:ubuntu使用DHCP(默认&…...

【每日学点鸿蒙知识】Web高度适配、变量声明规范、动画取消、签名文件、包体积优化相关
1、HarmonyOS Web页面高度适配? 在Web页面设置高度100%时,发现和Web控件的高度不一致,这个需要设置什么可以达到页面高度和Web容器高度一致 目前只支持两种web布局模式,分别为Web布局跟随系统WebLayoutMode.NONE和Web基于页面大…...

uniapp使用ucharts组件
1.ucharts准备 有两种使用方式:一种是在uni的插件市场下载(组件化开发)。一种是手动引入ucharts包。官方都封装好组件了,我们不用岂不是浪费。 直接去dcloud插件市场(DCloud 插件市场)找,第一…...

LabVIEW工程师的未来发展
对于LabVIEW工程师以及更广义的编程从业者(包括“高级民工”码农)来说,随着AI技术和软件编程的逐步成熟,确实面临一些新的挑战和机遇。以下是对此问题的深入分析和未来方向的建议: 现状分析:技术过剩与竞争…...

java的bio、nio、aio 以及操作系统的select、poll、epoll
在 Java 和其他编程语言中,I/O 模型的选择对网络应用的性能和可扩展性有着重要影响。以下是 BIO(Blocking I/O)、NIO(Non-blocking I/O)、AIO(Asynchronous I/O),以及操作系统级别的…...

2024 年发布的 Android AI 手机都有什么功能?
大家好,我是拭心。 2024 年是 AI 快速发展的一年,这一年 AI 再获诺贝尔奖,微软/苹果/谷歌等巨头纷纷拥抱 AI,多款强大的 AI 手机进入我们的生活。 今年全球 16% 的智能手机出货量为 AI 手机,到 2028 年,这…...

RLHF,LM模型
LLM(Large Language Model) RLHF(Reinforcement Learning from Human Feedback),即以强化学习方式依据人类反馈优化语言模型。 RLHF思想:使用强化学习的方式直接优化带有人类反馈的语言模型。RLHF使得在一般文本数据语料库上训练的语言模型能与复杂的人类价值观对齐。 R…...

【机器学习】工业 4.0 下机器学习如何驱动智能制造升级
我的个人主页 我的领域:人工智能篇,希望能帮助到大家!!!👍点赞 收藏❤ 随着科技的飞速发展,工业 4.0 浪潮正席卷全球制造业,而机器学习作为这一变革中的关键技术,正以前…...

REST与RPC的对比:从性能到扩展性的全面分析
在微服务架构中,服务间通信是核心问题之一。常见的两种通信方式是REST(Representational State Transfer)和RPC(Remote Procedure Call)。它们各有优缺点,适用于不同场景。本文将从性能、扩展性、兼容性和开…...

MATLAB中将MAT文件转换为Excel文件
MATLAB中将MAT文件转换为Excel文件 MATLAB提供了多种方法将MAT文件中的数据导出到Excel文件中。下面介绍几种常用的方法: 1. 使用 writetable 函数 优点: 功能强大,可以灵活控制输出格式。用法: data load(your_data.mat); …...

leetcode hot 100 跳跃游戏2
45. 跳跃游戏 II 已解答 中等 相关标签 相关企业 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i j] 处: 0 < j…...

【Cesium】八、Cesium 默认地图不显示,不加载默认Bing地图
文章目录 前言实现方法App.vue 前言 Cesium 默认加载的地图是bing地图,个人认为请求bing地图会收到网络限制,导致地图资源下载很慢,所以设置默认不加载bing地图(后续我使用的是天地图) 参考文章: cesium …...

【新方法】通过清华镜像源加速 PyTorch GPU 2.5安装及 CUDA 版本选择指南
下面详细介绍所提到的两条命令,它们的作用及如何在你的 Python 环境中加速 PyTorch 等库的安装。 1. 设置清华镜像源 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple这条命令的作用是将 pip (Python 的包管理工具…...

MySQL的sql操作有哪些
MySQL 的 SQL 操作可以分为几个主要类别,每个类别包含了一系列的语句,用于执行不同的数据库操作: 数据查询语言(DQL) SELECT:用于从一个或多个表中检索数据。可以使用 WHERE 子句进行条件筛选,…...

ArcGIS计算矢量要素集中每一个面的遥感影像平均值、最大值等统计指标
本文介绍在ArcMap软件中,基于矢量面要素集,计算在其中每一个面区域内,遥感影像的像元个数、平均值、总和等统计值,并将统计信息附加到矢量图层的属性表中的方法。 首先,明确一下本文的需求。现在有一个矢量面要素集&am…...