一种基于CUDA的属性约简方法
技术领域
本发明涉及特征选择领域,尤其是一种基于CUDA的属性约简方法。
背景技术
随着高维数据的不断积累增多,如多媒体图像视频、航天航空数据、生物特征、金融时间序列等,特征选择成为机器学习、数据挖掘和模式识别中的重要预处理步骤。在实际的应用中,获得数据后通常先进行特征选择,然后再训练模型。特征选择能够剔除不相关和冗余的特征,减少特征个数,从而大大减少了计算和存储开销,同时提高了机器学习的效率。另一方面,选取出真正有用的特征简化了模型,一定程度上增强了学习结果的可理解性。
1982年,一种非常有效的、可用于数据处理的软计算工具,粗糙集理论被波兰学者Z.Pawlak提出。该方法能够有效地处理具有不确定、不完全、不精确关系的数据,现已被广泛的应用于特征选择方法,并逐渐发展成一套重要的特征选择理论框架。基于粗糙集理论的特征选择,也称为属性约简,它是在保持原始数据的属性区分能力不变的前提下,选择具有最小特征(属性)数的特征子集。
传统的属性约简方法在数据量较少时是可行的,但是当面对的数据样本多、纬度高时,由于空间和计算能力的限制,传统方法往往很低效甚至无法处理,如何有效地改进属性约简方法的效率已成为迫切需要解决的问题。近年来,面向大规模数据进行属性约简得到了越来越多学者的关注。2003年Wang等把大的数据集划分成小数据集,分配到不同的客户机上并行计算约简,最后得到所有约简。2009年肖大伟等将并行计算的思想融入于基于粗糙集理论的快速属性约简中,将属性约简任务划分到多个处理器中同时处理,从而大大提高了属性约简的效率。2010年Yang将决策表分为分割为多个子决策表,利用MapReduce并行计算框架并行计算每个子决策表的约简,然后汇总各个约简,最后再删除冗余的属性,由于子决策表之间没有互相交换信息,所以不能保证并行约简的结果和串行约简的结果相同。2013年Zhang等在Hadoop云平台上实现了基于四种不同属性重要度的并行启发式属性约简方法,并行约简的结果和串行约简的结果相同。2014年Qian等在MapReduce并行计算环境下,通过并行计算等价类和并行计算属性重要度来加速属性约简方法。2015年Qian等讨论了不同粒度层次下分层决策表之间的关系,实现了数据和任务并行的属性约简方法。2016年Zhang等为了减少Hadoop HDFS文件读写的耗时,在基于内存的并行计算平台Spark下,通过数据并行的方式实现了一个特征子集的重要度的并行计算,通过多线程任务并行的方式实现了多个特征子集重要度的并行计算,同时从粒度计算的角度加速了等价类的求解过程。
现存的高效的属性约简方法均通过Hadoop或Spark集群将任务分发到多个节点来实现并行计算,计算节点越多,并行化程度越高。但是由于其高昂的成本以及复杂的架构使得其使用范围有限,在单机或者少量计算节点上仍然无法快速地进行约简。为此,本发明使用CUDA编程模型,将CPU串行计算和GPU并行计算相融合,实现了GPU的高性能计算能力和CPU的分支运算能力相结合,充分利用了硬件资源,即使在单机环境下也能快速进行属性约简。
发明内容
鉴于现有的属性约简方法存在的问题,本发明的目的是提供一种以数据并行的策略充分利用GPU计算资源,提高属性约简效率的方法。
实现本发明目的的技术方案如下:
一种基于CUDA的属性约简方法,包括
步骤1:去除数据集中含有缺失值的数据对象,离散化连续的属性,生成决策表S=(U,CD),其中U={x1,x2,,xn}代表对象集,C={c1,c2,,cm}代表条件属性集,D代表决策属性集,n为对象的数量,m为条件属性的数量;
步骤2:计算U关于决策D的划分U/Ind(D)={D1,D2,Dd},Ind(D)表示对象在决策属性集D上的不可分辨关系,fa(x)和fa(y)分别是对象x和对象y在决策属性a上的取值;将U/Ind(D)={D1,D2,Dd}映射到决策布尔矩阵,生成n行d列的决策布尔矩阵Fn×d=(dij)n×d∈{0,1},其中
步骤3:设定候选属性集计算B的条件布尔矩阵Ee×n,其中B={b1,b2,bp}且p≤m;包括
步骤3.1:分配GPU显存空间,将CPU端的决策表S=(U,CD)拷贝到GPU;
步骤3.2:在GPU端采用CUDA的Thrust库,将对象集U={x1,x2,,xn}按照B={b1,b2,bp}的取值在GPU端并行排序,生成排序后的序列T={x1′,x2′,,xn′}和排序后的对象标号L={l1,l2,,ln},其中li∈{1,2,n}表示xi′唯一的标识号;
步骤3.3:在GPU端启动CUDA的kernel核函数,使用多线程并行扫描排序后的序列T,判断相邻对象是否在条件属性集B上满足不可分辨关系,生成T={x1′,x2′,,xn′}关于B的布尔向量G={g1,g2,,gn},其中
其中fc(x)和fc(y)分别是对象x和对象y在条件属性c上的取值;
步骤3.4:将布尔向量G={g1,g2,,gn}和标号L={l1,l2,,ln}从GPU端拷贝到CPU端;
步骤3.5:在CPU端计算U关于条件属性集B的划分U/Ind(B)={E1,E2,,Ee},生成关于条件属性集B的e行n列的条件布尔矩阵Ee×n=(eij)e×n∈{0,1},其中
步骤4:计算条件属性集B的属性重要度评价函数Θ(D|B),包括
步骤4.1:分配GPU显存空间,将条件布尔矩阵Ee×n和决策布尔矩阵Fn×d从CPU端拷贝到GPU端;在GPU端采用CUDA的cuSPARSE稀疏矩阵运算库,并行计算相交矩阵Ke×d=Ee×n×Fn×d=(kij)e×d,其中kij=|EiDj|,|·|表示集合的基数;
步骤4.2:将属性重要度评价函数分解为的形式,在GPU端启动CUDA的kernel核函数,使用多线程并行计算每个评价子函数θ(sij),包括基于正域θPR(sij)、基于Shannon熵θSCE(sij)、基于互补熵θLCE(sij)和基于组合熵θCCE(sij)评价子函数,如下:
其中Kij=EiDj,|·|表示集合的基数,d表示决策属性的取值数量;
步骤4.3:在GPU端启动CUDA的kernel核函数,使用多线程对所有的评价子函数θ(sij)进行并行求和操作,得到条件属性集B的属性重要度评价函数
步骤5:初始化约简集CAttr=C,其中CAttr为中间局部变量;对任意的条件属性ci∈C,计算属性重要度评价函数Θ(D|C-{ci});对任意的条件属性ci∈C,计算条件属性ci的内部属性重要度Siginner(ci,C,D);如果Siginner(ci,C,D)>0,则将条件属性ci添加到约简集Reduct中,并且从CAttr中删除条件属性ci,即Reduct=Reduct{ci},CAttr=CAttr-{ci};
步骤6:计算属性重要度评价函数Θ(D|Reduct),如果||Θ(D|Reduct)-Θ(D|C)||<ε,则得到最终的约简集Reduct,否则继续;其中ε为预先设定的阈值;
步骤7:对任意的条件属性ci∈CAttr,计算属性重要度评价函数Θ(D|Reduct{ci});对任意的条件属性ci∈CAttr,计算条件属性ci的外部属性重要度Sigouter(ci,Reduct,D);选择外部属性重要度最高的作为最优属性cj=argmax{Sigouter(ci,Reduct,D)};将最优属性cj添加到约简集Reduct中,并且从CAttr中删除最优属性cj对应的条件属性ci,即Reduct=Reduct{ci},CAttr=CAttr-{ci},之后跳转到步骤6。
进一步地,所述步骤3.5还包括,将条件布尔矩阵Ee×n保存为CSR压缩存储格式。
与现有技术相比,本发明的有益效果是:
本发明提出的属性约简方法,首先通过GPU并行排序加速条件属性的划分,其次将条件划分和决策划分交集个数问题转换成条件布尔矩阵和决策布尔矩阵乘积的问题,减少了计算量,最后将属性重要度评价函数进行分解,采用多线程并行计算评价子函数,另外通过并行规约评价子函数完成了评价函数的合并。采用这样的处理能够加快属性约简的过程,提高属性约简方法的效率。
现有的属性约简方法均通过Hadoop或Spark集群的多个计算结点来提高效率,但是由其于高昂的成本以及复杂的架构使得其使用范围有限,在单机或者少量计算节点上仍然无法快速地进行约简。本发明实现的基于CUDA的属性约简方法,可以发挥GPU强大的运算能力,即使在单机环境下也能高效地处理数据。
附图说明
图1是PR算法在小规模数据集上的运行时间结果图;
图2是SCE算法在小规模数据集上的运行时间结果图;
图3是LCE算法在小规模数据集上的运行时间结果图;
图4是CCE算法在小规模数据集上的运行时间结果图;
图5是PR算法在大规模数据集上的加速比结果图;
图6是SCE算法在大规模数据集上的加速比结果图;
图7是LCE算法在大规模数据集上的加速比结果图;
图8是CCE算法在大规模数据集上的加速比结果图。
具体实施方式
本发明的具体实施方式如下:
步骤1:去除数据集中含有缺失值的数据对象,离散化连续的属性,生成决策表S=(U,C∪D),其中U={x1,x2,,xn}代表对象集,C={c1,c2,,cm}代表条件属性集,D代表决策属性集,n为对象的数量,m为条件属性的数量;
步骤2:计算U关于决策D的划分U/Ind(D)={D1,D2,Dd},Ind(D)表示对象在决策属性集D上的不可分辨关系,fa(x)和fa(y)分别是对象x和对象y在决策属性a上的取值;将U/Ind(D)={D1,D2,Dd}映射到决策布尔矩阵,生成n行d列的决策布尔矩阵Fn×d=(dij)n×d∈{0,1},其中
步骤3:设定候选属性集计算B的条件布尔矩阵Ee×n,其中B={b1,b2,bp}且p≤m;
步骤3.1:分配GPU显存空间,将CPU端的决策表S=(U,CD)拷贝到GPU;
步骤3.2:在GPU端采用CUDA的Thrust库,将对象集U={x1,x2,,xn}按照B={b1,b2,bp}的取值在GPU端并行排序,生成排序后的序列T={x1′,x2′,,xn′}和排序后的对象标号L={l1,l2,,ln},其中li∈{1,2,n}表示xi′唯一的标识号;
步骤3.3:在GPU端启动CUDA的kernel核函数,使用多线程并行扫描排序后的序列T,判断相邻对象是否在条件属性集B上满足不可分辨关系,生成T={x1′,x2′,,xn′}关于B的布尔向量G={g1,g2,,gn},其中
其中fc(x)和fc(y)分别是对象x和对象y在条件属性c上的取值;
步骤3.4:将布尔向量G={g1,g2,,gn}和标号L={l1,l2,,ln}从GPU端拷贝到CPU端;
步骤3.5:在CPU端计算U关于条件属性集B的划分U/Ind(B)={E1,E2,,Ee},生成关于条件属性集B的e行n列的条件布尔矩阵Ee×n=(eij)e×n∈{0,1},其中
为了节省存储空间和计算量,将条件布尔矩阵Ee×n保存为CSR压缩存储格式;
步骤4:计算条件属性集B的属性重要度评价函数Θ(D|B);
步骤4.1:分配GPU显存空间,将条件布尔矩阵Ee×n和决策布尔矩阵Fn×d从CPU端拷贝到GPU端;在GPU端采用CUDA的cuSPARSE稀疏矩阵运算库,并行计算相交矩阵Ke×d=Ee×n×Fn×d=(kij)e×d,其中kij=|EiDj|,|·|表示集合的基数;
步骤4.2:将属性重要度评价函数分解为的形式,在GPU端启动CUDA的kernel核函数,使用多线程并行计算每个评价子函数θ(sij),包括基于正域θPR(sij)、基于Shannon熵θSCE(sij)、基于互补熵θLCE(sij)和基于组合熵θCCE(sij)评价子函数,如下:
其中Kij=EiDj,|·|表示集合的基数,d表示决策属性的取值数量;
步骤4.3:在GPU端启动CUDA的kernel核函数,使用多线程对所有的评价子函数θ(sij)进行并行求和操作,得到条件属性集B的属性重要度评价函数
步骤5:初始化约简集CAttr=C,其中CAttr为中间局部变量;对任意的条件属性ci∈C,计算属性重要度评价函数Θ(D|C-{ci});对任意的条件属性ci∈C,计算条件属性ci的内部属性重要度Siginner(ci,C,D);如果Siginner(ci,C,D)>0,则将条件属性ci添加到约简集Reduct中,并且从CAttr中删除条件属性ci,即Reduct=Reduct{ci},CAttr=CAttr-{ci};
步骤6:计算属性重要度评价函数Θ(D|Reduct),如果||Θ(D|Reduct)-Θ(D|C)||<ε,则得到最终的约简集Reduct,否则继续;其中ε为预先设定的阈值;
步骤7:对任意的条件属性ci∈CAttr,计算属性重要度评价函数Θ(D|Reduct{ci});对任意的条件属性ci∈CAttr,计算条件属性ci的外部属性重要度Sigouter(ci,Reduct,D);选择外部属性重要度最高的作为最优属性cj=argmax{Sigouter(ci,Reduct,D)};将最优属性cj添加到约简集Reduct中,并且从CAttr中删除最优属性cj对应的条件属性ci,即Reduct=Reduct{ci},CAttr=CAttr-{ci},之后跳转到步骤6。
为了验证本发明的有效性,本发明选取了8个UCI标准数据集,描述详见表1。本发明去除了Mushroom数据集中的缺失值,并且对数据集Adult、Shuttle和Ticdata2000中的数值属性进行了离散化处理。本发明采用加速比(Speedup)作为并行算法的性能指标,其计算公式如下所示:
本发明中采用了4种不同的属性重要度评价函数来验证并行算法的有效性,分别是:基于正域的属性约简方法(PR)、基于Shannon熵的属性约简算法(SCE)、基于互补熵的属性约简算法(LCE)和基于组合熵的属性约简算法(CCE)。为了更有效地验证并行算法在不同GPU上的性能,本发明选取了3种常用的英伟达GPU设备,描述详见表2,其中TitanXp为服务器版的GPU。实验软件环境:Windows10,CUDA8.0,Visual Studio 2013,串行算法采用C++编写,并行算法采用CUDA C编写。
表1数据集描述
表2实验设备描述
试验一
选取了6个小规模数据集,比较并行算法与串行算法之间的性能。不同并行算法的加速比计算结果如表3、表4、表5和表6所示,串行算法和并行算法的运行时间如图1、图2、图3和图4所示。并行的PR算法在不同的GPU设备上获得了平均13.37-25.70x倍的性能提升,并行的SCE算法获得了平均14.35-28.56x倍的性能提升,并行的LCE算法获得平均15.46-29.38x倍的性能提升,并行的CCE算法获得了平均16.57-32.67x的性能提升。
表3 PR算法在小规模数据集上的加速比
表4 SCE算法在小规模数据集上的加速比
表5 LCE算法在小规模数据集上的加速比
表6 CCE算法在小规模数据集上的加速比
试验二
选取了2个大规模的数据集,比较并行算法与串行算法之间的性能。串行算法和并行算法的运行时间如表7所示,不同并行算法的加速比计算结果如图5、图6、图7和图8所示。在TitanXp设备上,CCE算法在Connect数据集上获得了274.43的加速比,在Covtype数据集上甚至达到了921.78的加速比。从实验结果中可以看出,样本数量越多,属性个数越多,计算量越大,就越能发挥并行计算的优势,加速比也就越高。
表7串行算法和并行算法在大规模数据集上的运行时间(单位:秒)