?? matlabsvm2.m
字號:
%X,y表示學習樣本
%X是N*(p-1)矩陣,y是1*N矩陣
%x是未知樣本,q*N矩陣
%k表示支持向量以及錯分向量所在位值
%m1表示支持向量所在位值
%d是margin
function [gg,zz,a,k,d,m1]=matlabsvm2(C,KM,o,w,X,y,x)
global KM
global o
global w
N=size(X,1);
p=size(X,2)+1;
%%%%%%% 產生、加載學習樣本 %%%%%%%
for i=1:N
yy(:,i)=[X(i,:),y(i)]';
end
qq=yy';
save data.dat qq -ASCII -TABS
%%%%%%%%% 優化拉格朗日乘子 %%%%%%%%%
aa=rand(N,1); %拉格朗日乘子初始值
%lb=zeros(N,1);
ub=C*ones(N,1);
fun=@myfun;
con=@mycon;
a=fmincon(fun,aa,[],[],[],[],[],ub,con);
%%%%%%%% 構造分類函數 %%%%%%%%%
a0=a';
k=argk(a0);
m1=zeros(1,size(k,2));
for i=1:size(k,2)
if a0(k(i))~=C
m1(i)=k(i);
end
end
q=size(x,1);
for m=1:q
for n=1:N
switch KM
case 'Kmulti'
u1(n)=(1+sum(X(n,:).*x(m,:)))^o; %Kmulti(X(n,:),x(m,:),o,w);
u2(n)=(1+sum(X(n,:).*X(k(1),:)))^o; %Kmulti(X(n,:),X(k(1),:),o,w);
case 'Kgauss'
u1(n)=exp(sum(-(X(n,:)-x(m,:)).^2)/o^2); %Kgauss(X(n,:),x(m,:),o,w);
u2(n)=exp(sum(-(X(n,:)-X(k(1),:)).^2)/o^2); %Kgauss(X(n,:),X(k(1),:),o,w);
case 'Ktanh'
u1(n)=tanh(o*sum(X(n,:).*x(m,:))-w); %Ktanh(X(n,:),x(m,:),o,w);
u2(n)=tanh(o*sum(X(n,:).*X(k(1),:))-w); %Ktanh(X(n,:),X(k(1),:),o,w);
otherwise
disp('核函數輸入錯誤')
end
g(n,m)=a(n)*y(n)*u1(n)-a(n)*y(n)*u2(n)+y(k(1))/N;
end
end
gg=sum(g);
%%%%%%%% 分類 %%%%%%%%%%
for i=1:q
if gg(i)>0
zz(i)=1;
elseif gg(i)<0
zz(i)=-1;
end
end
%%%%%%%%% 求解margin %%%%%%%%%
for i=1:N
d1(i,:)=a(i)*y(i)*X(i,:);
end
d2=sum(d1);
d=2/sqrt(d2*d2');
%%%%%%%% 子函數 %%%%%%%
function k=argk(z)
N=size(z,2);
m=0;
for i=1:N
if z(i)>1e-5
m=m+1;
k(m)=i;
end
end
%%%%%%%%%%%
function f=myfun(a)
global KM
global o
global w
load data.dat;
N=size(data,1);
m=size(data,2)-1;
for t=1:N
for n=1:N
switch KM
case 'Kmulti'
u(t,n)=(1+sum(data(t,1:m).*data(n,1:m)))^o;
case 'Kgauss'
u(t,n)=exp(sum(-(data(t,1:m)-data(n,1:m)).^2)/o^2);
case 'Ktanh'
u(t,n)=tanh(o*sum(data(t,1:m).*data(n,1:m))-w);
otherwise
disp('核函數輸入錯誤')
end
%u(t,n)=sum(data(t,1:m).*data(n,1:m));
q(n,t)=a(t,1)*a(n,1)*data(t,m+1)*data(n,m+1)*u(t,n);
end
end
qq=sum(q);
f=1/2*sum(qq)-sum(a);
%%%%%%%%%%%%%%
function [c,ceq]=mycon(a)
load data.dat;
[N,n]=size(data);
for i=1:N
s(i)=a(i,1)*data(i,n);
end
c=-a';
ceq=sum(s);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -