1.命令函数部分:
clear%清屏
clc
X =load('data.txt')
n = length(X)%总样本数量
y = X(:,4)%类纳辩别标志
X = X(:,1:3)
TOL = 0.0001%精度要求
C = 1%参数,对损失函数的权重
b = 0%初始设置截距b
Wold = 0%未更新a时的W(a)
Wnew = 0%更新a后的W(a)
for i = 1 : 50%设置类别标志为1或者-1
y(i) = -1
end
a = zeros(n,1)%参数a
for i = 1 : n%随机初始化a,a属于[0,C]
a(i) = 0.2
end
%为简化计算,减少重复计算进行的计算
K = ones(n,n)
for i = 1 :n%求出K矩阵,便于之后的计算
for j = 1 : n
K(i,j) = k(X(i,:),X(j,:))
end
end
sum = zeros(n,1)%中间变量,便于之后的计算,sum(k)=sigma a(i)*y(i)*K(k,i)
for k = 1 : n
for i = 1 : n
sum(k) = sum(k) + a(i) * y(i) * K(i,k)
end
end
while 1%迭代过程
%启发式选点
n1 = 1%初始化,n1,n2代表选择的2个点
n2 = 2
%n1按照第一个违反KKT条件的点选择
while n1 <= n
if y(n1) * (sum(n1) + b) == 1 &&a(n1) >= C &&a(n1) <= 0
break
end
if y(n1) * (sum(n1) + b) >1 &&a(n1) ~= 0
break
end
if y(n1) * (sum(n1) + b) <1 &&a(n1) ~=C
break
end
n1 = n1 + 1
end
%n2按启迟照最大化|E1-E2|的原则选取
E1 = 0
E2 = 0
maxDiff = 0%假设的最大误差
E1 = sum(n1) + b - y(n1)%n1的误差
for i = 1 : n
tempSum = sum(i) + b - y(i)
if abs(E1 - tempSum)>maxDiff
maxDiff = abs(E1 - tempSum)
n2 = i
E2 = tempSum
end
end
%以下进行更新
a1old = a(n1)
a2old = a(n2)
KK = K(n1,n1) + K(n2,n2) - 2*K(n1,n2)
a2new = a2old + y(n2) *(E1 - E2) / KK%计算新的a2
%a2必须满足约束条件
S = y(n1) * y(n2)
if S == -1
U = max(0,a2old - a1old)
V = min(C,C - a1old + a2old)
else
U = max(0,a1old + a2old - C)
V = min(C,a1old + a2old)
end
if a2new >V
a2new = V
end
if a2new <U
a2new = U
end
a1new = a1old + S * (a2old - a2new)%计算新的a1
a(n1) = a1new%更新a
a(n2) = a2new
%更新部分值
sum = zeros(n,1)
for k = 1 : n
for i = 1 : n
sum(k) = sum(k) + a(i) * y(i) * K(i,k)
end
end
Wold = Wnew
Wnew = 0%更新a后的W(a)
tempSum = 0%临时变量
for i = 1 : n
for j = 1 : n
tempSum= tempSum + y(i )*y(j)*a(i)*a(j)*K(i,j)
end
Wnew= Wnew+ a(i)
end
Wnew= Wnew - 0.5 * tempSum
%以下更新b:通过找到某一个支持向量来计算
support = 1%支持向量坐标初始化
while abs(a(support))<1e-4 &&support <= n
support = support + 1
end
b = 1 / y(support) - sum(support)
%判断停止条件
if abs(Wnew/ Wold - 1 ) <= TOL
break
end
end
%输出结果:包括原分类,辨别函数计算结果,svm分类结果
for i = 1 : n
fprintf('第%d点:原标号 ',i)
if i <= 50
fprintf('-1')
else
fprintf(' 1')
end
fprintf('判别函数值%f 分类结果',sum(i) + b)
if abs(sum(i) + b - 1) <0.5
fprintf('1\n')
else if abs(sum(i) + b + 1) <0.5
fprintf('-1\n')
else
fprintf('归类错误\n')
end
end
end
2.名为f的功能函数部分:
function y = k(x1,x2)
y = exp(-0.5*norm(x1 - x2).^2)
end
3.数据:
0.8871 -0.34918.3376 0
1.25191.20836.5041 0
-1.19251.93381.8790 0
-0.12772.43712.6971 0
1.96973.09066.0391 0
0.76030.82411.5323 0
1.63823.55164.4694 0
1.3438 -0.45395.9366 0
-1.3361 -2.02011.6393 0
-0.38863.30418.0450 0
-0.67806.0196 -0.4084 0
0.3552 -0.10511.2458 0
1.65604.07860.8521 0
0.81173.54516.8925 0
1.4773 -1.93403.9256 0
-0.0732 -0.95260.4609 0
0.15214.37112.2600 0
1.48200.74930.3475 0
0.61404.52618.3776 0
0.57213.34603.7853 0
0.52694.14524.3900 0
1.7879 -0.53902.5516 0
0.98855.76250.1832 0
-0.33182.4373 -0.6884 0
1.35785.47093.4302 0
2.7210 -1.12684.7719 0
0.5039 -0.10252.3650 0
1.11071.68853.7650 0
0.78621.35877.3203 0
1.0444 -1.58413.6349 0
1.77951.72764.9847 0
0.67101.4724 -0.5504 0
0.23030.2720 -1.6028 0
1.7089 -1.73994.8882 0
1.00590.55575.1188 0
2.30500.85452.8294 0
1.95550.98980.3501 0
1.71411.54133.8739 0
2.27495.32804.9604 0
1.61710.52703.3826 0
3.6681 -1.84094.8934 0
1.19641.87811.4146 0
0.77882.10480.0380 0
0.79165.09063.8513 0
1.08071.88495.9766 0
0.63402.60303.6940 0
1.9069 -0.06097.4208 0
1.65994.94098.1108 0
1.37630.88993.9069 0
0.84851.46886.7393 0
3.67926.10924.9051 1
4.38127.21486.1211 1
4.39713.41397.7974 1
5.07167.7253 10.5373 1
5.30788.81386.1682 1
4.14485.51562.8731 1
5.36096.04584.0815 1
4.74526.63521.3689 1
6.02746.5397 -1.9120 1
5.31743.01346.7935 1
7.24593.69703.1246 1
6.10078.10875.5568 1
5.99246.92385.7938 1
6.02635.33337.5185 1
3.64708.09156.4713 1
3.65437.22647.5783 1
5.01146.53353.5229 1
4.43487.4379 -0.0292 1
3.60873.73513.0172 1
3.53745.53547.6578 1
6.00482.0691 10.4513 1
3.14234.00035.4994 1
3.40127.15368.3510 1
5.54715.1372 -1.5090 1
6.50895.49118.0468 1
5.45836.76745.9353 1
4.17272.97983.6027 1
5.16728.41364.8621 1
4.88083.55141.9953 1
5.49384.19983.2440 1
5.45425.88034.4269 1
4.87433.96418.1417 1
5.97626.77112.3816 1
6.69457.28581.8942 1
4.73015.76521.6608 1
4.70845.36233.2596 1
6.04083.31387.7876 1
4.60248.35170.2193 1
4.70546.6633 -0.3492 1
4.71395.63626.2330 1
4.0850 10.71183.3541 1
6.10886.16354.2292 1
4.98365.40426.7422 1
6.13876.19492.5614 1
6.07007.03733.3256 1
5.68815.13639.9254 1
7.20582.35704.7361 1
4.29727.32454.7928 1
4.77948.12353.1827 1
3.92826.4092 -0.6339 1
你好,LIBSVM简介 [.v5o#VdsH:Luo+]
支持向量机所涉及到的数学知识对一般的化学研究者来说是比较难的,自己编程实现该算法难度就更大了。但是现在的网络资源非常发达,而且国际上的科学研究者把他们的研究成果已经放在网络上,免费提供给用于研究目的,这样方便大多数的研究者,不必要花费大量的时间理解SVM算法的深奥数学原理和计算机程序设计。目前有关SVM计算的相关软件有很多,如LIBSVM、mySVM、SVMLight等,这些软件大部分的免费下载地址和简单介绍都可以在[url]
http://www.kernel-machines.org/[/url]上获得。 pq2j j.XL7m4B
LIBSVM是台湾大学林智仁(Lin Chih-Jen)副教授等开发设计的一个简单、易于使用和快速嫌握有效的SVM模式识别与回归的软件包,他不但提供了编译好的可在Windows系列系统的执行文件,还提供了源代码,方便改进、修改以及在其它 *** 作系统上应用;该软件还有一个特点,就是对SVM所涉及的参数调节相对比较少,提供了很多的默认参数,利用这些默认参数就可以解决很多问题;并且提供了交互检验(Cross Validation)的功能。该软件包可以在[url]
http://www.csie.ntu.edu.tw/~cjlin/[/url]免费获得。该软件可以解决C-SVM分类、-SVM分类、-SVM回归和-SVM回归等问题,包括基于一对一算法的多类模式识别问题。在第2章中我们也介绍了该软件的一些优点,因此通过综合考虑,我们决定采用该软件作为工作软件。SVM用于模式识别或回归时,SVM方法及其参数、核函数及其参数的选择,目前国际上还没有形成一个统一的模式,也就是说最优SVM算法参数选择还只能是凭借经验、实验对比、大范行者携围的搜寻或者利用软件包提供的交互检验功能进行寻优。档伏
4lE qC iC mt'j?)FN"b
LIBSVM使用方法 p-t8\q9P!e(jVL6e
1XP6S+YzWZ LibSVM是以源代码和可执行文件两种方式给出的。如果是Windows系列 *** 作系统,可以直接使用软件包提供的程序,也可以进行修改编译;如果是Unix类系统,必须自己编译,软件包中提供了编译格式文件,我们在SGI工作站( *** 作系统IRIX6.5)上,使用免费编译器GNU C++3.3编译通过。 |U4E P})T/u
8rur3[8U.zeQ9VX
LIBSVM使用的数据格式 W2}&p]lU
该软件使用的训练数据和检验数据文件格式如下: x4Vy\ G1y6g\3~
<label><index1>:<value1><index2>:<value2>...
6a X)I&x9l@4cU {2q 其中<label>是训练数据集的目标值,对于分类,它是标识某类的整数(支持多个类);对于回归,是任意实数。<index>是以1开始的整数,可以是不连续的;<value>为实数,也就是我们常说的自变量。检验数据文件中的label只用于计算准确度或误差,如果它是未知的,只需用一个数填写这一栏,也可以空着不填。在程序包中,还包括有一个训练数据实例:heart_scale,方便参考数据文件格式以及练习使用软件。
H'?-]1a%HC Us 可以编写小程序,将自己常用的数据格式转换成这种格式
"pm2ML7E{~5t
mLf \*?8n"x9A Svmtrain和Svmpredict的用法
g Ddk2C-Cd LIBSVM软件提供的各种功能都是DOS命令执行方式。我们主要用到两个程序,svmtrain(训练建模)和svmpredict(使用已有的模型进行预测),下面分别对这两个程序的使用方法、各参数的意义以及设置方法做一个简单介绍:
8x*l/L/E0b Svmtrain的用法:svmtrain [options] training_set_file [model_file] U1NjN e f%W}0R
Options:可用的选项即表示的涵义如下
'fH*{2_5u -s svm类型:SVM设置类型(默认0)
_`"JB+i@9~ 0 -- C-SVC O)Z5y$E$c#Cy
1 --v-SVC
MQL(dt 2 – 一类SVM
$E(@D ShN 3 -- e -SVR
] K ]V~b+t0}2Gl 4 -- v-SVR
J0j5|rJ[ -t 核函数类型:核函数设置类型(默认2)
,pvvLy O 0 – 线性:u'v Cj-ABjn8Cbk
1 – 多项式:(r*u'v + coef0)^degree 7nq{|q*] @1{3T
2 – RBF函数:exp(-r|u-v|^2) o4S JB-zV2P%?,C
3 –sigmoid:tanh(r*u'v + coef0) \"m w._)u|,Bu4C
-d degree:核函数中的degree设置(默认3) K0?8R!fRg+W2k
-g r(gama):核函数中的函数设置(默认1/ k) :u6r%p*o$QG
-r coef0:核函数中的coef0设置(默认0) &xO&LjbX(y
-c cost:设置C-SVC, -SVR和-SVR的参数(默认1) Y:N.Jv8v
-n nu:设置-SVC,一类SVM和- SVR的参数(默认0.5)
r:h%XN2HH6Bf -p e:设置 -SVR 中损失函数的值(默认0.1) sW'o.m-R7]
-m cachesize:设置cache内存大小,以MB为单位(默认40)
:K ^*y[BE7]\7U -e :设置允许的终止判据(默认0.001) )rI#@C7F5Q Rw,J R']Vz{
-h shrinking:是否使用启发式,0或1(默认1) "|g6wfu
-wi weight:设置第几类的参数C为weightC(C-SVC中的C)(默认1)
4Rf W-~|oY] -v n: n-fold交互检验模式 Js}7ee&n\{c
其中-g选项中的k是指输入数据中的属性数。option -v 随机地将数据剖分为n部分并计算交互检验准确度和均方根误差。以上这些参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。training_set_file是要进行训练的数据集;model_file是训练结束后产生的模型文件,文件中包括支持向量样本数、支持向量样本以及lagrange系数等必须的参数;该参数如果不设置将采用默认的文件名,也可以设置成自己惯用的文件名。 E M%WTF
Svmpredict的用法:svmpredict test_file model_file output_file 1bv R [?d
model_file是由svmtrain产生的模型文件;test_file是要进行预测的数据文件;Output_file是svmpredict的输出文件。svm-predict没有其它的选项。 FOiJEO4vsVo#Q
Sx$^&O+K7I@-Vz(M svmtrain -s 0 -c 1000 -t 1 -g 1 -r 1 -d 3 data_file VAHQ!cm+b*Q)t U
训练一个由多项式核(u'v+1)^3和C=1000组成的分类器。 u:p+jD5q"Pr
svmtrain -s 1 -n 0.1 -t 2 -g 0.5 -e 0.00001 data_file
JxJ&A.J8n t/D*[+Kd 在RBF核函数exp(-0.5|u-v|^2)和终止允许限0.00001的条件下,训练一个-SVM ( = 0.1)分类器。
9P |4Q'xM}7mo[K!T svmtrain -s 3 -p 0.1 -t 0 -c 10 data_file
1| A {}9R{+qI 以线性核函数u'v和C=10及损失函数= 0.1求解SVM回归。^ 27118希望对你有帮助!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)