AClassification Problem
1. SYSTEM: ATwo-Nested-Spirals Problem
Two-Nest-Spiralsproblem is a well-known classification benchmark problem. It contains twonested spirals, ‘o’ and ‘+’, as shown in figure. The task is to separate thetwo nested spirals.
用matlab实现BP算法,其中加入了L2正则化项,在隐藏层最后一层使用Dropout。输出进行独热编码(one-hot),使用softmax。在图上打印出模型进行判断的边界。
有4个文件。
1)TwoNestSpiralsUseGivenSet.m
2)ReLU.m
3) ReLUGradient.m
4) softmax.m
应该要把定义一个前向传播的函数。应该在训练和测试的时候都要用到。如果修改了训练中前向传播的代码,而忘记修改测试的代码,则会出错或者产生奇怪的结果。但是感觉matlab中传递权重和偏置给函数中很麻烦,貌似不能直接将所有权重和偏置放入一个集合,然后在函数中重新取出。
------------- 没有开启dropout
------------------开启dropout
------------------模型的判定区域
1)TwoNestSpiralsUseGivenSet.m
% 可以自由设置螺旋曲线的样本个数。 可以正确画出正负类的区域。
% 可以使用softmax
% 加入正则项
% 给隐藏层最后一层使用dropout
clear;
%% 产生双螺旋数据
train_num=100; % 0和1的样本各train_num个。 可以设置任意数目。
%
train_i=(1: (105-1)/train_num: 105-(105-1)/train_num)';
%双螺旋数据点的产生方程
alpha1=pi*(train_i-1)/25;
beta=0.4*((105-train_i)/(104)); %
x0=beta.*cos(alpha1);
y0=beta.*sin(alpha1);
z0=zeros(train_num,1);
x1=-beta.*cos(alpha1);
y1=-beta.*sin(alpha1);
z1=ones(train_num,1);
% 随机打乱顺序
k=rand(1,2*train_num);
[m,n]=sort(k);
train=[x0 y0 z0;x1,y1,z1];
train_label1=train(n(1:2*train_num),end)'; % 1*(2*train_num)
train_data1=train(n(1:2*train_num),1:end-1)'; % 2*(2*train_num)
% 把1维的输出变成2维的输出 0->[1 0], 1->[0 1]
for i=1:2*train_num
switch train_label1(i)
case 0
train_label2(i,:)=[1 0];