
2、其次在森携svm软件中导入人脸识别训练此御伏后的svm模型。拆早
3、然后点击svm右上角的保存并且进行调试。
4、最后,调试完成后点击视图中的进行测试按钮即可。
拉格朗日function y=lagrange(x0,y0,x)
n=length(x0)m=length(x)
for i=1:m
z=x(i)
s=0.0
for k=1:n
p=1.0
for j=1:n
if j~=k
p=p*(z-x0(j))/(x0(k)-x0(j))
end
end
s=p*y0(k)+s
end
y(i)=s
end
SOR迭代法的Matlab程序
function [x]=SOR_iterative(A,b)
% 用SOR迭代求解线性方程组,矩阵A是方阵
x0=zeros(1,length(b))% 赋初值
tol=10^(-2)% 给定误差界
N=1000% 给定最大迭代次数
[n,n]=size(A)% 确定矩阵A的阶
w=1% 给定松弛因子
k=1
% 迭代过程
while k=N
x(1)=(b(1)-A(1,2:n)*x0(2:n)')/A(1,1)
for i=2:n
x(i)=(1-w)*x0(i)+w*(b(i)-A(i,1:i-1)*x(1:i-1)'-A(i,i+1:n)*x0(i+1:n)')/A(i,i)
end
if max(abs(x-x0))=tol
fid = fopen('SOR_iter_result.txt', 'wt')
fprintf(fid,'\n********用SOR迭代求解线性方程组的输出结果********\n\n')
fprintf(fid,'迭代次数: %d次\n\n',k)
fprintf(fid,'x的值\n\n')
fprintf(fid, '%12.8f \n', x)
break
end
k=k+1
x0=x
end
if k==N+1
fid = fopen('SOR_iter_result.txt', 'wt')
fprintf(fid,'\n********用SOR迭代求解线性方程组的输出结果********\n\n')
fprintf(fid,'迭代次数: %d次\n\n',k)
fprintf(fid,'超过最大迭代次数,求解失败!')
fclose(fid)
end
Matlab中龙格-库塔(Runge-Kutta)方法原理及实现龙格-库塔(Runge-Kutta)方法是一种在工程上应用广泛的高精度单步算法。由于此算法精度高,采取措施对误差进行抑制,所以其实现原理也较复杂。该算法是构建在数学支持的基础之上的。龙格库塔方法的理论基础来源于泰勒公式和使用斜率近似表达微分,它在积分区间多预计算出几个点的斜率,然后进行加权平均,用做下一点的依据,从而构造出了精度更高的数值积分计算方法。如果预先求两个点的斜率就是二阶龙格库塔法,如果预先取四个点就是四阶龙格库塔法。一阶常微分方程可以写作:y'=f(x,y),使用差分概念。
(Yn+1-Yn)/h= f(Xn,Yn)推出(近似等于,极限为Yn')
Yn+1=Yn+h*f(Xn,Yn)
另外根据微分中值定理,存在0t1,使得
Yn+1=Yn+h*f(Xn+th,Y(Xn+th))
这里K=f(Xn+th,Y(Xn+th))称为平均斜率,龙格库塔方法就是求得K的一种算法。
利用这样的原理,经过复杂的数学推导(过于繁琐省略),可以得出截断误差为O(h^5)的四阶龙格库塔公式:
K1=f(Xn,Yn)
K2=f(Xn+h/2,Yn+(h/2)*K1)
K3=f(Xn+h/2,Yn+(h/2)*K2)
K4=f(Xn+h,Yn+h*K3)
Yn+1=Yn+h*(K1+2K2+2K3+K4)*(1/6)
所以,为了更好更准确地把握时间关系,应自己在理解龙格库塔原理的基础上,编写定步消卖长的龙格库塔函数,经过学习其原理,已经完成了一维的龙格库塔函数。
仔细思考之后,发现其实如果是需要解多个微分方程组,可以想象成多个微分方程并行进行求解,茄桥迟时间,步长都颤李是共同的,首先把预定的初始值给每个微分方程的第一步,然后每走一步,对多个微分方程共同求解。想通之后发现,整个过程其实很直观,只是不停的逼近计算罢了。编写的定步长的龙格库塔计算函数:
function [x,y]=runge_kutta1(ufunc,y0,h,a,b)%参数表顺序依次是微分方程组的函数名称,初始值向量,步长,时间起点,时间终点(参数形式参考了ode45函数)
n=floor((b-a)/h)%求步数
x(1)=a%时间起点
y(:,1)=y0%赋初值,可以是向量,但是要注意维数
for ii=1:n
x(ii+1)=x(ii)+h
k1=ufunc(x(ii),y(:,ii))
k2=ufunc(x(ii)+h/2,y(:,ii)+h*k1/2)
k3=ufunc(x(ii)+h/2,y(:,ii)+h*k2/2)
k4=ufunc(x(ii)+h,y(:,ii)+h*k3)
y(:,ii+1)=y(:,ii)+h*(k1+2*k2+2*k3+k4)/6
%按照龙格库塔方法进行数值求解
end
调用的子函数以及其调用语句:
function dy=test_fun(x,y)
dy = zeros(3,1)%初始化列向量
dy(1) = y(2) * y(3)
dy(2) = -y(1) + y(3)
dy(3) = -0.51 * y(1) * y(2)
对该微分方程组用ode45和自编的龙格库塔函数进行比较,调用如下:
[T,F] = ode45(@test_fun,[0 15],[1 1 3])
subplot(121)
plot(T,F)%Matlab自带的ode45函数效果
title('ode45函数效果')
[T1,F1]=runge_kutta1(@test_fun,[1 1 3],0.25,0,15)%测试时改变test_fun的函数维数,别忘记改变初始值的维数
subplot(122)
plot(T1,F1)%自编的龙格库塔函数效果
title('自编的 龙格库塔函数')
一:libsvm包下载与使用:LIBSVM是台湾大学林智仁(Lin Chih-Jen)副教授等开发设计的一个简单、易于使用和快速有效的SVM模式识别与回归的软件包,他不但提供了编译好的可在Windows系列系统的执行文件,还提供了源代码,方便改进.
把包解压在C盘之中,如:C:\libsvm-3.18
2.
因为要用libsvm自带的脚本grid.py和easy.py,需要去官网下载绘图早告工具gnuplot,解压到c盘
3.
进入c:\libsvm\tools目录下,用文本编辑器(记事本,edit都可以)修改grid.py和easy.py两个文件,找到其中关于gnuplot路径的那项,根据实际路径进行修改,并保存
4python与libsvm的连接(参考SVM学习笔记(2)LIBSVM在python下的使用 )
a.打开IDLE(python GUI),输入
>>>import sys
>>>sys.version
如果你的python是32位,将出现如下字符:
‘2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)]’
这个时候LIBSVM的python接口设置将非常简单。在libsvm-3.16文件夹下的windows文件夹中找到动态链接库libsvm.dll,陆含明将其添加到系统目录,如`C:\WINDOWS\system32\’,即可在python中使用libsvm
b.如果你是64位的请参考文献,请参考上述连接。
5.执行一个小例子
import os
os.chdir('C:\libsvm-3.18\python')#请根据实际路径修改
from svmutil import *
y, x = svm_read_problem('../heart_scale')#读取自带数据
m = svm_train(y[:200], x[:200], '-c 4')
p_label, p_acc, p_val = svm_predict(y[200:], x[200:], m)
##出现如下结果,应该是正确安装了
optimization finished, #iter = 257
nu = 0.351161
obj = -225.628984, rho = 0.636110
nSV = 91, nBSV = 49
Total nSV = 91
Accuracy = 84.2857% (59/70) (classification)
二几个简单的例子
从下载实验数据集。并且将数据集拷贝到C:\libsvm-3.18\windows下(因为之后我们需要利用该文件夹下的其他文件,这样比较方便,当然之后你用绝对地址也可以了)
建立一老或个py文件,写下如下代码:
例1:
import os
os.chdir('C:\libsvm-3.18\windows')#设定路径
from svmutil import *
y, x = svm_read_problem('train.1.txt')#读入训练数据
yt, xt = svm_read_problem('test.1.txt')#训练测试数据
m = svm_train(y, x )#训练
svm_predict(yt,xt,m)#测试
执行上述代码,精度为:Accuracy = 66.925% (2677/4000) (classification)
常用接口
svm_train() : train an SVM model#训练
svm_predict() : predict testing data#预测
svm_read_problem() : read the data from a LIBSVM-format file.#读取libsvm格式的数据
svm_load_model() : load a LIBSVM model.
svm_save_model() : save model to a file.
evaluations() : evaluate prediction results.
- Function: svm_train#三种训练写法
There are three ways to call svm_train()
>>>model = svm_train(y, x [, 'training_options'])
>>>model = svm_train(prob [, 'training_options'])
>>>model = svm_train(prob, param)
有关参数的设置(read me 文件夹中有详细说明):
Usage: svm-train [options] training_set_file [model_file]
options:
-s svm_type : set type of SVM (default 0)#选择哪一种svm
0 -- C-SVC (multi-class classification)
1 -- nu-SVC (multi-class classification)
2 -- one-class SVM
3 -- epsilon-SVR (regression)
4 -- nu-SVR (regression)
-t kernel_type : set type of kernel function (default 2)#是否用kernel trick
0 -- linear: u'*v
1 -- polynomial: (gamma*u'*v + coef0)^degree
2 -- radial basis function: exp(-gamma*|u-v|^2)
3 -- sigmoid: tanh(gamma*u'*v + coef0)
4 -- precomputed kernel (kernel values in training_set_file)
-d degree : set degree in kernel function (default 3)
-g gamma : set gamma in kernel function (default 1/num_features)
-r coef0 : set coef0 in kernel function (default 0)
-c cost : set the parameter C of C-SVC, epsilon-SVR, and nu-SVR (default 1)
-n nu : set the parameter nu of nu-SVC, one-class SVM, and nu-SVR (default 0.5)
-p epsilon : set the epsilon in loss function of epsilon-SVR (default 0.1)
-m cachesize : set cache memory size in MB (default 100)
-e epsilon : set tolerance of termination criterion (default 0.001)
-h shrinking : whether to use the shrinking heuristics, 0 or 1 (default 1)
-b probability_estimates : whether to train a SVC or SVR model for probability estimates, 0 or 1 (default 0)
-wi weight : set the parameter C of class i to weight*C, for C-SVC (default 1)
-v n: n-fold cross validation mode
-q : quiet mode (no outputs)
三提高预测的准确率:
通过一定的过程,可以提高预测的准确率(在文献2中有详细介绍):
a.转换数据为libsvm可用形式.(可以通过下载的数据了解格式)
b.进行一个简单的尺度变换
c.利用RBF kernel,利用cross-validation来查找最佳的参数 C 和 r
d.利用最佳参数C 和 r ,来训练整个数据集
e.测试
再看例子1:
1.进入cmd模式下,输入如下代码,将现有数据进行适度变换,生成变换后的数据文件train.1.scale.txt
参数说明:
-l 变换后的下限
-u 变换后的上限
-s 参考上文
2执行以下代码
import os
os.chdir('C:\libsvm-3.18\windows')#设定路径
from svmutil import *
y, x = svm_read_problem('train.1.scale.txt')#读入训练数据
yt, xt = svm_read_problem('test.1.scale.txt')#训练测试数据
m = svm_train(y, x )#训练
svm_predict(yt,xt,m)#测试
精确度为Accuracy = 95.6% (3824/4000) (classification)。
可见我们只是做了简单的尺度变换后,预测的正确率大大提升了。
3通过选择最优参数,再次提高预测的准确率:(需要把tools文件下的grid.py拷贝到'C:\libsvm-3.18\windows'下)
import os
os.chdir('C:\libsvm-3.18\windows')#设定路径
from svmutil import *
from grid import *
rate, param = find_parameters('train.1.scale.txt', '-log2c -3,3,1 -log2g -3,3,1')
y, x = svm_read_problem('train.1.scale.txt')#读入训练数据
yt, xt = svm_read_problem('test.1.scale.txt')#训练测试数据
m = svm_train(y, x ,'-c 2 -g 4')#训练
p_label,p_acc,p_vals=svm_predict(yt,xt,m)#测试
执行上面的程序,find_parmaters函数,可以找到对应训练数据较好的参数。后面的log2c,log2g分别设置C和r的搜索范围。搜索机制是以2为底指数搜索,如 –log2c –3 , 3,1 就是参数C,从2^-3,2^-2,2^-1…搜索到2^3.
搜索到较好参数后,在训练的时候加上参数的设置。
另外,读者可以自己试试数据集2,3.
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)