SVM在数据挖掘中分类的应用研究Word文档格式.docx
- 文档编号:17898241
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:8
- 大小:20.09KB
SVM在数据挖掘中分类的应用研究Word文档格式.docx
《SVM在数据挖掘中分类的应用研究Word文档格式.docx》由会员分享,可在线阅读,更多相关《SVM在数据挖掘中分类的应用研究Word文档格式.docx(8页珍藏版)》请在冰豆网上搜索。
通常XRn,本文只针对两类问题,故Y={-1,1}。
通常表示为:
S=((x1,y1),…,(xl,yl))(X×
Y)l
其中,l是样例数目。
xi是样例,yi是它们的标记,即分类属性。
定义2(线性可分)训练集S=((x1,y1),…,(xl,yl))(X×
Y)l,若存在w∈Rn,b∈R,正数ε,使得所有正类向量有,使得所有属于负类的向量有,则称训练集S线性可分。
(一)最优化问题
定义2(原始最优化问题)在域ΩRn上定义函数f,gi,i=1,…,k与hi,i=1,…,m:
minimisef(w)w∈Ω
subjecttogi≤0i=1,…,k
hi(w)=0i=1,…,m
这里的f(w)成为目标函数,剩下的关系分别称为不等式约束和等式约束。
目标函数的最优值称为最优化问题的值。
定义3(线性规划问题)对于目标函数,等式或不等式约束都是线性函数的问题称为线性规划问题。
(二)核函数定理
在线性两类分类中,用原有的训练样本数据中找出一个决策函数,从而根据次函数推断出新数据的类归属,直观上看,就是对比新数据与已训练的数据的相似程度,若更接近正类,则归为正类,反之,归为负类。
核函数在分类中起此作用。
Mercer定理就是为了描述相似程度而出现的。
定理1(Mercer定理)令X是Rn的紧子集。
假定K是连续对成函数,存在积分算子,使得:
(2)
是正的,即:
(3)
对所有的f∈L2(X)成立,然后扩展K(x,z)到一个一致收敛的序列(在X×
X上),这个序列由TK的特征函数Φj∈L2(X)构成,归一化使得,并且λj≥0,则有:
(4)
二、二次分类
支持向量机理论最初源于数据分类问题的处理,SVM就是要寻找一个满足要求的分割平面,使训练集中的点距离该平面尽可能地远,即寻求一个分割平面使其两侧的边距尽可能最大。
设输入模式集合{xi}∈Rn由两类点组成,如果xi属于第1类,则yi=1,如果xi属于第2类,则yi=-1,那么有训练样本集合{xi,yi},i=1,2,3,…,n,支持向量机的目标就是要根据结构风险最小化原理,构造一个目标函数将两类模式尽可能地区分开来,通常分为两类情况来讨论,
(1)线性可分,
(2)线性不可分。
(一)线性可分情况
在线性可分的情况下,就会存在一个超平面使得训练样本完全分开,该超平面可描述为:
(5)
其中,“”是点积,w是n维向量,b为偏移量。
最优超平面是使得每一类数据与超平面距离最近的向量与超平面之间的距离最大的这样的平面.最优超平面可以通过解下面的二次优化问题来获得:
(6)
满足约束条件:
(7)
在特征数目特别大的情况,可以将此二次规划问题转化为其对偶问题:
(8)
(9)
(10)
(11)
这里a=(a1,…,an)是Lagrange乘子,是最优超平面的偏移量,(11)式中,其解必须满足:
(12)
从式(9)可知,那些ai=0的样本对分类没有任何作用,只有那些ai?
0的样本才对分类起作用,这些样本称为支持向量,故最终的分类函数为:
(13)
根据f(x)的符号来确定X的归属,即用函数sgn(f(x))判定X的归属。
(二)线性不可分的情况
对于线性不可分的情况,可以把样本X映射到一个高维特征空间H,并在此空间中运用原空间的函数来实现内积运算,这样将非线性问题转换成另一空间的线性问题来获得一个样本的归属.根据泛函的有关理论,只要一种核函数满足Mercer条件,它就对应某一空间中的内积,因此只要在最优分类面上采用适当的内积函数就可以实现这种线性不可分的分类问题.此时的目标函数为:
(14)
其相应的分类函数为:
(15)从2.1、2.2的分析可知,不管线性可分与否我们都可以用一个通用的函数对样本集进行二次分类,而其函数尽管有些差异如式(13)和式(15)所示,只是为了尽可能少的出现错误的把某些样本归入另一类中去进行分类而在选择核函数时,选择不同的函数。
其中式(13)的核函数为K(X)=1,而式(15)的核函数是K(X)=K(xixj),最终分类只是一个花费时间量的问题。
三、SVM的分类设计与实现
(一)总体思想
为了能简洁的进行SVM的分类设计与实现,参照了台湾大学林智仁副教授开发设计的LIBSVM软件包,本文用面向对象的设计方式进行设计。
其中这几个类关系正如图2所示,虚线表示组合关系,而实线表示两类之间是继承关系,即为类Cache是类SVC_Q以及类Solver的不可缺少的组成部分,并且类SVC_Q公有继承了类Kernel。
这样设计是为了能拥有一个简洁的外部接口。
(1)我们用类Cache进行内存申请和分配;
(2)用类SVC_Q进行参数送入类Solver的接口中,(3)以类Solver实现数据的分类,并输出其结果。
(二)基本参数及相关的类
(1)数据参数的数据结构
为了设计一个用于存储单个向量的数据结构,先构造一个结构使之能够用该结构数组进行存储向量,该结构如下:
structsvm_node
{
intindex;
doublevalue;
};
其中index为标号,即向量的第几个元素;
value便是它的值了。
同样的方式把所有要进行分类的样本数据抽象成一个结构,使其使用时更为方便:
structsvm_problem
intl;
double*y;
structsvm_node**x;
其中l为样本数据的总数,*y是指向样本所属类别的数组,本文只针对二次分类进行的设计,对所有参加分类的数据所对应的y[i]内容只有+1和-1之分。
**x是指向样本数据的指针数组。
为了给类函数成员有一个简洁的接口,设计一个接近现实的参数是必要的,因此设计了该训练接口参数结构:
structsvm_parameter
doublecache_size;
doubleeps;
doubleC;
intnr_weight;
int*weight_label;
double*weight;
intshrinking;
其中cache_size是制定训练所需内存量,以MB为单位;
eps是训练停止时的精确度;
C是惩罚因子,通俗的说便是训练的模型越大,耗时就越长;
nr_weight是权重的数目,weight_label是权重,其个数由决定;
shrinking用来指明训练过程是否使用压缩的形式进行。
为了保存训练后的训练模型,同时也保存原来的训练参数,svm_model结构便出于此目的,其结构如下:
structsvm_model
svm_parameterparam;
intnr_class=2;
svm_node**SV;
double**sv_coef;
double*rho;
int*label;
其中,param用来保存原来的训练参数,nr_class用来表明类别的个数,这里默认为2,sv_coef和rho分别是判别函数中的和,label是用来存储每个类别拥有的样本数目。
(二)类的设计
Cache类
classCache
public:
Cache(intl,intsize);
~Cache();
intget_data(constintindex,Qfloat**data,intlen);
voidswap_index(inti,intj);
private:
intsize;
structhead_t
head_t*prev;
Qfloat*data;
intlen;
head_t*head;
head_tlru_head;
voidlru_delete(head_t*h);
voidlru_insert(head_t*h);
该类用于负责运算时所涉及的内存的管理:
申请、释放内存。
成员函数lru_delete(head_t*h)用来删除当前双向链表中指针所指向的元素,lru_insert(head*h)是为了在链表后插入一个新的元素数据,对于构造函数Cache(),其目的就是为了申请内存,get_data()函数用于保证*heat_t中至少有len个float的内存,并且将可以使用的内存块的指针放在data指针中,其返回值是申请到的内存数。
Kernel类
classKernel
Kernel(intl,svm_node*const*x,constsvm_parameter&
param);
virtual~Kernel();
virtualQfloat*get_Q(inti,intlen)=0;
virtualvoidswap_index(inti,intj)const
swap(x[i],x[j]);
if(x_square)swap(x_square[i],x_square[j]);
}
protected:
double(Kernel:
:
*Kernel_function)(inti,intj)const;
constsvm_node**x;
staticdoubledot(constsvm_node*px,constsvm_node*py);
doublekernel_liner(inti,intj)const(skiped)
此类用于初始化训练时需要的参数,如:
部分常量,指定核函数,复制样本数据。
成员变量x用来指向样本数据:
每次数据传入时都通过复制函数来实现,并重新分配内存;
dot()函数是用于向量的点积,并返回总和;
函数swap_index(),看名思义即是交换x[i]和x[j]指针指向的数据内容;
构造函数Kernel()便是用于指定核函数,克隆训练数据。
Solver类
功能:
归一化数据的,即把样本数据集里的数据进行-1到1的归一化,为线性分类提供分类数据集。
classSolver{
Solver(){};
virtual~Solver(){};
structSolutionInfo{
doubleobj;
doublerho;
doubleupper_bound_p;
doubleupper_bound_n;
};
voidSolve(intl,constKernrl&
Q,constdouble*b_,constschar*y_,
double*alpha_,doubleCp,doubleCn,doubleeps,
SolutionInfo*si,intshrinking);
intactive_size;
//计算时实际参加运算的样本数目
schar*y;
//样本所属类别,其中只取+1和-1
double*G;
enum{LOWER_BOUND,UPPER_BOUND,FREE};
char*alpha_status;
double*alpha;
constKernel*Q;
//指定核函数指针,指定为线性的函数
doubleeps;
//误差范围
intactive_set;
//调入的样本数据总数
doubleunshrinked;
doubleget_C(inti){};
voidupdate_alpha_status(inti){};
boolis_upper_bound(inti){returnalpha_status[i]==UPPER_BOUND;
};
boolis_lower_bound(inti){returnalpha_status[i]==LOWER_BOUND;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SVM 数据 挖掘 分类 应用 研究