鱼C论坛

 找回密码
 立即注册
查看: 1993|回复: 0

机器学习之自助法划分数据C++实现

[复制链接]
发表于 2019-7-31 22:33:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Julia999 于 2019-8-1 09:03 编辑
最近在弄一个项目,需要用C++实现SVM,但是在数据划分的时候出现了问题,大多SVM的实现都使用python,所以数据的划分也少有用C++实现。我重新看了自助法的定义,用C++实现了自助法,在这分享~
  1. #include<iostream>
  2. #include<string>
  3. #include<fstream>
  4. #include<sstream>
  5. #include<stdlib.h>
  6. #include<time.h>
  7. #include<vector>
  8. using namespace std;

  9. double x[306][3];  //数据集 不带标签
  10. double y[306];     //标签集

  11. vector<vector<double>> v_x;
  12. vector<double> v_y;

  13. vector<vector<double>> traindatas;
  14. vector<double> traindatasy;
  15. vector<vector<double>> testdatas;
  16. vector<double> testdatasy;

  17. vector<int> index3;  //放重复的traindatas下标
  18. vector<int> index1;  //放traindatas中的下标,不重复的
  19. vector<int> index2;  //放置testdatas的所有标签
  20. vector<int> index4;   //放置抽取到的训练集标签,不重复的


  21. int toNum(string str)//Enclave无法接受string类型数据
  22. {
  23.         int ans = 0;
  24.         for (int i = 0; i < str.length(); i++)
  25.         {
  26.                 ans = ans * 10 + (str[i] - '0');
  27.         }
  28.         return ans;
  29. }

  30. void loaddata(string path)
  31. {
  32.         ifstream Filein;
  33.         try { Filein.open(path); }
  34.         catch (exception e)
  35.         {
  36.                 cout << "File open failed!";
  37.         }

  38.         string line;
  39.         int data_num = 0;
  40.         while (getline(Filein, line)) {
  41.                 int before = 0;
  42.                 int cnt = 0;
  43.                 data_num++;
  44.                 //cout << data_num << endl;
  45.                 for (unsigned int i = 0; i < line.length(); i++) {
  46.                         if (line[i] == ',' || line[i] == '\n') {
  47.                                 string sub = line.substr(before, i - before);
  48.                                 before = i + 1;
  49.                                 x[data_num - 1][cnt] = toNum(sub);
  50.                                 cnt++;
  51.                         }
  52.                 }
  53.                 //Data[data_num - 1][cnt] = toNum(line.substr(before, line.length()));
  54.                 y[data_num - 1] = toNum(line.substr(before, line.length()));
  55.         }
  56.         cout << "data loading done.\nthe amount of data is: " << data_num << endl;
  57. }

  58. vector<double>temp;
  59. void tovector(double x[306][3])
  60. {
  61.         for (int i = 0; i < 306; i++)
  62.         {
  63.                 for (int j = 0; j < 3; j++)
  64.                 {
  65.                         temp.push_back(x[i][j]);
  66.                 }
  67.                 v_x.push_back(temp);
  68.                 temp.clear();
  69.         }
  70. }

  71. void getindex1()   
  72. {
  73.         srand((unsigned int)time(0));

  74.         for (int i = 0; i < 306; i++)
  75.         {
  76.                 if (i == 0)
  77.                 {
  78.                         int num = rand() % 306;
  79.                         index1.push_back(num);
  80.                         index3.push_back(num);
  81.                 }
  82.                 else
  83.                 {
  84.                         int temp = rand() % 306;
  85.                         index3.push_back(temp);
  86.                         vector<int>::iterator ret;
  87.                         ret = std::find(index1.begin(), index1.end(), temp);
  88.                         if (ret == index1.end())
  89.                                 index1.push_back(temp);
  90.                 }
  91.         }
  92. }


  93. void getindex2()
  94. {
  95.         vector<int>::iterator ret;
  96.         for (int i = 0; i < 306; i++)
  97.         {
  98.                 ret = std::find(index4.begin(), index4.end(), i);
  99.                 if (ret == index4.end())  //说明在index1中没有找到i
  100.                 {
  101.                         index2.push_back(i);
  102.                 }
  103.         }
  104. }

  105. void gettraindatas()
  106. {
  107.         for (int i = 0; i < index3.size(); i++)
  108.         {
  109.                 for (int j = 0; j < 3; j++)
  110.                 {
  111.                         temp.push_back(x[index3[i]][j]);
  112.                 }
  113.                 traindatas.push_back(temp);
  114.                 temp.clear();
  115.         }

  116.         for (int i = 0; i < index3.size(); i++)
  117.         {
  118.                 traindatasy.push_back(y[index3[i]]);
  119.         }
  120. }

  121. void getindex4()  //得到index4,也就是获取了所有抽到的行数
  122. {
  123.         if (index4.empty()) //空
  124.         {
  125.                 for (int i = 0; i < index1.size(); i++)
  126.                 {
  127.                         index4.push_back(index1[i]);
  128.                 }
  129.         }
  130.         else
  131.         {
  132.                 for (int i = 0; i < index1.size(); i++)
  133.                 {
  134.                         vector<int>::iterator ret;
  135.                         ret = std::find(index4.begin(), index4.end(), index1[i]);
  136.                         if (ret == index4.end())
  137.                                 index4.push_back(index1[i]);
  138.                 }
  139.         }
  140.        
  141. }

  142. //void toarray(double **_traindatas,double *_traindatasy)
  143. //{
  144. //        for (int i = 0; i < index1.size(); i++)
  145. //        {
  146. //                for (int j = 0; j < 3; j++)
  147. //                {
  148. //                        _traindatas[i][j] = traindatas[i][j];
  149. //                }
  150. //        }
  151. //
  152. //        for (int i = 0; i < index1.size(); i++)
  153. //        {
  154. //                _traindatasy[i] = traindatasy[i];
  155. //        }
  156. //}

  157. void clearall()
  158. {
  159.         vector <vector<double>>().swap(traindatas);
  160.         vector<double>().swap(traindatasy);
  161.         vector<int>().swap(index3);  //放重复的traindatas下标
  162.         vector<int>().swap(index1);  //放traindatas中的下标,不重复的
  163.         vector<int>().swap(index2);
  164. }


  165. void gettestdatas()  //获取测试集
  166. {
  167.         for (int i = 0; i < index2.size(); i++)
  168.         {
  169.                 for (int j = 0; j < 3; j++)
  170.                 {
  171.                         temp.push_back(x[index2[i]][j]);
  172.                 }
  173.                 testdatas.push_back(temp);
  174.                 temp.clear();
  175.         }

  176.         for (int i = 0; i < index2.size(); i++)
  177.         {
  178.                 testdatasy.push_back(y[index2[i]]);
  179.         }
  180. }



  181. int main()
  182. {
  183.         //1 先将读取的data全部转换成vector类型的
  184.         loaddata("C:\\Users\\YY\\Desktop\\haberman1.txt");
  185.         tovector(x);
  186.         /*for (int i = 0; i < 306; i++)
  187.         {
  188.                 for (int j = 0; j < 3; j++)
  189.                 {
  190.                         cout << v_x[i][j] << "  ";
  191.                 }
  192.                 cout << endl;
  193.         }*/
  194.         for (int i = 0; i < 306; i++)
  195.         {
  196.                 cout << "循环第" << i+1 << "次" << endl;
  197.                 getindex1();
  198.                 cout << "index1:" << index1.size() << endl;
  199.                 cout << "index3:" << index3.size() << endl;
  200.                 //把抽到的行数放进index4中
  201.                 getindex4();
  202.                 cout << "index4:" << index4.size() << endl;
  203.                 /*getindex2();
  204.                 cout << "index2:" << index2.size() << endl;*/
  205.                 gettraindatas();
  206.                 double _traindatas[306][3];
  207.                 double _traindatasy[306];
  208.                 for (int i = 0; i < 306; i++)
  209.                 {
  210.                         _traindatasy[i] = traindatasy[i];
  211.                         for (int j = 0; j < 3; j++)
  212.                         {
  213.                                 _traindatas[i][j] = traindatas[i][j];
  214.                         }
  215.                 }
  216.                 if (i == 305)
  217.                 {
  218.                         cout << endl;
  219.                         cout << endl;
  220.                         cout << endl;
  221.                         getindex2();  //获取到测试集的行数
  222.                         cout << "index2:" << index2.size() << endl;

  223.                         //获取测试集:
  224.                         gettestdatas();
  225.                         cout << "打印测试集:" << endl;
  226.                         for (int i = 0; i < index2.size(); i++)
  227.                         {
  228.                                 for (int j = 0; j < 3; j++)
  229.                                 {
  230.                                         cout << testdatas[i][j] << "  ";
  231.                                 }
  232.                                 cout << endl;
  233.                         }
  234.                 }
  235.                 //将所有容器全部清空
  236.                 clearall();
  237.         }

  238.        


  239.         ////2 再用随机抽取的方法,获取抽取的行数index1和index3,将抽取的行数放在一个一维的vector中
  240.         //getindex1();
  241.         //cout << "index1:" << index1.size() << endl;
  242.         //cout << "index3:" << index3.size() << endl;
  243.         ////3 利用v_index1获取行数v_index2,将其存在一个一维的vector中
  244.         //getindex2();
  245.         //cout << "index2:" << index2.size() << endl;

  246.         ////4 利用v_index1和v_x来找到对应的行数的数据集,将找到的数据集作为测试集放在一个二维的vector traindatas中
  247.         //gettraindatas();

  248.         ////5 将产生的traindatas转成一个二维数组
  249.         //double _traindatas[306][3];
  250.         //double _traindatasy[306];
  251.         ////double **_traindatas = new double*[index1.size()];  //用来保存将v_traindatas转换成的数组
  252.         ////for (int i = 0; i < index1.size(); i++)
  253.         ////{
  254.         ////        _traindatas[i] = new double[3];
  255.         ////}
  256.         ////double *_traindatasy = new double[index1.size()];
  257.         ////toarray(_traindatas, _traindatasy);  //将v_x转换成了数组的_traindatas
  258.         //for (int i = 0; i < 306; i++)
  259.         //{
  260.         //        _traindatasy[i] = traindatasy[i];
  261.         //        for (int j = 0; j < 3; j++)
  262.         //        {
  263.         //                _traindatas[i][j] = traindatas[i][j];
  264.         //        }
  265.         //}

  266.         /*for (int i = 0; i < 306; i++)
  267.         {
  268.                 for (int j = 0; j < 3; j++)
  269.                 {
  270.                         cout << _traindatas[i][j] << "  " << endl;
  271.                 }
  272.                 cout << endl;
  273.         }*/

  274.         system("pause");
  275.         return 0;
  276. }

  277. /*
  278. 全部的操作用vector
  279. 1 先将读取的data全部转换成vector类型的
  280. 2 再用随机抽取的方法,获取抽取的行数v_index1,将抽取的行数放在一个一维的vector中
  281. 3 利用v_index1获取行数v_index2,将其存在一个一维的vector中
  282. 4 利用v_index1和v_x来找到对应的行数的数据集,将找到的数据集作为测试集放在一个二维的vector v_x中
  283. 5 将产生的traindatas转成一个二维数组

  284. */
复制代码


haberman1.zip

984 Bytes, 下载次数: 0

售价: 30 鱼币  [记录]  [购买]

数据集

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-28 23:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表