C++实现二维数组按行乱序(UCI iris数据集整理)

在写BP神经网络时候碰到的小问题:UCI iris数据集是按顺序排的,我取的是前130行训练,后20行测试。因为到最后训练也是第三类,测试也都是第三类,是对于第三类的局部最优解,所以最后不用几轮训练就能达到>0.9的准确率,但全局上就不对。
在这里插入图片描述
于是写了个小程序随机改数据集的训练顺序。
因为只改行的顺序,对应的列不变。思想是用random的shuffle函数随机改行号,再把后面的列对应过去,以此实现乱序。
UCI iris数据集:
https://download.csdn.net/download/pvfeldt/18123868?spm=1001.2014.3001.5503

代码
下面是代码,有些地方写的不是很好,比如实现读文件时候数据和分类分开存读了两遍,如果是开个全局变量或者搞个class就可以避免;或者是这个想法本身就有点麻烦,水平有限见谅。

#include <iostream>
#include <fstream>
#include <random>
#include <vector>
#include <algorithm>
#include <chrono>
using namespace std;

//read file,store 4 feature columns in 2D double array;
double** irisData(string filename, int lines)
{
    ifstream file(filename, ios::binary);
    double** irisData = new double* [lines];
    for (int i = 0; i < lines; i++)
    {
        irisData[i] = new double[4];
    }
    for (int i = 0; i < lines; i++)
    {
        double numTmp = 0;
        char commaTmp = ' ';
        string classificationTmp = " ";
        for (int j = 0; j < 4; j++)
        {
            file >> numTmp >> commaTmp;
            irisData[i][j] = numTmp;
        }
        file >> classificationTmp;
    }
    file.close();
    return irisData;
}

//read file,store classification column in 1D string array;
string* irisClassification(string filename, int lines)
{
    ifstream file(filename, ios::binary);
    string* irisClassification = new string[lines];
    for (int i = 0; i < lines; i++)
    {
        double numTmp = 0;
        char commaTmp = ' ';
        string classificationTmp = " ";
        for (int j = 0; j < 4; j++)
        {
            file >> numTmp >> commaTmp;
        }
        file >> classificationTmp;
        irisClassification[i] = classificationTmp;
    }
    file.close();
    return irisClassification;
}

//randomly change the line index;
vector<int> changeLineIndexOrder(int lines)
{
    vector<int> lineIndex(lines);
    for (int i = 0; i < lines; i++)
    {
        lineIndex[i] = i;
    }
    unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
    shuffle(lineIndex.begin(), lineIndex.end(), default_random_engine(seed));
    return lineIndex;
}

//change feature array according to the change of line index;
double** changeDataOrder(double** irisD, vector<int> lineI, int lines)
{
    double** newIrisData = new double* [lines];
    for (int i = 0; i < lines; i++)
    {
        newIrisData[i] = new double[4];
    }
    for (int i = 0; i < lines; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            newIrisData[i][j] = irisD[lineI[i]][j];
        }
    }
    return newIrisData;
}

//change classification array according to the change of line index;
string* changeClassificationOrder(string* irisC, vector<int> lineI, int lines)
{
    string* newIrisClassification = new string[lines];
    for (int i = 0; i < lines; i++)
    {
        newIrisClassification[i] = irisC[lineI[i]];
    }
    return newIrisClassification;
}

int main()
{
    int lines = 150;
    double** irisDataReading = irisData("iris.data", lines);
    string* irisClassificationReading = irisClassification("iris.data", lines);
    vector<int> lineIndex = changeLineIndexOrder(lines);
    double** newIrisDataReading = changeDataOrder(irisDataReading, lineIndex, lines);
    string* newIrisClassificationReading = changeClassificationOrder(irisClassificationReading, lineIndex, lines);

    cout << "original data sequence:" << endl;
    for (int i = 0; i < lines; i++)
    {
        cout << i << "  ";
        for (int j = 0; j < 4; j++)
        {
            cout << irisDataReading[i][j] << "  ";
        }
        cout << irisClassificationReading[i] << endl;
    }
    
    cout << "changed data sequence:" << endl;
    for (int i = 0; i < lines; i++)
    {
        cout << lineIndex[i] << "  ";
        for (int j = 0; j < 4; j++)
        {
            cout << newIrisDataReading[i][j] << "  ";
        }
        cout << newIrisClassificationReading[i] << endl;
    }


    for (int i = 0; i < lines; i++)
    {
        delete[] irisDataReading[i];
        delete[] newIrisDataReading[i];
    }
    delete[] irisDataReading;
    delete[] newIrisDataReading;
    delete[] irisClassificationReading;
    delete[] newIrisClassificationReading;

    system("pause");
    return 0;
}

Over.

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二维人工数据集是指由人工生成的二维数据集,其目的是用于模式识别和机器学习算法的测试和验证。这种数据集通常由人工设置的特征和标签组成,使研究人员能够针对特定问题设计和评估算法。 与之相对的是 UCI 真实数据集,它是指由 UCI Machine Learning Repository(UCI机器学习库)提供的真实世界数据集。这些数据集收集并整理了各种领域的真实数据,包括医疗、金融、社交网络等等,并且这些数据集已经经过了匿名化处理以保护数据隐私。 二维人工数据集UCI 真实数据集在数据来源、生成方式和用途方面存在差异。二维人工数据集是由人工生成的,主要用于验证和比较算法的性能。由于数据是人工设定的,研究人员可以控制数据的分布、相关性等特性。这种数据集常常被用来构建简单的模型和进行初步的算法调试。 而 UCI 真实数据集则是通过真实领域的数据采集获得的,具有更广泛的应用背景和更真实的特征。这些数据集对于研究人员、学生和数据科学家来说非常有价值,可以用来研究真实世界中的问题,并开发出适用于实际应用的算法和模型。 总的来说,二维人工数据集UCI 真实数据集在研究和实践中都具有重要的作用。二维人工数据集适用于初步的算法验证和性能比较,而 UCI 真实数据集则更适合于真实世界问题的研究和应用。研究人员可以根据具体的需求选择适合的数据集来进行相关工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值