function ww = gradient_descent(training_example,eta)
[m,n] = size(training_example); %m--行,n--列
num_x = n-1; %输入量个数 ,最后一项是目标值,所以少一个
for i=1:num_x %初始化权值矩阵在(-1,1),这个相对较好
w(i) = 2*(rand()-0.5);
end
fault = 1;
while(fault>1e-5) %给定的判断条件
fault = 0;
delta_w(1:num_x) = 0; %初始化误差值
%----------------对于每一行数据----------------------------
for i=1:m
xx = training_example(i,1:num_x)'; %第i行的所有x值
output(i) = w*xx; %计算输出值
if output(i)>0 %如果输出大于0,让它等于1,这样误差为0,
output(i)=1;
else output(i)=0;
end
t = training_example(i,n); %第i行的目标值
for j=1:num_x
delta_w(j) = delta_w(j) + eta*(t-output(i))*training_example(i,j); %产生误差项
end
end
%---------------更新权值矩阵---------------------------
for j=1:num_x
w(j) = w(j) + delta_w(j);
end
%----------------根据新的权值矩阵计算一下目标函数的现在的输出out--------------------------
for i=1:m
out(i) = w*training_example(i,1:num_x)';
if out(i)>0 out(i)=1;
else out(i)=0;
end
end
%-------------------判断条件:所有的out值与所给的t一样------------------------------------
%------------------方法比较笨,就是一个一个比较,肯定有更好的结束条件,还没想好-------------
if ((out(1)==1)&&(out(2)==1)&&(out(3)==1)&&(out(4)==1)&&(out(5)==0)&&(out(6)==0)&&(out(7)==0)&&(out(8)==0))
fault=0; %条件符合了,结束
else fault=1; %没符合,继续运行
end
end
ww = w; %最后返回所得的权值矩阵
其中第一个输入:training_example为样本数据,及所属类别,eta步长,一般很小:0.1
窗口输入:
s=[-3,-5,1;1,0,1;2,1.5,1;-1,-1.5,1;0,2,0;1.5,2,0;-1,0,0;-2,-1.5,0];
w = gradient_descent(s,0.1);plot(s(1:4,1),s(1:4,2),'*',s(5:8,1),s(5:8,2),'+');
hold on;k=[-5:0.1:5];
p = -w(1)/w(2)*k;
plot(k,p);