MATLAB代码:机器学习-分类器

本文包含三种机器学习分类器的MATLAB实现方式代码块:支持向量机、决策树、逻辑回归。


目录

 SVM/支持向量机(Support Vector Machine)

原理

MATLAB实现

实例代码块

采用搜索确定参数

Decision Tree / 决策树

原理

MATLAB实现

实例代码块

Logistic Regression / 逻辑回归

原理

MATLAB实现

实例代码块


 SVM/支持向量机(Support Vector Machine)

原理

详细原理可参考:机器学习(九):支持向量机SVM(超详细理论基础)_支持向量机的分类模型-CSDN博客

MATLAB实现

实例代码块

1- 导入数据

%% 训练集比例
train_ratio = 0.8;  %可自行设置比例%% 导入数据
load('features.mat'); n = randperm(size(features,1));
train_num = floor(train_ratio * size(features,1));train_features = features(n(1:train_num),:);
train_labels = labels(n(1:train_num),:);test_features = features(n(train_num + 1:end),:);
test_labels = labels(n(train_num + 1:end),:);

2- 数据处理与设置

%% 参数设置c = 20; %根据需要设置合适的值
g = 1.5; %根据需要设置合适的值
acc = 0; %准确率初始化%% 数据处理[Train_features,PS] = mapminmax(train_features');
Train_features = Train_features';
Test_features = mapminmax('apply',test_features',PS);
Test_features = Test_features';

3- SVM核心代码

template = templateSVM('KernelFunction','rbf','BoxConstraint',c,'KernelScale',g);
h_model = waitbar(0, '正在训练多类别SVM模型...'); %进度条显示
model = fitcecoc(Train_features,train_labels,'Learners',template,'Coding','onevsone','Verbose',0);
close(h_model);save('my_trained_model.mat','model');  %保存模型

4- 后处理

%% 后处理[predict_label_train,~] = predict(model,Train_features);
train_accuracy = sum(strcmp(predict_label_train,train_labels)) / length(train_labels); % 计算训练集准确度[predict_label_test,~] = predict(model,Test_features);
test_accuracy = sum(strcmp(predict_label_test,test_labels)) / length(test_labels); % 计算测试集准确度confusion_matrix_train = confusionmat(train_labels,predict_label_train);
figure;
confusionchart(confusion_matrix_train);
title('训练集混淆矩阵');
saveas(gcf, 'confusion_matrix_train.png');confusion_matrix_test = confusionmat(test_labels,predict_label_test);
figure;
confusionchart(confusion_matrix_test);
title('测试集混淆矩阵');
saveas(gcf, 'confusion_matrix_test.png');disp(['训练集准确度: ',num2str(train_accuracy)]);
disp(['测试集准确度: ',num2str(test_accuracy)]);

采用搜索确定参数

可以采用随机搜索+网格搜索的方式确定较优的参数值。

%% 搜索部分
%根据需要自行修改初始值和搜索范围
num_random_search = 30; 
bestc_random = 15;
bestg_random = 2;
bestacc_random = 0;
bestc = 15;
bestg = 0.7;
bestacc = 0;h_random = waitbar(0, '正在进行随机搜索寻找较优参数...');
for k = 1:num_random_searchc_random = 2 + (6 - (2)) * rand(); g_random = -3 + (2 - (-3)) * rand(); template_random = templateSVM('KernelFunction','rbf','BoxConstraint',2^c_random,'KernelScale',2^g_random);classifier_random = fitcecoc(Train_features,train_labels,'Learners',template_random,'Coding','onevsone','Verbose',0,'CrossVal','on','KFold',v);cg_random = kfoldLoss(classifier_random);if (1 - cg_random) > bestacc_randombestacc_random = 1 - cg_random;bestc_random = 2^c_random;bestg_random = 2^g_random;endwaitbar(k / num_random_search, h_random, sprintf('随机搜索已完成 %.2f%%', k / num_random_search * 100));
end
close(h_random); fprintf('Best c: %f\n', bestc_random);
fprintf('Best g: %f\n', bestg_random);c_center = log2(bestc_random);
g_center = log2(bestg_random);
c_range = 5; 
g_range = 0.3;
c_vec = linspace(c_center - c_range,c_center + c_range,10);
g_vec = linspace(c_center - g_range,c_center + g_range,10);
[c,g] = meshgrid(c_vec,g_vec);
[m,n] = size(c);
cg = zeros(m,n);
eps = 10^(-4);
v = 5; h_grid = waitbar(0, '正在通过网格搜索寻找最佳c/g参数...');
total_iterations_grid = m * n; 
current_iteration_grid = 0;
for i = 1:mfor j = 1:ntemplate = templateSVM('KernelFunction','rbf','BoxConstraint',2^c(i,j),'KernelScale',2^g(i,j));classifier = fitcecoc(Train_features,train_labels,'Learners',template,'Coding','onevsone','Verbose',0,'CrossVal','on','KFold',v);cg(i,j) = kfoldLoss(classifier); if (1 - cg(i,j)) > bestacc bestacc = 1 - cg(i,j);bestc = 2^c(i,j);bestg = 2^g(i,j);endif abs((1 - cg(i,j)) - bestacc )<=eps && bestc > 2^c(i,j) bestacc = 1 - cg(i,j);bestc = 2^c(i,j);bestg = 2^g(i,j);endcurrent_iteration_grid = current_iteration_grid + 1;waitbar(current_iteration_grid / total_iterations_grid, h_grid, sprintf('网格搜索已完成 %.2f%%', current_iteration_grid / total_iterations_grid * 100));end
end
close(h_grid); 

Decision Tree / 决策树

原理

详细原理可参考:

决策树(Decision Tree)-CSDN博客

MATLAB实现

实例代码块

1-数据导入与归一化

%% 设置训练集比例
train_ratio = 0.8; %% 设置交叉验证折数
v = 5; %% 导入数据
load('features.mat'); n = randperm(size(features,1));
train_num = floor(train_ratio * size(features,1)); 
% 训练集
train_features = features(n(1:train_num),:);
train_labels = labels(n(1:train_num),:);
% 测试集
test_features = features(n(train_num + 1:end),:);
test_labels = labels(n(train_num + 1:end),:);%% 数据归一化
[Train_features,PS] = mapminmax(train_features');
Train_features = Train_features';
Test_features = mapminmax('apply',test_features',PS);
Test_features = Test_features';

2-参数网格搜索

%% 网格搜索:调整决策树参数(深度、最小叶子节点样本数、分裂标准等)
best_depth = 180; 
best_minLeaf = 3; 
best_splitCriterion = 'gdi'; 
best_accuracy = 0;depth_vec = 50:10:150; 
minLeaf_vec = 1:10; 
splitCriteria = {'gdi', 'deviance'}; h_search = waitbar(0, '正在通过搜索寻找最佳决策树参数...');for d = depth_vecfor m = minLeaf_vecfor sc = splitCriteriatemplate = templateTree('MaxNumSplits', d, 'MinLeafSize', m, 'SplitCriterion', sc{1});classifier = fitcecoc(Train_features, train_labels, 'Learners', template, 'Coding', 'onevsone', 'Verbose', 0, 'CrossVal', 'on', 'KFold', v);cg = kfoldLoss(classifier); acc = 1 - cg; if acc > best_accuracybest_accuracy = acc;best_depth = d;best_minLeaf = m;best_splitCriterion = sc{1};endendend
end
close(h_search); fprintf('最佳深度: %d\n', best_depth);
fprintf('最佳最小叶子节点样本数: %d\n', best_minLeaf);
fprintf('最佳分裂标准: %s\n', best_splitCriterion);

3-核心代码

%% 模型
template = templateTree('MaxNumSplits', best_depth, 'MinLeafSize', best_minLeaf, 'SplitCriterion', best_splitCriterion);
model = fitcecoc(Train_features, train_labels, 'Learners', template, 'Coding', 'onevsone', 'Verbose', 0);save('my_trained_model_tree.mat', 'model');

4-后处理

%% 
[predict_label_train, ~] = predict(model, Train_features);
train_accuracy = sum(strcmp(predict_label_train, train_labels)) / length(train_labels); % 计算训练集准确度[predict_label_test, ~] = predict(model, Test_features);
test_accuracy = sum(strcmp(predict_label_test, test_labels)) / length(test_labels); % 计算测试集准确度confusion_matrix_train = confusionmat(train_labels, predict_label_train);
figure;
confusionchart(confusion_matrix_train);
title('训练集混淆矩阵');
saveas(gcf, 'confusion_matrix_tree2train.png');confusion_matrix_test = confusionmat(test_labels, predict_label_test);
figure;
confusionchart(confusion_matrix_test);
title('测试集混淆矩阵');
saveas(gcf, 'confusion_matrix_tree2test.png');disp(['训练集准确度: ', num2str(train_accuracy)]);
disp(['测试集准确度: ', num2str(test_accuracy)]);

Logistic Regression / 逻辑回归

原理

详细原理可参考:

逻辑回归(Logistic Regression)-CSDN博客

MATLAB实现

实例代码块

1-数据导入与归一化

%% 训练集比例
train_ratio = 0.85; %% 交叉验证折数
v = 5; %% 导入数据
load('features.mat'); n = randperm(size(features, 1));
train_num = floor(train_ratio * size(features, 1)); train_features = features(n(1:train_num), :);
train_labels = labels(n(1:train_num), :);test_features = features(n(train_num + 1:end), :);
test_labels = labels(n(train_num + 1:end), :);%% 数据归一化
[Train_features, PS] = mapminmax(train_features');
Train_features = Train_features';
Test_features = mapminmax('apply', test_features', PS);
Test_features = Test_features';

2-参数网格搜索

%% 网格搜索%lambda_range = logspace(-5, 5, 50); 
best_lambda = 1e-7;
best_accuracy = 0;h_grid = waitbar(0, '正在进行网格搜索调整 Lambda 参数...');for i = 1:length(lambda_range)lambda = lambda_range(i);template = templateLinear('Learner', 'logistic', 'Regularization', 'ridge', 'Lambda', lambda);cv = cvpartition(train_labels, 'KFold', v);cv_accuracy = zeros(cv.NumTestSets, 1);for j = 1:cv.NumTestSetstrain_idx = cv.training(j);test_idx = cv.test(j);model = fitcecoc(Train_features(train_idx, :), train_labels(train_idx), 'Learners', template, 'Coding', 'onevsone', 'Verbose', 0);predict_label = predict(model, Train_features(test_idx, :));cv_accuracy(j) = sum(strcmp(predict_label, train_labels(test_idx))) / length(test_idx);endmean_accuracy = mean(cv_accuracy);if mean_accuracy > best_accuracybest_accuracy = mean_accuracy;best_lambda = lambda;endwaitbar(i / length(lambda_range), h_grid, sprintf('Lambda 参数调整中... %.2f%%', i / length(lambda_range) * 100));
endclose(h_grid);
fprintf('最佳 Lambda: %f\n', best_lambda);

3-核心代码

%% 模型
template = templateLinear('Learner', 'logistic', 'Regularization', 'ridge', 'Lambda', best_lambda);
h_model = waitbar(0, '正在训练 Logistic 回归模型...');
model = fitcecoc(Train_features, train_labels, 'Learners', template, 'Coding', 'onevsone', 'Verbose', 0);
close(h_model); save('my_trained_model_logistic.mat', 'model');

4-后处理

%% 
[predict_label_train, ~] = predict(model, Train_features);
train_accuracy = sum(strcmp(predict_label_train, train_labels)) / length(train_labels); % 计算训练集准确度[predict_label_test, ~] = predict(model, Test_features);
test_accuracy = sum(strcmp(predict_label_test, test_labels)) / length(test_labels); % 计算测试集准确度confusion_matrix_train = confusionmat(train_labels, predict_label_train);
figure;
confusionchart(confusion_matrix_train);
title('训练集混淆矩阵');
saveas(gcf, 'confusion_matrix_log2_train.png');confusion_matrix_test = confusionmat(test_labels, predict_label_test);
figure;
confusionchart(confusion_matrix_test);
title('测试集混淆矩阵');
saveas(gcf, 'confusion_matrix_log2_test.png');disp(['训练集准确度: ', num2str(train_accuracy)]);
disp(['测试集准确度: ', num2str(test_accuracy)]);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/26705.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DeepSeek赋能数据治理:数字转型智慧引擎,企业数治的全新解决方案

在数字化时代&#xff0c;数据已成为企业的核心资产&#xff0c;而数据治理则是企业实现数字化转型的关键环节。然而&#xff0c;传统数据治理面临着诸多挑战&#xff0c;如数据孤岛、数据质量参差不齐、治理效率低下等。 如今&#xff0c;随着人工智能技术的飞速发展&#xf…

火山引擎AI一体机-DeepSeek版来了

2025年伊始&#xff0c;DeepSeek 在各领域尽显其能。除常态公有云部署外&#xff0c;一些企业也希望将 DeepSeek 与本地数据、业务场景相融合&#xff0c;拥抱 AI 新未来。不过&#xff0c;算力基础设施缺失、模型交付周期长、推理性能不足、数据安全合规等技术和成本问题成为了…

Hadoop之02:MR-图解

1、不是所有的MR都适合combine 1.1、map端统计出了不同班级的每个学生的年龄 如&#xff1a;(class1, 14)表示class1班的一个学生的年龄是14岁。 第一个map任务&#xff1a; class1 14 class1 15 class1 16 class2 10第二个map任务&#xff1a; class1 16 class2 10 class…

IP属地是通过卫星定位的吗?如何保护用户隐私

在数字时代&#xff0c;网络空间成为了人们日常生活不可或缺的一部分。随着社交媒体、在线服务等平台的兴起&#xff0c;用户IP属地信息的重要性日益凸显。然而&#xff0c;关于IP属地是如何确定的&#xff0c;尤其是是否通过卫星定位这一问题&#xff0c;却常常引发公众的疑问…

20250225-代码笔记03-class CVRPModel AND other class

文章目录 前言一、class CVRPModel(nn.Module):__init__(self, **model_params)函数功能函数代码 二、class CVRPModel(nn.Module):pre_forward(self, reset_state)函数功能函数代码 三、class CVRPModel(nn.Module):forward(self, state)函数功能函数代码 四、def _get_encodi…

操作系统之文件系统

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

Linux操作系统5- 补充知识(可重入函数,volatile关键字,SIGCHLD信号)

上篇文章&#xff1a;Linux操作系统5-进程信号3&#xff08;信号的捕捉流程&#xff0c;信号集&#xff0c;sigaction&#xff09;-CSDN博客 本篇Gitee仓库&#xff1a;myLerningCode/l26 橘子真甜/Linux操作系统与网络编程学习 - 码云 - 开源中国 (gitee.com) 目录 一. 可重入…

Bandicam录屏软件,设置延时录制

Bandicam软件&#xff0c;又称班迪录屏&#xff0c;是一款简单好用的电脑屏幕录制软件&#xff0c;既可以录制PPT课程视频、网课视频&#xff0c;还可以游戏攻略视频等。该软件专门用来录制电脑的桌面视频&#xff0c;目前支持2种视频文件格式&#xff1a;avi和mp4。支持全屏或…

利用@WebMvcTest测试Spring MVC应用

文章目录 1. WebMvcTest概述2. 创建Spring Boot项目3. 创建主页控制器类4. 准备图片素材5. 创建主页模板视图6. 主页控制器测试类 6.1 创建主页控制器测试类6.2 运行单元测试方法 7. 启动应用&#xff0c;查看结果 7.1 启动应用7.2 访问项目首页 8. 实战小结 1. WebMvcTest概…

Java8面试

Java 8 有哪些新特性? &#x1f40e;Java 8五大神装特性&#x1f40e; Lambda表达式&#xff08;魔法调料&#xff09; 曼波觉得像速食魔法咒语&#xff01;(๑✧◡✧๑) // 传统写法&#xff08;像冗长菜谱&#xff09; new Thread(new Runnable() {public void run() {Syst…

【前端基础】Day 7 CSS高级技巧

目录 1. 精灵图 1.1 为什么需要精灵图 1.2 精灵图&#xff08;sprites&#xff09;的使用 2. 字体图标 2.1 字体图标的产生 2.2 字体图标的优点 2.3 字体图标的下载 2.4 字体图标的引入 2.5 字体图标的追加 3. CSS三角形 4. CSS用户界面样式 4.1 更改用户鼠标样式 …

初步理解RNN和LSTM

RNN RNN&#xff08;Recurrent Neural Network&#xff0c;循环神经网络&#xff09;是一种能够处理序列数据的神经网络。这里的时序信息可以指例如对于这一句话 “我吃了一个苹果”&#xff0c;“苹果” 的词性和意思&#xff0c;在这里取决于前面词的信息&#xff0c;如果没…

【华为OD机考】华为OD笔试真题解析(18)--找出通过车辆最多的颜色

题目描述 在一个狭小的入口&#xff0c;每秒只能通过一辆车&#xff0c;假如车辆的颜色只有3种&#xff0c;找出N秒内经过的最多颜色的车辆数量&#xff0c;三种颜色编号为0、1、2。 输入描述 第一行输入的是通过的车辆颜色信息&#xff0c;[0,1,1,2]代表4秒钟通过的车辆颜色…

基于POI的Excel下拉框自动搜索,包括数据验证的单列删除

目录 目标 例子 1.搜索下拉框页 2.数据源页 3.效果 代码以及注意事项 1.代码 2.注意事项 1.基于Excel的话&#xff0c;相当于加入了一个【数据验证】 2.代码中的一些方法说明 目标 期望在Excel利用代码创建具备自动搜索功能的下拉框 例子 1.搜索下拉框页 2.数据源…

【最后203篇系列】010 关于矩阵的一点思考

说明 今天拿起一本矩阵的书又翻了翻&#xff0c;毕竟AI搞到最后还得是数学。 我是感觉自己高数始终有点学的迷迷糊糊的&#xff0c;就打算这一年慢慢把矩阵部分扫一遍&#xff0c;毕竟这快肯定是实打实有用的。其他高级部分就等我发财之后再说了&#xff0c;哈哈。 内容 今…

(动态规划 最长递增的子序列)leetcode 300

这道题我第一眼反应就是暴力&#xff0c;但是暴力的话就是n*n-1*n-2*...n-(n-1) 也就是O(n^n)dfs做绝对超时 贪心也不行&#xff0c;这里是子序列&#xff0c;要考虑在ni的范围内考虑多种路线取最优&#xff0c;所以用动态规划 如何用动态规划呢&#xff1f; 答&#xff1a;…

本地大模型编程实战(26)用langgraph实现基于SQL数据构建的问答系统(5)

本文将将扩展上一篇文章完成的 langgraph 链&#xff0c;继续使用基于 langgraph 链 &#xff0c;对结构化数据库 SQlite 进行查询的方法。该系统建立以后&#xff0c;我们不需要掌握专业的 SQL 技能&#xff0c;可以用自然语言询问有关数据库中数据的问题并返回答案。主要完善…

Linux---共享内存

1.ipcs命令 IPC机制是一个让人烦恼的问题&#xff1a;编写错误的程序或因为某些原因而执行失败的程序将把它的IPC资源&#xff08;如消息队列中的数据&#xff09;遗留在系统里&#xff0c;并且这些资源在程序结束后很长时间让然在系统中游荡&#xff0c;这导致对程序的新调用…

RAG 阿里云

RAG-阿里云Spring AI Alibaba官网官网 RAG-阿里云Spring AI Alibaba官网官网 AI应用跑起来&#xff0c;取消一下航班的操作666

M4 Mac mini运行DeepSeek-R1模型

前言 最近DeepSeek大模型很火&#xff0c;实际工作中也有使用&#xff0c;很多人觉得需要很好的显卡才能跑起来&#xff0c;至少显存需要很高&#xff0c;但实际上一般的核显机器也能跑起来&#xff0c;只不过内存要求要大&#xff0c;对于个人而言&#xff0c;实际上Mac M芯片…