%% 随机产生16棋盘格数据点作为训练样本,每个数据格100个样本
%%样本数据放在checkerboard_16数组中
train_num=100;
num=0;
for i=1:4
for j=1:4
num=num+1;
yellowflag=mod(num+i,2);%d当redflag=1时,产生样本点用红色表示,否则用绿色表示,主要这里是num+i对2取模
x=randi([100*(i-1) 100*i],train_num,1); %产生100个横坐标
y=randi([100*(j-1) 100*j],train_num,1); %产生100个列坐标
if yellowflag
z=randi([1 1],train_num,1);
else
z=randi([0 0],train_num,1);
end
checkerboard_16b(:,:,num)=[x y z];
if num==1
checkerboard_16=checkerboard_16b(:,:,num);
elseif(num>1)
checkerboard_16=[checkerboard_16;checkerboard_16b(:,:,num)];%递归调用时一定要小心
end
end
end
%% 画出产生的16棋盘样本训练数据分布示意图
for k=1:1600
if checkerboard_16(k,3)==1
plot(checkerboard_16(k,2),checkerboard_16(k,1),'yo');
else
plot(checkerboard_16(k,2),checkerboard_16(k,1),'go');
end
hold on %每次画完后要hold on,当然也可以使plot的2个参数为向量
end
title('训练数据分布');
axis([-10 420 -20 420]);
%% 用svm训练分类模型
checkerboard_16_label=checkerboard_16(:,end);%取出样本类标签
checkerboard_16_data=checkerboard_16(:,1:end-1);%取出样本属性
model=svmtrain(checkerboard_16_label,checkerboard_16_data)
%% 随机产生16棋盘格数据点作为训练样本,每个数据格100个样本
%%样本数据放在checkerboard_16_test数组中
train_num=20;
num=0;
for i=1:4
for j=1:4
num=num+1;
redflag=mod(num+i,2);%d当redflag=1时,产生样本点用红色表示,否则用绿色表示
x=randi([100*(i-1) 100*i],train_num,1); %产生100个横坐标
y=randi([100*(j-1) 100*j],train_num,1); %产生100个列坐标
if redflag
z=randi([1 1],train_num,1);
else
z=randi([0 0],train_num,1);
end
checkerboard_16_test_b(:,:,num)=[x y z];
if num==1
checkerboard_16_test=checkerboard_16_test_b(:,:,num);
elseif(num>1)
checkerboard_16_test=[checkerboard_16_test;checkerboard_16_test_b(:,:,num)];%递归调用时一定要小心
end
end
end
%% 画出%% 画出产生的16棋盘样本测试数据分布示意图
figure;
for k=1:320
if checkerboard_16_test(k,3)==1
plot(checkerboard_16_test(k,2),checkerboard_16_test(k,1),'yo');
else
plot(checkerboard_16_test(k,2),checkerboard_16_test(k,1),'go');
end
hold on %每次画完后要hold on,当然也可以使plot的2个参数为向量
end
title('测试原数据分布');
axis([-10 420 -20 420]);
%% 用svm进行预测
checkerboard_16_test_label=checkerboard_16_test(:,end);
checkerboard_16_test_data=checkerboard_16_test(:,1:end-1);
[checkerboard_16_predict_label,checkerboard_16_accuarcy]=svmpredict(checkerboard_16_test_label,checkerboard_16_test_data,model)
%% 画出预测数据样本点的分布,并将预测错误的点用红色标记出来,正确预测的用绿色标记出来
figure;
for k=1:320
if checkerboard_16_predict_label(k)==1 && checkerboard_16_test_label(k)==1
plot(checkerboard_16_test(k,2),checkerboard_16_test(k,1),'go');
elseif checkerboard_16_predict_label(k)==0 && checkerboard_16_test_label(k)==0
plot(checkerboard_16_test(k,2),checkerboard_16_test(k,1),'go');
else
plot(checkerboard_16_test(k,2),checkerboard_16_test(k,1),'ro');
end
hold on %每次画完后要hold on,当然也可以使plot的2个参数为向量
end
title('分类预测数据分布');
axis([-10 420 -20 420]);