按照比例将大数据按照类型比例,随机提取测试数据
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/
相关文章推荐
- 动易2006序列号破解算法公布
- C#数据结构与算法揭秘二
- 浅析STL中的常用算法
- JavaScript 组件之旅(二)编码实现和算法
- java数据结构和算法学习之汉诺塔示例
- python基础教程之python消息摘要算法使用示例
- php的hash算法介绍
- 将15位身份证补全为18位身份证的算法示例详解
- C++算法系列之日历生成的算法代码
- 1 2 3 4 5 6 7 8 9 = 110的java实现
- Sedgewick之巨著《算法》,与高德纳TAOCP一脉相承
- 【代码】Pythonの代码片段
- STL中算法
- 数据结构&算法学习
- 算法的时间复杂度
- 算法导论:选择排序的原理与实现
- PHP实现四种常用的排序算法
- 图解插入排序算法
- 一些常见算法的JavaScript实现
- 平方根sqrt()函数的底层算法效率