LibSVM使用指南

一、     SVM简介

在进行下面的内容时我们认为你已经具备了数据挖掘的基础知识。

SVM是新近出现的强大的数据挖掘工具,它在文本分类、手写文字识别、图像分类、生物序列分析等实际应用中表现出非常好的性能。SVM属于监督学习算法,样本以属性向量的形式提供,所以输入空间是Rn的子集。

如图1所示,SVM的目标是找到两个间距尽可能大的边界平面来把样本本点分开,以”最小化泛化误差“,即对新的样本点进行分类预测时,出错的几率最小。落在边界平面上的点称为支持向量。Vapnik证明如果可以找到一个较小的支持向量集,就可以保证得到很好的泛化能力----也就是说支持向量的个数越少越好。

数据点通常在输入空间是线性不可分的,我们把它映射到更高维的特征空间,使其线性可分----这里的映射函数我们称之为核函数。特征空间的超平面对应输入空间的一个非线性的分离曲面,因此称为非线性分离器。

SVM分类器的输出是u=w*x+b,w是分类平面的法矢,x是输入向量,b是常量,u代表分类。即SVM的目的就是计算出w和b。最大化margin(两个分类平面之间的距离)等价于求下面的二次优化问题:

对于非线性分类器就要把x映射到特征空间,同时考虑误差的存在(即有些样本点会越过分类边界),上述优化问题变为:

从输入空间是映射到特征空间的函数称为核函数,LibSVM中使用的默认核函数是RBF(径向基函数radial basis function)

这样一来就有两个参数需要用户指定:gamma。实际上在LibSVM中用户需要给出一个gamma的区间,LibSVM采用交叉验证cross-validation accuracy的方法确定分类效果最好的gamma。

举个例子说明什么是交叉验证,假如把训练样本集拆成三组,然后先拿 train model predict 3 以得到正确率; 再来拿 3 train predict 1 ,最后 1,3 train predict 2 ,最后取预测精度最高的那组c和gamma。

有时属于不同分类的样本数是不平衡的,所以有人提出(二次优化)的目标函数应该为:

LibSVM中允许用户指定权重值

对于文本分类采用最简单的线性分类器即可,因为输入的文档向量矩阵高度稀疏,可以认为不需要映射到特征空间,在输入空间就线性可分, 这样我们就不需要使用核函数了----然而我的实践证明这个结论并不总是正确的。

二、LibSVM的安装

  1. Linux上下载tar.gz
  2. 解压后就可直接使用java版的了

但要求电脑上装有1.5版本以上的java,并且设置好了$classpath全局变量。

三、了解libsvm工具包

LIBSVM是台湾大学林智仁(Lin Chih-Jen)教授等2001年开发设计的一个简单, 易于使用和快速有效的SVM模式识别与回归的软件包, 他不但提供了编译好的可在Windows系列系统的执行文件, 还提供了源代码, 方便改进, 修改以及在其它操作系统上应用; 该软件对SVM所涉及的参数调节相对比较少, 提供了很多的默认参数, 利用这些默认参数可以解决很多问题; 并提供了交互检验(Cross Validation)的功能. 该软件包可在http://www.csie.ntu.edu.tw/~cjlin/ 免费获得. 该软件可以解决C-SVM, ν-SVM, ε-SVR和ν-SVR等问题, 包括基于一对一算法的多类模式识别问题.

这套库可以从http://www.csie.ntu.edu.tw/~cjlin/libsvm/index.html免费获得, 目前已经发展到3.12版(2012.4.1更新).下载.tar.gz格式的版本, Windows下也可以直接解压, 主要有6个文件夹和一些源码文件.

Java: 主要是应用于java平台;

matlab: windows下64位matlab平台;

python: 是用来参数优选的工具, 稍后介绍;

svm-toy: 一个可视化的工具, 用来展示训练数据和分类界面, 里面是源码, 其编译后的程序在windows文件夹下;

tools: 主要包含四个python文件, 用来数据集抽样(subset), 参数优选(grid), 集成测试(easy), 数据检查(checkdata);

windows: 包含libSVM四个exe程序包, 我们所用的库就是他们.

文件夹里面还有个heart_scale, 是一个样本文件, 可以用记事本打开, 用来测试用的.

其他.h和.cpp文件都是程序的源码, 可以编译出相应的.exe文件. 其中, 最重要的是svm.h和svm.cpp文件, svm-predict.c, svm-scale.c和svm-train.c(还有一个svm-toy.c在svm-toy文件夹中)都是调用的这个文件中的接口函数, 编译后就是windows下相应的四个exe程序. 另外, 里面的README跟FAQ也是很好的文件, 对于初学者如果W文较好的话, 可以看一下.

对于仅仅使用libsvm库的人来说, windows下的4个exe包已经足够了, 如果是为了做深入研究, 可以按照自己的思路文件夹中的.cpp和.c文件, 然后编译验证)

四、下面开始测试libsvm工具包

1). 把LibSVM包解压到相应的目录(因为我只需要里面windows文件夹中的exe程序包, 我们也可以只把windows文件夹拷到相应的目录), 比如C:\jacoxu\test\libsvm-3.12

2). 在电脑”开始”的”运行”中输入cmd, 进入DOS环境. 定位到C:\jacoxu\test\libsvm-3.12下, 具体命令如下:

3). 进行libsvm训练, 输入命令:

svm-train ../heart_scale train.model

heart_scale: 是目录下的已经存在的样本文件, 要换成自己的文件, 只需改成自己的文件名就可以了;

train.model: 是创建的结果文件, 保存了训练后的结果:

其中, #iter 为迭代次数;

nu 是选择的核函数类型的参数;

obj 为SVM文件转换为的二次规划求解得到的最小值;

rho 为判决函数的偏置项b;

nSV 为标准支持向量个数(0<a[i]<c);

nBSV 为边界上的支持向量个数(a[i]=c);

Total nSV为支持向量总个数(对于两类来说, 因为只有一个分类模型Total nSV = nSV

但是对于多类, 这个是各个分类模型的nSV之和).

在目录下, 还可以看到产生了一个train.model文件, 可以用记事本打开, 记录了训练后的结果.

svm_type c_svc             //所选择的svm类型, 默认为c_svc
kernel_type rbf //训练采用的核函数类型, 此处为RBF核
gamma 0.0769231 //RBF核的参数γ
nr_class 2 //类别数, 此处为两分类问题
total_sv 132 //支持向量总个数
rho 0.424462 //判决函数的偏置项b
label 1 -1 //原始文件中的类别标识
nr_sv 64 68 //每个类的支持向量机的个数
SV //以下为各个类的权系数及相应的支持向量
1 1:0.166667 2:1 3:-0.333333 … 10:-0.903226 11:-1 12:-1 13:1
0.5104832128985164 1:0.125 2:1 3:0.333333 … 10:-0.806452 12:-0.333333 13:0.5
………
-1 1:-0.375 2:1 3:-0.333333…. 10:-1 11:-1 12:-1 13:1
-1 1:0.166667 2:1 3:1 …. 10:-0.870968 12:-1 13:0.5

这里注意, 第二行出现的权系数为小数(0.5104832128985164)是因为这个点属于非边界上的支持向量, 即: (0<a[i]<c).

其他的两个(svm-predict, svm-scale)的使用过程类似.

五、LibSVM的使用

我们只讲Linux下Java版的使用,在有的VM上,java版的libsvm运行速度可逼近C++版的运行速度。

cd   /path/to/libsvm-3.1/java

java -classpath libsvm.jar svm_scale <arguments>

java -classpath libsvm.jar svm_train <arguments>

java -classpath libsvm.jar svm_predict <arguments>

java -classpath libsvm.jar svm_toy

1)LibSVM要求处理的文件数据都满足如下格式:

rlabel1 index1:value1 index2:value2 …...

rlabel2 index1:value1 index2:value2 …...

下面的脚本是我用于转换成LibSVM要求的文件格式用的,作个备份:

#!/usr/bin/perl
$file="/home/orisun/libsvm/testvec";
$file2="/home/orisun/libsvm/testvec_svmfmt";
#$file="/home/orisun/libsvm/trainvec";
#$file2="/home/orisun/libsvm/trainvec_svmfmt";
open VFILE,"$file";
open FFILE,">$file2";
while(<VFILE>){
chomp;
my @cont=split;
$no=$cont[0];
my $rlable;
#$rlable=int($no%1000);
if($no eq "C39"){
$rlable=0;
}elsif($no eq "C31"){
$rlable=1;
}elsif($no eq "C32"){
$rlable=2;
}elsif($no eq "C38"){
$rlable=3;
}elsif($no eq "C34"){
$rlable=4;
}elsif($no eq "C19"){
$rlable=5;
}
print FFILE "$rlable\t";
for($i=1;$i<@cont;$i++){
if($cont[$i]!=0){
print FFILE "$i:$cont[$i]\t";
}
}
print FFILE "\n";
}

libsvm在存储中存储数据时默认采用的是float,而不是double。当你原始数据精度要求很高时这确实是个问题。

rlabel表示分类,为一个数字。

Index从1开始递增,表示输入向量的序号。

value是输入向量相应维度上的值,就是要训练的数据, 从分类的角度来说就是特征值, 数据之间用空格隔开,如果value为0,该项可以不写。下面是一个示例文件:

0 1:3.2 3:1.6

1 1:1.5 2:4.2 3:0.5

0 1:5.1 2:1.6 3:2.0

1 2:5.4

2)svm_scale用于把输入向量按列进行规范化(或曰缩放)。

svmscale是用来对原始样本进行缩放的, 范围可以自己定, 一般是[0,1]或[-1,1]. 缩放的目的主要是

(1) 防止某个特征过大或过小, 从而在训练中起的作用不平衡;

(2) 为了计算速度. 因为在核计算中, 会用到内积运算或exp运算, 不平衡的数据可能造成计算困难.

用法:

svmscale [-l lower] [-u upper]

[-y y_lower y_upper]

[-s save_filename]

[-r restore_filename] filename

选项:

-l lower : x scaling lower limit (default -1)  设定数据下限; lower: 设定的数据下限值, 缺省为-1

-u upper : x scaling upper limit (default +1)  设定数据上限; upper: 设定的数据上限值, 缺省为1

-y y_lower y_upper : y scaling limits (default: no y scaling)  是否对目标值同时进行缩放; y_lower为下限值, y_upper为上限值;

-s save_filename : save scaling parameters to save_filename  表示将缩放的规则保存为文件save_filename;

-r restore_filename : restore scaling parameters from restore_filename   表示将按照已经存在的规则文件restore_filename进行缩放;

filename: 待缩放的数据文件, 文件格式按照libsvm格式.

默认情况下, 只需要输入要缩放的文件名就可以了: 比如(已经存在的文件为test.txt)

svmscale test.txt

这时, test.txt中的数据已经变成[-1,1]之间的数据了. 但是, 这样原来的数据就被覆盖了, 为了让规划好的数据另存为其他的文件, 我们用一dos的重定向符>来另存为(假设为out.txt):

svmscale test.txt > out.txt

运行后, 我们就可以看到目录下多了一个out.txt文件, 那就是规范后的数据. 假如, 我们想设定数据范围[0,1], 并把规则保存为test.range文件:

svmscale –l 0 –u 1 –s test.range test.txt > out.txt

这时, 目录下又多了一个test.range文件, 可以用记事本打开, 下次就可以用-r test.range来载入了.

举个例子,比如我运行:java svm_scale -l 0 -u 1 -s range train > train.scale则输入文件是train,输出文件是 train.scale,把输入向量的各列都缩放到[0,1]的范围内,range文件中保存了相关的缩放信息。

Train文件原来的内容:

1 1:0 2:0

1 1:3 2:4

1 1:5 2:9

1 1:12 2:1

1 1:8 2:7

0 1:9 2:8

0 1:6 2:12

0 1:10 2:8

0 1:8 2:5

0 1:14 2:8

range文件自动生成:

x

0.000000000000000 1.000000000000000

1 0.000000000000000 14.00000000000000

2 0.000000000000000 12.00000000000000

train.scale文件自动生成:

1.0

1.0 1:0.21428571428571427 2:0.3333333333333333

1.0 1:0.35714285714285715 2:0.75

1.0 1:0.8571428571428571 2:0.08333333333333333

1.0 1:0.5714285714285714 2:0.5833333333333334

0.0 1:0.6428571428571429 2:0.6666666666666666

0.0 1:0.42857142857142855 2:1.0

0.0 1:0.7142857142857143 2:0.6666666666666666

0.0 1:0.5714285714285714 2:0.4166666666666667

0.0 1:1.0 2:0.6666666666666666

然后我再运行:java svm_scale -r range test > test.scale意思是说从range文件中读取缩放信息运用于test文件,输出test.scale文件。

3)svmtrain的用法

svmtrain我们在前面已经接触过, 他主要实现对训练数据集的训练, 并可以获得SVM模型.

用法: svmtrain [options] training_set_file [model_file]

其中, options为操作参数, 可用的选项即表示的涵义如下所示:

-s 设置svm类型:

0 – C-SVC  //(multi-class classification)

1 – v-SVC  //((multi-class classification)

2 – one-class-SVM  //one-class SVM

3 – ε-SVR  //(regression)

4 – n – SVR  //(regression)

-t kernel_type : set type of kernel function (default 2)   设置核函数类型, 默认值为2

0 — linear   线性核: μ‘∗ν

1 — polynomial   多项式核:    (γ∗μ‘∗ν+coef0)degree

2 — radia basis function   RBF核: exp(–γ∗∥μ−ν∥2)

3 — sigmoid   sigmoid 核: tanh(γ∗μ‘∗ν+coef0)

    4—precomputed kernel (kernel values in training_set_file)

-d degree: set degree in kernel function (default 3)   核函数中的degree设置(针对多项式核函数)(默认3);

-g r(gama): set gamma in kernel function (default 1/num_features)   核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(默认1/ k);

-r coef0:in kernel function (default 0)    核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0);

-c cost: set the parameter C of C-SVC, epsilon-SVR, and nu-SVR (default 1)   设置C-SVC, e -SVR和v-SVR的参数(损失函数)(默认1);

-n nu: set the parameter nu of nu-SVC, one-class SVM, and nu-SVR (default 0.5)   设置v-SVC, 一类SVM和v- SVR的参数(默认0.5);

-p p: set the epsilon in loss function of epsilon-SVR (default 0.1)   设置e -SVR 中损失函数p的值(默认0.1);

-m cachesize: set cache memory size in MB (default 100)   设置cache内存大小, 以MB为单位(默认40);

-e eps: set tolerance of termination criterion (default 0.001)   设置允许的终止判据(默认0.001);

-h shrinking: whether to use the shrinking heuristics, 0 or 1 (default 1)   是否使用启发式, 0或1(默认1);

-wi weight: set the parameter C of class i to weight*C, for C-SVC (default 1)   设置第几类的参数C为weight*C (C-SVC中的C) (默认1);

-v n: n-fold cross validation mode   n-fold交互检验模式, n为fold的个数, 必须大于等于2;

-b probability_estimates : whether to train a SVC or SVR model for probability estimates, 0 or 1 (default 0)   概率估计: 是否计算SVC或SVR的概率估计, 可选值0或1, 默认0;

-q : quiet mode (no outputs)

model_file: 可选项, 为要保存的结果文件, 称为模型文件, 以便在预测时使用.

其中-g选项中的k是指输入数据中的属性数. option -v 随机地将数据剖分为n部分并计算交互检验准确度和均方根误差. 以上这些参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合, 如果设置的参数在函数或SVM类型中没有也不会产生影响, 程序不会接受该参数; 如果应有的参数设置不正确, 参数将采用默认值.

training_set_file是要进行训练的数据集; model_file是训练结束后产生的模型文件, 文件中包括支持向量样本数, 支持向量样本以及lagrange系数等必须的参数; 该参数如果不设置将采用默认的文件名, 也可以设置成自己惯用的文件名.

默认情况下, 只需要给函数提供一个样本文件名就可以了, 但为了能保存结果, 还是要提供一个结果文件名, 比如: test.model, 则命令为:

svmtrain test.txt test.model

接着上例,向量规范化后我们train一下训练样本,以生成支持向量。

运行:java svm_train -s 0 -c 5 -t 2 -g 0.5 -e 0.01 train.scale

会生成train.scale.model文件,内容如下:

svm_type c_svc

kernel_type rbf

gamma 0.5

nr_class 2

total_sv 9

rho -0.5061570424019811

label 1 0

nr_sv 4 5

SV

2.7686973549711875 1:0.21428571428571427 2:0.3333333333333333

5.0 1:0.35714285714285715 2:0.75

5.0 1:0.8571428571428571 2:0.08333333333333333

5.0 1:0.5714285714285714 2:0.5833333333333334

-5.0 1:0.6428571428571429 2:0.6666666666666666

-2.4351637665059895 1:0.42857142857142855 2:1.0

-5.0 1:0.7142857142857143 2:0.6666666666666666

-5.0 1:0.5714285714285714 2:0.4166666666666667

-0.3335335884651968 1:1.0 2:0.6666666666666666

nr_class代表训练样本集有几类,rho是判决函数的常数项b,nr_sv是各个类中落在边界上的向量个数,SV下面枚举了所有的支持向量,每个支持向量前面都有一个数字,代表什么我现在也不清楚。

当train C-SVM时会有类似下面的输出:

optimization finished, #iter = 219

nu = 0.431030

obj = -100.877286, rho = 0.424632

nSV = 132, nBSV = 107

Total nSV = 132

obj是对SSVM问题的优化目标函数的值。rho是决策函数中的常数项b。nSV是支持向量的个数,nBSV是边界支持向量的个数(i.e., alpha_i = C)。

如果“自由支持向量”个数很多,很可能是因为过拟合了。如果输入数据的attribute在一个很大的范围内分布,最好scale一下。

采用时默认的核函数RBF是比较好的,if RBF is used with model selection, then there is no need to consider the linear kernel.

如果预测的准确率太低,如何提高一下?使用python目录下的grid.py进行模型选择以找到比较好的参数。

grid.py是一种用于RBF核函数的C-SVM分类的参数选择程序。用户只需给定参数的一个范围,grid.py采用交叉验证的方法计算每种参数组合的准确度来找到最好的参数。

Usage: grid.py [-log2c begin,end,step] [-log2g begin,end,step] [-v fold]

[-svmtrain pathname] [-gnuplot pathname] [-out pathname] [-png pathname]

[additional parameters for svm-train] dataset

The program conducts v-fold cross validation using parameter C (and gamma)= 2^begin, 2^(begin+step), ..., 2^end.

首先sudo apt-get install gnuplot

然后编译C++版本的LibSVM,生成svm-train二进制可执行文件。

cd  /path/to/libsvm-3.1

make

举个例子就都明白了:python grid.py -log2c -5,5,1 -log2g -4,0,1 -v 5 -svmtrain /home/orisun/develop/libsvm-3.1/svm-train -m 500 traincev_svmfmt_part1

-m 500是使用svm_train时可以使用的参数。

最后输出两个文件:dataset.png绘出了交叉验证精度的轮廓图,dataset.out对于每一组log2(c)和log2(gamma)对应的CV精度值。

如果训练时间过长,你可能需要:

1.指定更大有cache size。(-m)

2.使用更宽松的stopping tolerance。(-e)

当使用一个很大有-e时,你可能需要检查一下-h 0 (no shrinking) or -h 1 (shrinking)哪个更快。

3.如果上面的方法还不行就需要裁剪训练集。使用tools目录下的subset.py来随机获得训练集的一个子集。

Usage: subset.py [options] dataset number [output1] [output2]

This script selects a subset of the given data set.

options:

-s method : method of selection (default 0)

0 -- stratified selection (classification only)

1 -- random selection

output1 : the subset (optional)

output2 : the rest of data (optional)

If output1 is omitted, the subset will be printed on the screen.

当迭代次数很高时使用shrinking是有帮助的,而当使用一个很大的-e时,迭代次数会减少,最好把shrinking关掉。

当指定一个很大-m时Linux会报"段错误“,很可能是内存溢出了。对于32位的机子最大的可编址内存是4G。同时Linux系统按照3:1来划分用户空间:核空间,所以用户空间只有最大只有3G,而可动态分配的内存最大只有2G。当你使用一个接近2G的-m时内存就会耗尽。

解决办法:

1.换64位的机子。

2.如果你的机子支持Intel's PAE (Physical Address Extension),你可以在Linux内核中开启HIGHMEM64G选项,这样核空间和用户空间的划分就是4G:4G。

3.安装"tub”软件,它可以消除动态分配内存只有2G的限制。tub可以在这里获取 http://www.bitwagon.com/tub.html。

在svm_train的过程中如果不想看到中间输出可以使用-q选项。

如果你是在编程代码中使用libsvm库,可以这样:

1.声明一个空的输出函数:void print_null(const char *s) {}

2.把它赋给libsvm库中的输出函数:svm_print_string = &print_null;

在处理多类分类问题时,libsvm采用的是one-against-one,而不是one-against-the rest,实际上后者的性能要好,而之所以采用前者仅仅是因为它快。

交叉验证是为了选择更好的参数,做完交叉验证后并不会输出model文件,此时你需要re-train the whole data without the -v option。

如果你有多核/共享内存的计算机,libsvm还允许你采用OpenMP进行并行编程。

预测时如果开启-b则会耗费更长的时间,并且开启-b和提高预测的准确率并没有绝对的关系。

4). svmpredict 的用法

svmpredict 是根据训练获得的模型, 对数据集合进行预测.

用法: svmpredict [options] test_file model_file output_file

其中, options为操作参数, 可用的选项即表示的涵义如下所示:

-b probability_estimates: 是否需要进行概率估计预测, 可选值为0 或者1, 默认值为0.

model_file: 是由svmtrain 产生的模型文件;

test_file: 是要进行预测的数据文件, 格式也要符合libsvm格式, 即使不知道label的值也要任意填一个, svmpredict会在output_file中给出正确的label结果, 如果知道label的值, 就会输出正确率;

output_file: 是svmpredict 的输出文件, 表示预测的结果值.

最后可以预测分类了,运行:java svm_predict test.scale train.scale.model result

test.scale 是待预测的文件, train.scale.model是利用训练文本集生成的model文件,最终会生成result文件,内容如下:

1.0

1.0

0.0

1.0

0.0

0.0

0.0

0.0

1.0

0.0

由于在 test.scale中我已标记了正确的rlable,所以 svm_predict还会报告正确率Accuracy = 70.0% (7/10) (classification)。在实际的分类问题中,我们当然是无法提前知道待分类文件中的rlabel中,可以任意标记一个数字,这时候还会给出Accuracy ,不过它是毫无意义的。

在使用svm_toy时只支持3种颜色,最大分类数是3。如果想有更多分类,需要修改原代码svm-toy.cpp。如果直接从文件中load数据,要求向量是2维的,并且每一维都在(0,1),同时rlabel只能是1、2、3(甚至不能是1.0、2.0、3.0)。

下面是使用svn_toy的一个截图:

图2

LibSVM库函数的调用

库函数在"libsvm"包中。

在Java版中以下函数可以调用:

public class svm {

public static final int LIBSVM_VERSION=310;

public static svm_model svm_train(svm_problem prob, svm_parameter param);

public static void svm_cross_validation(svm_problem prob, svm_parameter param, int nr_fold, double[] target);

public static int svm_get_svm_type(svm_model model);

public static int svm_get_nr_class(svm_model model);

public static void svm_get_labels(svm_model model, int[] label);

public static double svm_get_svr_probability(svm_model model);

public static double svm_predict_values(svm_model model, svm_node[] x, double[] dec_values);

public static double svm_predict(svm_model model, svm_node[] x);

public static double svm_predict_probability(svm_model model, svm_node[] x, double[] prob_estimates);

public static void svm_save_model(String model_file_name, svm_model model) throws IOException

public static svm_model svm_load_model(String model_file_name) throws IOException

public static String svm_check_parameter(svm_problem prob, svm_parameter param);

public static int svm_check_probability_model(svm_model model);

public static void svm_set_print_string_function(svm_print_interface print_func);

}

注意在Java版中svm_node[]的最后一个元素的索引不是-1.

用户可以自定义自己的输出格式,通过:

your_print_func = new svm_print_interface()

{

public void print(String s)

{

// your own format

}

};

svm.svm_set_print_string_function(your_print_func);

更为详细请见:LibSVM学习

LibSVM使用指南的更多相关文章

  1. 支持向量机SVM 参数选择

    http://ju.outofmemory.cn/entry/119152 http://www.cnblogs.com/zhizhan/p/4412343.html 支持向量机SVM是从线性可分情况 ...

  2. Libsvm在matlab环境下使用指南

    一.安装 http://www.csie.ntu.edu.tw/~cjlin/libsvm/matlab/.在这个地址上可以下的包含matlab接口的源程序.下载完后可以放到放到任意的盘上解压,最好建 ...

  3. Libsvm使用资料

    原理: 1. pluskid(张弛原)的支持向量机教程(人家现在都是大牛了) http://blog.pluskid.org/?page_id=683 2. JerryLead机器学习教程 http: ...

  4. MLlib1.6指南笔记

    MLlib1.6指南笔记 http://spark.apache.org/docs/latest/mllib-guide.html spark.mllib RDD之上的原始API spark.ml M ...

  5. JavaScript权威指南 - 函数

    函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...

  6. UE4新手之编程指南

    虚幻引擎4为程序员提供了两套工具集,可共同使用来加速开发的工作流程. 新的游戏类.Slate和Canvas用户接口元素以及编辑器功能可以使用C++语言来编写,并且在使用Visual Studio 或 ...

  7. JavaScript权威指南 - 对象

    JavaScript对象可以看作是属性的无序集合,每个属性就是一个键值对,可增可删. JavaScript中的所有事物都是对象:字符串.数字.数组.日期,等等. JavaScript对象除了可以保持自 ...

  8. JavaScript权威指南 - 数组

    JavaScript数组是一种特殊类型的对象. JavaScript数组元素可以为任意类型,最大容纳232-1个元素. JavaScript数组是动态的,有新元素添加时,自动更新length属性. J ...

  9. const extern static 终极指南

    const extern static 终极指南 不管是从事哪种语言的开发工作,const extern static 这三个关键字的用法和原理都是我们必须明白的.本文将对此做出非常详细的讲解. co ...

随机推荐

  1. JavaWeb学习总结(十五)--过滤器的应用

    一.解决全站字符乱码(post和get中文编码问题) 乱码问题: 获取请求参数中的乱码问题: POST请求:request.setCharacterEncoding("utf-8" ...

  2. linux 命令 第一波

    man 命令名字 查看命令详细解释 q退出cd 切换目录cd .. 回到上级目录su 切换用户pwd 当前目录mkdir cmy 创建cmy文件夹[目录]rm cmy 删除cmy文件夹[如果cmy里面 ...

  3. Android是如何绘制View的

    当一个activity获得焦点时, 它会被要求绘制它的布局. Android框架将处理绘制的过程, 但是activity必须提供它的布局体系的根节点. 绘制将从根节点开始, 根节点被要求测量和绘制布局 ...

  4. Java用webSocket实现tomcat的日志实时输出到web页面

    原文:http://blog.csdn.net/smile326/article/details/52218264 1.场景需求 后台攻城狮和前端攻城狮一起开发时,经常受到前端攻城狮的骚扰,动不动就来 ...

  5. Android控件之ImageView(显示图片的控件)

    一.ImageView属性: android:src = "@drawable/ic_launcher"——ImageView的内容图像(可以和android:background ...

  6. velocity基础教程--1.标准使用(zhuan)

    http://llying.iteye.com/blog/387253 **************************** velocity是一个非常好用的模板引擎 这里不对项目进行详细介绍,可 ...

  7. valueForKeyPath的妙用(转)

    可能大家对 - (id)valueForKeyPath:(NSString *)keyPath 方法不是很了解. 其实这个方法非常的强大,举个例子: NSArray *array = @[@" ...

  8. vim Project

    VIM是Linux和Unix下常用的文本编辑工具,在编写代码和阅读代码中经常使用. 但VIM进行代码项目管理时,没有IDE集成开发工具方便,现在提供一个VIM插件Project,可以对代码项目进行简单 ...

  9. 为什么要baidu/Google问题 尽量少在群里问问题

    群里问也是可以的 但是 不能指望群里的人详细的回答 有时候的回答会很到位 但是 也可以 应该更多的去网络上搜索信息 因为 那是别人已经写好的 我们为什么不顺便去获取呢 别人花费了精力 我们要尽量运用 ...

  10. node环境下处理get post

    前言:今天刚学get,post.这里只是几下今天的理解.so文章只供新手参考. 编译器是webstorm 搭建后服务器后(具体请查看上篇文章) 在routes文件夹下的index.js文件中写入 如图 ...