📄 gradz.m
字号:
%计算目标函数的梯度
function G=gradz(A,Y,w,r,m,n,kk)
%A为sample函数产生的样本矩阵
%Y为A中每个样本的分类标号
%w和r分别为待求的n×1列向量和标量,第一次为给定的初始值,以后为迭代得到的值
%m和n分别为样本的个数及属性
%kk是来标志用哪个光滑多项式代替正号函数
D=diag(Y);
e=ones(m,1);
DA=D*A;
De=D*e;
V=e-(DA*w)+(De*r);
G=zeros(n+1,1);
for i=1:m
if V(i)>=0.01
for j=1:n
G(j,1)= G(j,1)-V(i)*DA(i,j);
end
G(n+1,1)= G(n+1,1)+V(i)*D(i,i);
elseif V(i)<0.01 & V(i)>-0.01
switch kk
case 1 %用多项式1代替正号函数
p1V=V(i)^2*25+V(i)*0.5+0.0025;
p11=50*V(i)+0.5;
for j=1:n
G(j,1)=G(j,1)-DA(i,j)*p1V*p11;
end
G(n+1,1)=G(n+1,1)+D(i,i)*p1V*p11;
case 2 %用多项式2代替正号函数
pV2=(-1/1600)*(100*V(i)+1)^3*(100*V(i)-3);
p21=(-3/16)*(100*V(i)+1)^2*(100*V(i)-3);
p22=(-1/16)*(100*V(i)+1)^3;
for j=1:n
G(j,1)= G(j,1)-pV2*(p21+p22)*D(i,i)*A(i,j);
end
G(n+1,1)= G(n+1,1)+pV2*(p21+p22)*D(i,i);
case 3 %用多项式3代替正号函数
pV3=(1/32)*(100*V(i)+1)^3*(10000*V(i)^3-300*V(i)^2+V(i)+0.05);
p31=(300/32)*(100*V(i)+1)^2*(10000*V(i)^3-300*V(i)^2+V(i)+0.05);
p32=(1/32)*(100*V(i)+1)^3*(30000*V(i)^2-600*V(i)+1);
for j=1:n
G(j,1)= G(j,1)-pV3*(p31+p32)*D(i,i)*A(i,j);
end
G(n+1,1)= G(n+1,1)+pV3*(p31+p32)*D(i,i);
otherwise
disp('最后一个参数kk的值只能取1,2,3!');
end
end
end
G(1:n)=G(1:n)+w;
G(n+1,1)=G(n+1,1)+r;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -