The sharing of resources about Statistical Learning Theory and Machine Learning(includeing SVM,Semi-Supervised Learning,Ensemble Learning,Clustering) ,welcome to contact and communicate with me: Email: xiankaichen@gmail.com,QQ:112035246,

Saturday, July 5, 2008

libsvm中的特征提取工具 fselect.py

libsvm中也有特征提取工具,用法和其他工具一样的使用,语法为:
$ python fselect.py trainning_file[testing_file]

试了一下,但没测试过其效果怎样.可以期待
点击:下载地址

Thursday, July 3, 2008

一段matlab做交叉验证的程序

从网上down下来了一个程序.
然后自己改了一下变成了csvm,fsvm的交叉验证.

function [cvprecision,Model]=csvmcrossvalidate(sonar,fold,parameters)
%function [acc_mean,acc_std]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%sonar is the all data include the class
%fold is the number of crossvalidate
%signal is the signal of classification, if n=0 is decision tree
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
precision=[];
[row column]=size(sonar);
label=sonar(:,column);
classnum=max(label);
start1=1;
for i=1:classnum
[a,b]=find(label==i);
datai=sonar(a,:); %select the i class data
[rr1,cc1]=size(datai);
start1=1;
%%%%%%%%%part the i class in (fold)%%%%%%%%%%%%%%%%%%%%%
for j=1:fold-1
a1=round(length(a)/fold);
a2=a1-1;
%fun1=strcat('x*',num2str(a1),'+y*',num2str(a2),'=',num2str(rr1));
%fun2=strcat('x+y=',num2str(fold));
%[x,y]=solve(fun1,fun2)
%[x,y] = solve('x*a1+a2*y=rr1','x+y=fold')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
A=[a1 a2;1 1];
b=[rr1 fold]';
x=A\b;

if (j0)
parameters(5)=size(Samples,1);
parameters(6)=size(Samples,2);
alpha=[];

%void csvmTrain(double model[],dou ble parameter[], double
%X1[],double y1[])%以下红色部分为可以修改部分,即算法插入
alpha=csvmTrain(parameters,Samples',Labels');
model.alpha=alpha;
model.parameters=parameters;
model.trainS=[Samples Labels];
precision(j)=csvmPredictor(model,testS,testL);
end
end
cvprecision=mean(precision);

%在整个训练集合上得到算法的模型.
wholesamples=sonar(:,1:(column-1));
wholelabels=sonar(:,column);
parameters(5)=row;
parameters(6)=column-1;
alpha_=[];
%将y标准化{1,-1}
for k=1:size(wholelabels)
%hold on;
%plot(Samples(k,1),Samples(k,2),'r*');
if wholelabels(k)~=1
wholelabels(k)=-1;
end
end
alpha_=csvmTrain(parameters,wholesamples',wholelabels');
Model.alpha=alpha_;
Model.parameters=parameters;
Model.trainS=[wholesamples wholelabels];


libsvm中tools(easy.py,subset.py,grid.py,checkdata.py)的使用

这几天在用libsvm(2.8.6)中的一些工具,总结一下.

libsvm的一些工具还是非常有用的,1.可以调用subset.py将你的样本集合按你所想要的比例进行抽样出两个子样本集合.2.还可以调用grid.py做关于(C,gamma)的交叉验证参数选择,可以轻松的搜索到最好的参数对(C,gamma).3.还可以调用easy.ph一步到位完成svm的整个挖掘过程,最后得出交叉验证精度,最有参数对和测试集上的测试精度.4.还可以调用checkdata进行检查你的数据格式是否有错误.这些操作可以让大伙省事很多.

libsvm(2.8.6)中主要有四个工具:easy.py,subset.py,grid.py,checkdata.py.

运行环境要求和设置:
需要准备两个工具.
一个工具是:python编译环境,这个到网上下一个来安装就好了(注意要设置环境变量path),下载python.exe 2.5.1; 另一个工具就是gnuplot.exe,到网上下一个,我用的是版本4.2的,下载gnuplot.exe version 4.2(下载地址:http://optusnet.dl.sourceforge.net/sourceforge/gnuplot/gp420win32.zip)建议使用迅雷
安装完上面的软件还不能运行,还要修改easy.py,grid.py的设置.将他们对应的代码" gnuplot_exe = r"c:\tmp\gnuplot\bin\pgnuplot.exe""都改为你的pgnuplot.exe所在的路径,
比如我的文件在当前目录的上一级目录,就是和tools文件夹在同一级目录,那么我的设置应该为" gnuplot_exe = r"..\gnuplot\bin\pgnuplot.exe"".

这样设置就完成了,我们只需要到控制台下运行上面相应的四个程序即可.
注意:下面的python命令中,我们默认所有需要处理的样本数据集都是放在在tools目录下,如果数据文件不在tools目录下则我们需要用绝对路径指定数据的位置.

下面分别介绍调用格式:
从其文档可以发现其功能分别为:

(1) easy.py:只要简单输入,就可以完成svm挖掘的所有步骤,即:
1. Conduct simple scaling on the data
2.Consider the RBF kernel K(x; y)
3.Use cross-validation to nd the best parameter C and
4.Use the best parameter C and to train the whole training set
5.Test
对于初学者而言这个文件无非是他们的救命稻草,可以简单看看他的语法:
在控制台下走到easy.py所在的目录下:
$ python easy.py train.3 test.3
Scaling training data...归一化数据
Cross validation...在训练集上做交叉验证
Best c=128.0, g=0.125 CV rate=88.9186 (通过网格搜索法对每个参数对做交叉验证,选择交叉验证精度最高所对应的参数.)
Training...( 将上面得到的参数对在训练集合上做模型训练)
Output model: crttrain.model (保存模型到文件)
Scaling testing data... (归一化数据)
Testing...(用训练得出的模型对测试集进行测试)
Accuracy = 87.8049% (36/41) (classification)(测试的精度)
Output prediction: crttest.predict (输出预测结果)
(在交叉验证过程中,会有一个图形界面显示参数选择的情况,這就是gnuplot.exe的作用了)

(2).grid.py:用于做交叉验证,选择最好的参数对.
用法:
在控制台下走到grid.py所在的目录下:
$python grid.py crttrain
[local] 5 -7 86.9186 (best c=32.0, g=0.0078125, rate=86.9186)
[local] -1 -7 85.1744 (best c=32.0, g=0.0078125, rate=86.9186)
[local] 5 -1 77.0349 (best c=32.0, g=0.0078125, rate=86.9186)
.......
[local] 13 -15 85.1744 (best c=32.0, g=0.0078125, rate=86.9186)
[local] 13 3 55.5233 (best c=32.0, g=0.0078125, rate=86.9186)
[local] 13 -9 83.1395 (best c=32.0, g=0.0078125, rate=86.9186)
[local] 13 -3 79.6512 (best c=32.0, g=0.0078125, rate=86.9186)
32.0 0.0078125 86.9186 (c=32,gamma=0.0078125 交叉验证精度)


(3) subset.py 用于按个数分割样本集成训练集和测试集.
用法:
在控制台下走到subset.py所在的目录下:
$python subset.py crt 100 crttrain crttest
参数说明:
crt:样本集合;
100:训练集样本个数;
crttrain:存储100个训练样本;
crttest:存储剩下的样本集做为测试集;

如果成功没有输出信息,反之则有错误提示.

(4) checkdata.py 用于检测样本集存储格式是否正确
在控制台下走到subset.py所在的目录下:
$python checkdata.py crt
No error. (表示没有错)


详细的使用请参考tools下的README文件.

Sunday, June 29, 2008

VC维

vc维是支持向量机的核心概念,理解vc维的一些概念有助于掌握svm的本质。

我们知道在学习算法中需要选择适当的假设集F。实际上,这里的关键因素是假设集F的大小,或F的丰富程度,或者说F的表达能力,由老瓦和Chervonenkis提出的VC维 ,是对这种表达能力的一种描述。F上的VC为概念是建立在点击被F“打散”的基础之上的,首先引入点集被F打散的概念。

定义1. N(F,Zm) 设F是一个假设集,即由在X(n维欧氏空间的一个子集)上取值为1或者-1的若干函数组成的集合。记Zm={x1,x2,...,xm}为X中的m个点组成的集合。考虑当f取遍F中的所有可能的假设是产生的m维向量(f(x1),f(x2),...,f(xm))。定义N(N(F,Zm))为上述m为向量中不同的向量的个数。
这个向量无非是由1,-1组成的向量,每个分量只有两种可能的取值,因此max(
N(F,Zm))=2^m,于是有如下的定义:

定义2.(Zm被F打算) 设F是一个假设集,Zm={x1,x2,...,xm}为X中的m个点组成的集合。称Zm被F打散,如果N(F,Zm)=2^m.

定义3(增长函数) 增长函数N(F,m)定义为
N(F,m)=max{N(F,Zm):Zm包括于X},
其中Zm={x1,...,xm}是X中的m个点组成的集合,max{.}是对这些点跑遍X而言的。

假设集F能打散的点的个数越多,表明F的“表达能力”越强。F的VC维就是使得N(F,m)=2^m成立的最大的m值。确切地,有如下的定义:

定义4(VC维)假设集F是一个由X上取值为1或者-1的函数值组成的集合。定义F的VC维为
VCdim(F)=max{m:N(F,m)=2^m}.当{m:N(F,m)=2^m}是一个无限集合时,定义VCdim(F)=inf(无穷)。

由上面的定义可以看出F的VC为就是它能打算X中的点的最大个数。换句话说,若存在m个点组成的集合Zm能被F打算,且任一m+1个点的集合都不能被F打散,则F的VC为就是m;若对于任给的正整数m都存在m个点组成的集合Zm能被F打散,则F的VC维就是无穷大。

分层抽样

分层抽样(类型抽样)
步骤:先将总体中的所有单位按照某种特征或标志(性别、年龄等)划分成若干类型或层次,然后再在各个类型或层次中采用简单随机抽样或系用抽样的办法抽取一 个子样本,最后,将这些子样本合起来构成总体的样本。
两种方法:1、先以分层变量将总体划分为若干层,再按照各层在总体中的比例从各层中抽取。2、先以分层变量将总体划分为若干层,再将各层中的元素按分层的 顺序整齐排列,最后用系统抽样的方法抽取样本。
分层抽样是把异质性较强的总体分成一个个同质性较强的子总体,再抽取不同的子总体中的样本分别代表该子总体,所有的样本进而代表总体。
分层标准: ⑴以调查所要分析和研究的主要变量或相关的变量作为分层的标准。 ⑵以保证各层内部同质性强、各层之间异质性强、突出总体内在结构的变量作为分层变量。 ⑶以那些有明显分层区分的变量作为分层变量。
分层的比例问题: ⑴按比例分层抽样:根据各种类型或层次中的单位数目占总体单位数目的比重来抽取子样本的方法。 ⑵不按比例分层抽样:有的层次在总体中的比重太小,其样本量就会非常少,此时采用该方法,主要是便于对不同层次的子总体进行专门研究或进行相互比较。
如果 要用样本资料推断总体时,则需要先对各层的数据资料进行加权处理,调整样本中各层的比例,使数据恢复到总体中各层实际的比例结构。
简单随机抽样就是按照等概率的原则,直接从含有N个元素的总体中抽取n个元素组成的样本(N>n)。

svm的训练预测过程(很有意义)

想了一段时间,现在終於理清svm算法评估和预测的头绪了。
可以归纳为以下几个过程(顺序的):
  1. 收集数据,相关性分析(p卡方检验),特征选择(主成份分析)。
  2. 归一化数据。就是根据实际要求,将数据的取值范围转化为统一的区间如[a,b],a,b为整数。方法参考:http://slt-ml.blogspot.com/2008/06/spss.html
  3. 利用抽样技术将数据集分为训练集和测试集。抽样技术有分层抽样,简单抽样(等概率抽样)
  4. 将数据转化为软件(接口)所支持的格式。就libsvm(c++,java)来说,我们可以使用FormatDataLibsvm.xls将数据转化为libsvmm所要求 的格式。参考:http://slt-ml.blogspot.com/2008/06/formatdatalibsvmxlslibsvm.html
  5. 选择核函数,可以优先考虑rbf。
  6. 训练集利 用交叉验证法选择最好的参数C和r(rbf核函数中的参数gama)。可以通过网格法寻找出最优的参数,注意一次交叉验证得到一个参数对所对应的模型精 度,网格法目的就是找到使得模型精度达到对高的参数对(这里的参数对可能不止两个,有可能也有其他的),可以使用一些启发式的搜索来降低复杂度,虽然这个 方法笨了点,但是它能得到很稳定的搜索结果。需要提到的这里在对训练集进行分割的时候涉及到抽样,一个较好的方法就是分层抽样。从这步可以看出其实 Cross-Validation是一种评估算法的方法。
  7. 用6中得到的参数对在整个训练集合上进行训练,从而得出模型。
  8. 利用测试集测试模型,得到精度。这个精度可以认为是模型最终的精度。当然有人会担心3步中抽样会有一定的误差,导致8得到的精度不一定是最好的,因此可以重复3-8得到多个模型的精度,然后选择最好的一个精度最为模型的精度(或者求所有精度的均值做为模型精度)。

使用FormatDataLibsvm.xls将数据转换成LIBSVM要求的格式

很好用的一个小软件,方便快捷,
现在简单介绍一下。

数据原始格式:
条件属性a 条件属性b ... 决策属性
9 7 ... 2
5 6 ... 1

输出数据格式:

决策属性 条件属性a 条件属性b ...
2 1:9 2:7 ...
1 1:5 2:6 ...


操作步骤:
1.先运行FormatDataLibsvm.xls
2.然后将数据粘贴到sheet1的topleft单元

3.点击"工具"-->"宏"-->执行下面有一个选项(FormatDatatoLibsvm),选中然后运行即可
(注意:如果你禁用了宏,请在“excel选项”中先启动宏)


其实我们也可以利用其另外的一个宏 轻易的将libsvm格式转化成 原始的输入格式.