您的位置:首页 > 大数据

按照比例将大数据按照类型比例,随机提取测试数据

2014-02-26 00:32 405 查看


问题描述

之前因为测试跌倒,需要数据训练,但是采集到的数据比例相差极大,非摔倒的容易采集,但是摔倒的数据比较麻烦。还要采集很多假摔的数据,这样导致最后摔倒,非摔倒,假摔的比例严重出现问题,最终影响训练效果。所以我需要将数据按照比例,从原始数据中提取数据来训练。并且我还得保证能够训练的数据量最大。尽量少删除数据。


解决方法

我想到的方法就是从利用n选m 的随机数的方式。时间是O(n)。但是有个前提条件是知道数据集的大小,每个类别的数量大小。另外首先利用比例计算出每个类别最后的数量。

先说一下计算移除数据的方式。
s1. 利用选择标志的方式,选出按照比例最小的类别,用smallest_index记录。初始化smallest_index=0.percent 表示最后的比例。from[] 表示原始的数据中每个类别的数据量

s2. 遍历i =[0 , size) size 表示总共的类别数 ,如果 i 的数据量 / smallest_index 的数据量 < percent[i] /percent[smallest_index] 说明i 是比smallest_index 比例更小的类别。用smallest_index = i ;

s3. 利用smallest_index 遍历 i = [0,size). 计算remove[] 的数量:

remove[i] = from[i] - (from[smallest_index] * percent[i] / percent[smallest_index]).


然后根据移除的数据量,来得到按照比例的训练集。 s1. 从文件中读取一条记录record, s2. if(record.is_empty) 转到s6. s3. 根据record的类型,转化为int 型的数据 i . s4. 判断remove[i] > 0 && rand() % sourcetemp[i] < remove[i] 为真,则remove[i]–. 否则将record写入输出文件中。 s5. sourcetemp[i]– . 返回s1.

s6. 退出

源代码如下:
/**

* 将from 的数据 按照percent 的比例缩放。 去除其中数据

*/

void adjustNumsByPercentage(int& from[],int& remove[] ,const float percent[],int size ){

int smallest_index = 0 ;

for(int i = 0 ; i != size ; ++ i){

if(from[i] / from[smallest_index] < percent[i] / percent[smallest_index] ){

smallest_index = i ;

}

}

for(int i = 0 ; i != size ; ++ i){

remove[i] = from[i] - ( from[smallest_index] * percent[i] / percent[smallest_index]) ;

}


}


分类写入的代码:
void RandomAdjustDataSet::adjust(){

DataRecord record = reader->ReadRecordFromFile() ;

int removetemp [3];

int sourcetemp [3];

memcpy(removetemp,remove_nums,3 * sizeof(int));

memcpy(sourcetemp,source_nums,3 * sizeof(int));


srand(time(0));

while(!record.is_empty){

int i = 1;

if(record.activity == "1"){

i = 1;

}else if(record.activity == "2"){

i = 2;

}else{

i = 3;

}


if(removetemp[i-1] >0 && rand() % sourcetemp[i-1] < removetemp[i-1] ){

removetemp[i-1]  -- ;

//去除

}else{

//

WriteIntoFile(out,record);

}

sourcetemp[i-1] --;

record = reader->ReadRecordFromFile();

}


out.close();

}


当然利用取出的方式,计算每个类别取出的数量,是一样的。


疑问

1.不知道有没有更好的方式解决这个问题?

2.如果不知道原始数据中,每个类别的数量,最佳算法的运行时间是怎样的?

个人博客地址:http://boyhouzhi.com/2014/01/17/random-adjust-data-set-by-percent/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法