clear;
clc;
load F:\研究生教学\train1.txt;
load F:\研究生教学\trainlabel.txt;
% 以上语句给出输入、输出值,即训练样本,其中 x表示输入向量,y表示输出值(+1表示一类,-1表示一类),这是一个两类分类问题。
x=train1;
y=trainlabel;
rou=0.3;
n=length(y);
for i=1:n
for j=1:n
d(i,j)=y(i)*y(j)*exp(-(x(i,:)-x(j,:))*(x(i,:)-x(j,:))'/rou);
end
end
% 以上是计算核函数矩阵
H=d;
f(1:n)=-1;
%A(1:n)=0;
%b=1;
A=[];B=[];
Aeq(1:n)=y';
beq=0;
C=5;
LB1(1:n)=0;UB1(1:n)=C;
LB=LB1';UB=UB1';
[X ok how]=quadprog(H,f,A,B,Aeq,beq,LB,UB);
% 以上是对支持向量机的对偶形式进行优化,从而解出参数值alfa,这里存入变量X中。
svm=0;
for i=1:n
if abs(X(i))<=0.000000001
X(i)=0;
svm=svm+1;
end
end
svms1=n-svm
% 以上是求出支持向量的个数,alfa值不为零所对应的样本为支持向量。
k=1;
for i=1:n
if X(i)>0&X(i)<C
xx(k,:)=x(i,:);
yy(k)=y(i);
k=k+1;
end
end
for j=1:k-1
ddd=0;
for i=1:n
ddd=ddd+X(i)*y(i)*exp(-(x(i,:)-xx(j,:))*(x(i,:)-xx(j,:))'/rou);
end
bb(j)=yy(j)-ddd;
end
b=sum(bb)/(k-1);
% 根据KKT条件,求出b的值,一般采用一个支持向量就可以求出b的值,这里为了稳定起见,采用多个支持向量求b值,然后取平均。
load F:\研究生教学\test1.txt;
load F:\研究生教学\testlabel.txt;
test=test1;
qw=testlabel;
% 以上是测试样本的输入输出。
N=length(test);
for R=1:N
dd=0;
for i=1:n
dd=dd+X(i)*y(i)*exp(-((test(R,:)-x(i,:))*(test(R,:)-x(i,:))')/rou);
end
okb(R)=dd+b;
if (dd+b)>0
shiji(R)=1;
else
shiji(R)=-1;
end
end
% 以上将测试样本代入支持向量机进行分类的结果。
k=0;
for i=1:N
if shiji(i)==qw(i)
k=k+1;
end
end
k/N
% 以上是将支持向量机的实际输出与期望输出进行比较,计算出测试的正确率。
评论0