clc;
clear all;
close all;
qid=1;
kernel='gaussian'
%polynomial gaussian sigmoid
dev=0.000008;
% dev=0.11;
tt=0;
tt=tt+1;
sigma=1;
switch qid
case 1
f=@(x)(1./sqrt(x));
xtrain=1:0.25:100;
dtrain=f(xtrain);
xtest=xtrain+0.5*(xtrain(2)-xtrain(1));
dtest=f(xtest);
case 2
f=@(x)sin(x);
xtrain=0:0.04*pi:4*pi;
dtrain=f(xtrain);
xtest=xtrain+0.5*(xtrain(2)-xtrain(1));
dtest=f(xtest);
case 3
f=@(x)(sin(x)./x).^2;
xtrain=-4*pi:0.07*pi:4*pi;
dtrain=f(xtrain);
xtest=xtrain+0.5*(xtrain(2)-xtrain(1));
dtest=f(xtest);
case 4
f=@(x)exp(-x.^2).*sin(x.^2);
xtrain=-4*pi:0.07*pi:4*pi;
dtrain=f(xtrain);
xtest=xtrain+0.5*(xtrain(2)-xtrain(1));
dtest=f(xtest);
% figure(1),
% plot(XTrain,DTrain);
end
tic
%取样
xnum=length(xtrain);
Y=[];
X=[];
D=[];
D = ones(1,xnum);
ji = 1:2:xnum;
D(ji) = -1;
Y = dtrain+dev*D;
X=[xtrain;Y];
K=[];
H=[];
dis=[];
epsilon=1e-5;
tic
switch kernel
case 'polynomial'
for x_index=1:1:xnum;
x_temp=X(:,x_index)*ones(1,xnum);
x_temp=x_temp.*X;
dis=sum(x_temp);
K(x_index,:)=(1+dis).*(1+dis).*(1+dis);
end
case 'gaussian'
for x_index=1:1:xnum;
x_temp=X(:,x_index)*ones(1,xnum);
x_temp=x_temp-X;
x_temp=x_temp.*x_temp;
dis=sum(x_temp);
K(x_index,:)=exp(-dis./(2*sigma^2));
end
case 'sigmoid'
% sigmoid
for x_index=1:1:xnum;
x_temp=X(:,x_index)*ones(1,xnum);
x_temp=x_temp-X;
x_temp=x_temp.*x_temp;
dis=sum(x_temp);
K(x_index,:)=1./(1+exp(-dis));
end
end
C=inf;
D_T=D'*D;
H=D_T.*K;
H = H+1e-10*eye(size(H));
f=-ones(xnum,1);
vlb = zeros(xnum,1);
vub = C*ones(xnum,1);
xx0 = zeros(xnum,1);
A = D;
bb =0;
b=1;
A=[];
bb=[];
Alpha= quadprog(H,f,[],[],A,bb,vlb,vub,xx0);
sv=find(Alpha>epsilon);
max_sv=length(sv);
for sv1_index=1:1:max_sv
temp_b=0;
for sv2_index=1:1:max_sv
temp=Alpha(sv(sv2_index))*D(sv(sv2_index))*K(sv(sv2_index),sv(sv1_index));
temp_b=temp_b+temp;
end
temp_b=1/D(sv(sv1_index))-temp_b;
b=[b,temp_b];
end
b0=sum(b)/max_sv;
b0=(b0>epsilon).*b0;
switch kernel
case 'polynomial'
%多项式
syms m n
x_temp=[m;n]*ones(1,xnum);
x_temp=x_temp.*X;
dis=sum(x_temp);
Kc=(1+dis).*(1+dis).*(1+dis);
testc1=sum(Alpha'.*D.*Kc);
z=testc1+b0;
case 'gaussian'
%高斯
syms m n
x_temp=[m;n]*ones(1,xnum);
x_temp=x_temp-X;
x_temp=x_temp.*x_temp;
dis=sum(x_temp);
Kc=exp(-dis./(2*sigma^2));
testc1=sum(Alpha'.*D.*Kc);
z=testc1+b0;
case 'sigmoid'
%sigmoid
syms m n
x_temp=[m;n]*ones(1,xnum);
x_temp=x_temp.*X;
dis=sum(x_temp);
Kc =tanh(7*dis-0.5);
testc1=sum(Alpha'.*D.*Kc);
z=testc1+b0;
end
switch qid
case 1
h=ezplot(z,[1 100 -0.5 1.5]);hold on;
% set(h,'color','r')
case 2
h=ezplot(z,[0 4*pi -1 1]);hold on;
case 3
h=ezplot(z,[-4*pi 4*pi 1.5196e-33 0.9997]);hold on;
case 4
h=ezplot(z,[-4*pi 4*pi -0.0138 0.3218] );hold on;
end
set(h,'color','k');
toc
time=toc
plot(X(1,:),X(2,:),'r*');hold on;
plot(xtest,dtest,'bo');hold on;
legend('测试结果','样本','原函数');
title('拟合结果');
xlabel('x');
ylabel('y');