一、实验目的和要求
1. 实验目的
(1) 熟悉机器学习数据处理过程
(2) 使用一种机器学习算法进行数据分类或回归
2. 实验要求
使用a1a数据集进行分类,使用线性回归和对数几率回归。注意数据集中的标签、稀疏处理。完成以下内容:
(1)完成a1a数据集的读写操作。根据a1a数据集文件,写一个数据加载函数,将数据集加载到内存中,数据采用矩阵形式存储。写一个数据保存函数,将内存中的数据集保存为LIBSVM的数据集格式。
(2)对数据集a1a进行对数几率回归算法进行分类,分别输出训练集和测试集上的准确率。
P.S. a1a数据集,其原型为UCI的Adult Data Set ,其大概意思是根据人的特征来判断你是否每年的工资大于50k,所以这是一个二分分类问题。 a1a数据集对其进行了简化,其一共有123个特征,如下所示为其一行的数据-1 5:1 6:1 17:1 21:1 35:1 40:1 53:1 63:1 71:1 73:1 74:1 76:1 80:1 83:1,其中-1表示未能超过50k(即负类,实际编程可以置为0),接着我们可以初始化一个一行零向量(1,123),5:1表示第5个位置为1,以下类推……这样我们对其数据就有了个大概认识。
参考 http://blog.youkuaiyun.com/Solitarily/article/details/79646530
二、实验仪器和设备
CPU:Inter(R) Core(TM)i5-7300HQ CPU@2.50GHz 2.50GHz
内存:8.00GB
硬盘:128G 机械硬盘 + 昱科(HGST)1TB 7200转32M SATA6Gb/s
显卡:GTX1050
Windows 10 64位,Visual Studio2017,OpenCV 3.4.1
三、实验过程
1. a1a数据集的载入与保存
(1)a1a数据集在文件中的格式为:标签 维度索引:数据值
例如:
(2)a1a数据集在内存中的格式为
cv::Mat (矩阵)
(3)载入数据集的原理与实现
分为以下步骤(以训练集为例):
函数声明:void loadDataSet(cv::Mat &a, cv::Mat &b, string readfileAddress);
1.定义存储矩阵并初始化:
cv::Mat labels = cv::Mat::zeros(1605,1, CV_64F); //标签矩阵 样本数量1605
cv::Mat sample = cv::Mat::zeros(1605, 124, CV_64F);//共123种特征 +1列b
2.读取文件(按行读取),存储标签:
getline(in, buffer);
int num = atoi(buffer.substr(0, 2).c_str());
if(num == 1)
a.at<double>(count, 0) = num; //存储label
else if(num == -1)
a.at<double>(count, 0) = 0; //-1 标签存储为0
3.处理维度索引,并存入样本矩阵:

这篇博客主要介绍了如何使用C++手工编写程序实现逻辑回归,对UCI的a1a数据集进行分类。实验内容包括数据的读写、逻辑回归算法的原理和实现,以及实验过程中遇到的问题与解决方案。博主通过实验展示了在不同迭代次数和学习速率下,逻辑回归模型在训练集和测试集上的精确率变化。
最低0.47元/天 解锁文章
376

被折叠的 条评论
为什么被折叠?



