【SVM回归预测】基于LibSVM实现多特征数据的预测_多特征的现有值预测未来值-程序员宅基地

技术标签: 支持向量机  机器学习  回归  

前言

案例:假设有一辆二手电动车,它的价格(万)与其使用年限、总里程(km)、事故次数、电池容量、车身尺寸等指标有关,这些指标影响着电动车的价格,因此,我们希望通过获取上述指标的数据来建立一个预测电动车价格的模型,即通过得到某辆车的这些指标就可以预测这辆车的价格。

机器学习中的回归问题与分类问题可以使用同种方法,区别在于分类问题中算法输出的是样本标签,而回归问题中算法输出的是预测样本的值。为了便于描述,在本文的回归问题中,将样本的特征向量称为自变量 x x x ,算法的输出称为因变量 y y y,训练集、测试集的因变量以及预测值分别称为训练标签、测试标签、预测标签。

一、数据集

数据集大小为150x6,第一列到第五列为自变量 x x x,第6列为因变量 y y y

二、实现步骤

(1)数据集的划分

首先,将数据集按照一定比例划分为训练集和测试集,训练集可以训练出一个用于预测的模型,而测试集是为了验证模型的预测准确率。

% 训练集与测试集的划分
[m,n] = size(Sample);         % 数据的大小相等
ratio = 2/3;                  % 训练数据比例
m_train = round(m*ratio);      % 训练数据行数

train_sample = Sample(1:m_train,1:5);    % 训练集和测试集的样本
test_sample = Sample(m_train+1:m,1:5);

train_labels = Sample(1:m_train,6);      % 训练集和测试集的样本标签
test_labels = Sample(m_train+1:m,6);

(2)数据归一化

由于数据集自变量的单位不统一,且不同自变量的值大小相差较大,在使用之前需要进行归一化处理。
数据的归一化用matlab自带的函数mapminmax。
该函数的默认归一化范围为[-1, 1],本文我们采用的归一化范围是[0, 1],则需要这样使用:
B= mapminmax(A,0,1);
A为原始数据,B为归一化后的数据。
在这里插入图片描述
很明显,对于矩阵,mapminmax函数是按行进行归一化的。所以我们要将训练样本和测试样本先转置,再进行归一化操作。

% 将训练集和测试集的样本分别归一化到[0,1]区间
[train_scale,ps] = mapminmax(train_sample',0,1);  
train_x = train_scale';

test_scale = mapminmax('apply',test_sample',ps);
test_x = test_scale';

ps是一个结构体,里面存放的是数据归一化的规则。为了使测试样本的归一化与训练样本保持一致,就可以用到ps。
在这里插入图片描述
由于在回归问题中训练集和测试集的样本标签并不是真实的整数标签,且数值的变化范围较大,也需要进行归一化处理。

% 将训练集和测试集的样本标签分别归一化到[0,1]区间
[train_lab,ps] = mapminmax(train_labels',0,1);  
train_y = train_lab';

test_lab = mapminmax('apply',test_labels',ps);
test_y = test_lab';

(3)SVM训练与预测

cmd = ('-s 3 -t 2 -b 1');
model = svmtrain(train_y,train_x,cmd); %#ok<SVMTRAIN>
[predict_y,accuracy,prob_estimates] = svmpredict(test_y,test_x,model);

有关训练函数svmtrain和预测函数svmpredict的使用方法以及cmd中参数的含义请阅读博文svmtrain和svmpredict的用法和参数含义

(4)预测数据的反归一化

先测试一下反归一化操作的有效性,将测试样本的标签反归一化之后得到的值与归一化前的值进行比较,如果相同,则对预测标签进行反归一化。

% 反归一化
predict_labels = mapminmax('reverse',predict_y,ps);

模型的预测结果如下图:
在这里插入图片描述

三、MATLAB代码

clc;
clear;
close all;

load Sample;

% 训练集与测试集的划分
[m,n] = size(Sample);         % 数据的大小相等
ratio = 2/3;                  % 训练数据比例
m_train = round(m*ratio);      % 训练数据行数

train_sample = Sample(1:m_train,1:5);    % 训练集和测试集的样本
test_sample = Sample(m_train+1:m,1:5);

train_labels = Sample(1:m_train,6);      % 训练集和测试集的样本标签
test_labels = Sample(m_train+1:m,6);
% 将训练集和测试集的样本分别归一化到[0,1]区间
[train_scale,ps] = mapminmax(train_sample',0,1);  
train_x = train_scale';

test_scale = mapminmax('apply',test_sample',ps);
test_x = test_scale';

% 将训练集和测试集的样本标签分别归一化到[0,1]区间
[train_lab,ps] = mapminmax(train_labels',0,1);  
train_y = train_lab';

test_lab = mapminmax('apply',test_labels',ps);
test_y = test_lab';

%% SVM网络训练、验证与测试
cmd = ('-s 3 -t 2 -b 1');
model = svmtrain(train_y,train_x,cmd); %#ok<SVMTRAIN>
[predict_y,accuracy,prob_estimates] = svmpredict(test_y,test_x,model);

% 反归一化
predict_labels = mapminmax('reverse',predict_y,ps);
%% 结果分析
% 验证集、测试集的实际分类和预测分类图
figure;
hold on;
plot(test_labels,'b-');
plot(predict_labels,'r-.');
axis tight;
xlabel('测试集样本','FontSize',12);
ylabel('标签','FontSize',12);
legend('测试集实际值','测试集预测值');
title('测试集的实际值和预测值','FontSize',12);
grid on;

参考资料

[1] matlab归一化和反归一化函数——mapminmax
[2] svmtrain和svmpredict的用法和参数含义

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45317919/article/details/120911681

智能推荐

从零开始复刻ruoyi-vue-pro(若依Pro版)_若依站内信-程序员宅基地

文章浏览阅读622次,点赞3次,收藏9次。从零开始复刻ruoyi-vue-pro(若依Pro版)_若依站内信

Spring装配bean_可以在包中创建一个用来扫描的空标记接口-程序员宅基地

文章浏览阅读401次。创建应用之间关联关系的传统做法(通过构造器或者查找)通常会导致结构复杂的代码 , 这些代码很难被复用 , 也很难进行单元测试 , 耦合度高…… 在spring中 , 对象无需自己查找或创建与其关联的对象 , 相反 , 容器负责把需要相互协作的对象引用赋予给各个对象 ,例如,一个订单管理组件需要信用卡认证组件,但它不需要自己创建信用卡认证组件。订单管理组件只需要表明自己两手空空,容器就会主动赋予它一_可以在包中创建一个用来扫描的空标记接口

openssl3.2 - 官方demo学习 - mac - cmac-aes256.c_openssl生成cmac-程序员宅基地

文章浏览阅读511次,点赞5次,收藏5次。指定加密算法(e.g. AES-256-CBC), 对明文生成MAC数据。_openssl生成cmac

C语言学习(十)C语言中的小数_c语言小数的定义变量类型-程序员宅基地

文章浏览阅读6.8k次,点赞2次,收藏18次。C语言学习(十)C语言中的小数小数的表示方式小数分为整数部分和小数部分,他们之间用点号.分隔,如0.0、7.5、4.098、0.27、-987.333等都是合法小数,这是最常见的小数形式,我们称为十进制形式。此外,小时也可以采用指数形式,如3.2x103、0.0345x106、100.2323x10-6等。C语言同时支持以上两种小数形式。C语言中小数的指数形式为:aEn 或 aen其中a为尾数部分,是一个十进制的数字。n为指数部分,是一个十进制整数。e或者E是一个固定字符,用于分隔尾数和指数_c语言小数的定义变量类型

89c52LED点阵实例(复习自用)-程序员宅基地

文章浏览阅读496次,点赞20次,收藏3次。今天老板找我,我说我很忙,后来老板过来的时候发现我在做这个,让我走人,可恶。

Discord注册教程:Discord刚注册就被封怎么办?附申诉教程!_discord注册输错年龄被限制-程序员宅基地

文章浏览阅读1k次,点赞27次,收藏13次。在本篇文章中,我们探讨了Discord注册的全过程,以及如何有效避免因常见问题而导致Discord注册就被禁用的情况,同时介绍了使用AdsPower指纹浏览器避免账号被封的策略。无论您是在担心“Discord会封号吗”还是已经面临Discord被封的挑战,都可以考虑使用AdsPower这样的工具来保护和管理您的账户。当然,及时且合理地进行Discord申诉,依然有机会恢复您的账号,希望以上内容对大家有所帮助。_discord注册输错年龄被限制

随便推点

拯救者Legion R9000X 2021(82HN)原装出厂Win10系统镜像ISO下载_联想拯救者win10下载-程序员宅基地

文章浏览阅读223次。原装出厂系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系统属性专属LOGO标志、Office办公软件、联想电脑管家等预装程序。lenovo联想拯救者笔记本R9000X 2021款原厂Windows10系统安装包,恢复出厂开箱状态预装OEM系统。注:恢复时会清空电脑上所有盘的数据,请提前转移备份好重要资料!文件格式:ISO 文件大小:10.94GB。所需要工具:16G或以上的U盘。_联想拯救者win10下载

【金三银四】面试题汇总(持续编写中)(1),大数据开发面试题2024答案-程序员宅基地

文章浏览阅读509次,点赞10次,收藏14次。(img-wFn67B7m-1713167233059)]友,可以添加V获取:vip204888 (备注大数据)**

arm-none-eabi交叉编译工具常用的一些指令_arm-none-eabi-gcc objdump-程序员宅基地

文章浏览阅读1.7w次,点赞3次,收藏22次。假如目前有三个文件a.c、b.c、ab.lds:1.arm-none-eabi-gccarm-none-eabi-gcc --help 查看帮助信息。arm-none-eabi-gcc -c a.c 生成a.o文件。arm-none-eabi-gcc -g -c a.c 生成a.o文件,-g使得如果反汇编可对应C语言显示。arm-none-eabi-gcc -c_arm-none-eabi-gcc objdump

numpy数据文件保存和加载_写入numpy数组到gz中-程序员宅基地

文章浏览阅读353次。要点概括:1.保存为二进制文件(.npy/.npz) numpy.save numpy.savez numpy.savez_compressed 2.保存到文本文件 numpy.savetxt numpy.loadtxt 1. numpy.save(file, arr, allow_pickle=True, fix_imports=True)file:文件名/文..._写入numpy数组到gz中

R实用绘图--火山图_火山图-logfdr-程序员宅基地

文章浏览阅读261次,点赞5次,收藏2次。R实用绘图系列主要是带领大家绘制一些实用、好看而又不太复杂的科研常用图形,主打一个实用,该系列会持续更新,有需要的小伙伴赶紧关注起来吧。_火山图-logfdr

MySQL 迁移数据库从C盘到D盘_mysql数据库从c盘迁移到d盘-程序员宅基地

文章浏览阅读631次,点赞9次,收藏4次。七、修改成功后,再去重启MySQL服务,一般就可以成功了,但我遇到一些错误,提示MySQL服务打不开,我查了一些资料,发现应该是新建的MySQL文件夹,没有相应的权限,还要加一下network service权限。在工作上,服务器当时只有C盘,所以把数据库安装到C盘上了,后来新添加了D盘,并且随着数据量增加,C盘也频频内存爆红,只能移到D盘了,经过实际操作,也遇到了许多问题,在此做出总结。最后加完权限,就可以正式启动,然后可以再查询一下第一步的语句,应该就改到新的路径中了。_mysql数据库从c盘迁移到d盘

推荐文章

热门文章

相关标签