1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
%Perceptron.m
clear variables
clc
% 读取数据
load ('test_images.mat');
load ('test_labels.mat');
% 设定数据量
train_num = 1000;
test_num =200;
% 临时变量以及各个感知器参数
j = 1;
lr = 0.1;%学习率
epoch = 70;%设定训练多少轮
number = [4,8];%要取的数字组合
% 提取数据中标签为任意组合的样本,共计200个
% 由于数据本身打乱过,因此可以直接取200个而不考虑样本不均衡问题
%提取数字4和8的样本
for i = 1:10000
if test_labels1(i)==number(1)|| test_labels1(i)==number(2)
data(:,:,j) = test_images(:,:,i);
label(j) = test_labels1(i);%取相应标签
j=j+1;
if j>train_num+test_num
break;
end
end
end
% 由于感知器输出结果仅为0、1,因此要将标签进行转换
% 本程序中,由于matlab计算不等式相对容易,因此没有对样本进行规范化
% 由于没有进行规范化,后面更新权值w需要借助标签,因此标签需要置-1和1
for k = 1:train_num+test_num
if label(k)==number(1)
label(k)=-1;
end
if label(k)==number(2)
label(k)=1;
end
end
data_ = liansuyun_mat2vector(data, train_num + test_num);%矩阵转向量
%数据归一化
% [data_,PS]=mapminmax(data_);
%train_data =[data_(1:train_num,:) label1(1:train_num,1)];
test_data = [data_(train_num+1:train_num+test_num,:),ones(test_num,1)];%这里对测试数据也进行增广变换
% test_data = data_(train_num+1:train_num+test_num,:);
% 训练权值
w=perceptionLearn(data_(1:train_num,:),label(1:train_num),lr,epoch);
% 测试(预测)
for k = 1:test_num
if test_data(k,:)*w'>0
result(k) = 1;
else
result(k) = -1;
end
end
% 输出预测的准确率
acc = 0;
sum=0;
sum1=0;
for sample = 1:test_num
if result(sample)==label(train_num+sample)
acc = acc+1;
else
fprintf('分类错误的序号为:%d\n',sample);
sum=sum+1;
end
end
sum1=test_num-sum;
fprintf('分类错误的个数为:%d,分类正确的个数为:%d\n',sum,sum1);
fprintf('精确度为:%5.2f%%\n',(acc/test_num)*100);
|