当前位置: 首页 > news >正文

01_svm_二分类

环境

  • MinGW:7.3.0
  • Dlib:20.0

dlib 库SVM 二分类

模型训练

dlib库二分类问题中1表示正类,-1表示反类(这一点与其他库不太一样)

训练模型前需要将样本数据转换为std::vector<dlib::matrix<double,T,1>>形式(matrix 是一个多维数组的模板类,可以用来表示不同类型的矩阵)

typedef dlib::matrix<double,30,1> cancer_type; // 定义一个矩阵类型cancer_type,用于存储样本数据
// 加载数据
vector<BreastCancer> vec = LoadCancer(pfile);  // 通过文件加载数据(sklearn中的breast_cancer.csv)
vector<cancer_type> train_datas;
vector<double> train_labels;
for (int i = 0; i < vec.size(); i++)
{BreastCancer cancer = vec.at(i);cancer_type cc_type;for (int j = 0; j < 30; j++){cc_type(j) = cancer.ft[j];}train_datas.push_back(cc_type);train_labels.push_back(cancer.tag > 0 ? 1 : -1); // 注意正、反类的取值
}

svm算法对数据缩放敏感(可以参考蜥蜴书《Python机器学习基础教程》),这里也对数据进行缩放处理

dlib::vector_normalizer<cancer_type> normalizer; // 数据预处理,使不同特征的量纲统一,帮助模型训练时更高效收敛。// sklearn中也称这种预处理算法为无监督算法
normalizer.train(train_datas);
for (int i = 0; i < train_datas.size(); i++)
{train_datas[i] = normalizer(train_datas[i]);
}

创建模型并训练

typedef dlib::radial_basis_kernel<cancer_type> kernel_type; // rbf 径向基函数核,主要用于支持向量机(SVM)、高斯过程回归等机器学习算法,能够实现输入空间的非线性映射。
typedef dlib::decision_function<kernel_type> dec_func_type; // dlib::decision_function是dlib库中用于支持向量机(SVM)分类器决策的核心接口,其主要功能是通过训练后的模型对新样本进行分类或回归预测
typedef dlib::normalized_function<dec_func_type> func_type; // 用于对决策函数进行归一化处理的工具类,主要用于支持向量机(SVM)等分类器的输出标准化。typedef dlib::probabilistic_decision_function<kernel_type> pro_func_type; // 与decision_function类似,但输出的是概率值
typedef dlib::normalized_function<pro_func_type> p_func_type;// 打乱数据
dlib::randomize_samples(train_datas, train_labels);
// 创建训练器
dlib::svm_c_trainer<kernel_type> trainer;
trainer.set_c(10);                     // 设置C参数
trainer.set_kernel(kernel_type(0.01)); // 设置gamma参数
// 训练模型
p_func_type learned_func;
learned_func.normalizer = normalizer;
// learned_func.function =  trainer.train(train_datas, train_labels); // 训练模型
learned_func.function = dlib::train_probabilistic_decision_function(trainer, train_datas, train_labels, 3);// 训练模型,数值3表示对样本数据的折叠数,可以参考sklearn中的模型评估

模型验证

int ok_count = 0;
for (int i = 0; i < vec.size(); i++)
{BreastCancer cancer = vec.at(i);cancer_type cc_type;for (int j = 0; j < 30; j++){cc_type(j) = cancer.ft[j];}double ret_d = learned_func(cc_type);cout << "probabilistic : " << ret_d << endl; // 概率值,大于0.5的是正类,否则视为反类int ret = ret_d > 0.5 ? 1 : 0;if (ret == cancer.tag)ok_count += 1;
}
cout << "accurary:" << (ok_count * 1.0) / vec.size() << endl;

模型保存与加载

通过dlib::serialize可以保存模型

dlib::serialize("svm_cancer_model.dat") << learned_func; // 保存模型到svm_cancer_model.dat

通过dlib::deserialize加载模型

p_func_type learned_func; //
dlib::deserialize(file_name) >> learned_func;

其他

加载breast_cancer.csv数据

typedef struct {float ft[30];int tag;
} BreastCancer;vector<BreastCancer> LoadCancer(const string &fpath)
{vector<BreastCancer> vec;fstream input_file(fpath);string line;if (input_file.is_open()){getline(input_file, line); // 跳过头while (getline(input_file, line)){vector<string> sp_vec = SplitString(line, ',');if (sp_vec.size() == 0)continue;BreastCancer cancer;for (int i = 0; i < 30; i++){cancer.ft[i] = atof(sp_vec.at(i).c_str());}cancer.tag = atoi(sp_vec.at(30).c_str());vec.push_back(cancer);}}return vec;
}vector<string> SplitString(const string &str, char delim)
{vector<string> vec;istringstream iss(str);string token;while (getline(iss, token, delim)){vec.push_back(token);}return vec;
}
http://www.dtcms.com/a/508720.html

相关文章:

  • 莱芜定制网站建设公司培训机构排名前十
  • 基于单片机的四沟道步进电机玉米补种机设计与实现
  • 网络安全设备:入侵检测系统(IDS)、入侵防御系统(IPS)的配置与使用
  • 阿里云 oss做网站吉林省住房建设保障厅网站
  • 鸿蒙Next Performance Analysis Kit:打造极致流畅的应用体验
  • SkyWalking运维实战指南:配置解析与日常运维全攻略
  • 网站建设目标初步目标wordpress多少钱一年
  • 济南网站搜索排名深圳知名网站设计公司排名
  • 最好的网站模板用树莓派做网站服务器好吗
  • Java 25 中的 6 个新特性解读
  • 力扣hot100做题整理91-100
  • 【FPGA】设计流程——仿真验证
  • 做黑彩网站图片脑叶公司
  • php网站建设实例最佳搜索引擎磁力吧
  • BearPi小熊派 鸿蒙入门开发笔记(4)
  • 做网站排名收益做网站主页上主要放哪些内容
  • 如何做网站流量买卖2017网站发展趋势
  • nvidia gr00t运行服务和客户端,以及模型微调的时候碰到模型无法下载的问题,解决方法是下载离线的模型,然后修改路径,nvidia gr00t模型微调
  • 网站建设费用贵不贵房屋和建设工程信息平台
  • 企业网站源码模板网站建设与维护方式
  • lora与模型的关系(小白入门了解)
  • xtuoj 公共的数
  • 删除西部数码网站管理助手嘟嘟嘟在线视频免费观看
  • 做网站要会写代码吗网站建设硬件投入表
  • 有官网建手机网站吗做自己域名的网站很贵吗
  • 网站建设方案书含合同做网站 内网怎么映射
  • jmeter性能测试完美入门
  • 余姚做网站的公司建筑人才网平台
  • 娱乐类网站wordpress男同
  • VSCode 配置 SSH 远程连接