参考资源:
- 《机器学习》. 周志华
- 《统计学习方法》. 李航
- 《数学之美》. 吴军
- 浙江大学胡浩基老师的慕课:https://www.icourse163.org/u/mooc37925478665678513?userId=1397947607
神经网络
神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应。(P97.《机器学习》…Kohonen,1988)
(S:适应性的简单单元,并行互连的网络)
神经元
神经元既是上文所述的简单单元,单个神经元能接受n个其他神经元传递过来的输入信号,这些输入信号经过带权重的连接进行传递,神经元接受的总信号与神经元的阈值进行比较,然后通过“激活函数”处理以产生神经元的输出。常用的激活函数有阶跃函数和sigmoid函数。通过以上过程,模拟生物学中神经元电位超过阈值后产生兴奋输出1,神经电位低于阈值输出0的过程。
图片来源于:百度
感知机
感知机有两层神经元组成,即输入层和输出层,如下图所示:
图片来源于:百度
感知器进行分类的运算过程
输入:[ X1=(x1,x2,x3,……),y1], [X2,y2], [X3,y3] …… 其中X表示样本,x表示特征,y为标签
输出:W=[w1, w2, w3,……],阈值集合sita,W是权重集合向量,w是单条路径上的权重,每一个单元都有一个sita
求解问题:
求
满
足
[
y
1
,
y
2
,
y
3
,
…
…
]
=
f
(
X
∗
(
W
,
s
i
t
a
)
T
)
的
W
,
s
i
t
a
求满足[y1,y2,y3,……]=f(X*(W,sita)^T)的W,sita
求满足[y1,y2,y3,……]=f(X∗(W,sita)T)的W,sita
解:
取激活函数为阶跃函数,即
Y
=
s
g
n
(
X
∗
(
W
,
s
i
t
a
)
T
)
Y=sgn(X*(W,sita)^T)
Y=sgn(X∗(W,sita)T)
第一步:
输
入
一
个
样
本
,
X
1
,
y
1
输入一个样本,X_1,y1
输入一个样本,X1,y1
第二步:
对
W
,
s
i
t
a
在
0
−
1
区
间
内
随
机
赋
值
对W,sita在0-1区间内随机赋值
对W,sita在0−1区间内随机赋值
第三步:
通
过
Y
=
s
g
n
(
X
1
∗
(
W
,
s
i
t
a
)
T
)
,
计
算
Y
通过Y=sgn(X_1*(W,sita)^T),计算Y
通过Y=sgn(X1∗(W,sita)T),计算Y
第四步:
迭
代
:
[
W
,
s
i
t
a
]
=
[
W
,
s
i
t
a
]
+
u
(
y
−
Y
)
[
X
,
−
1
]
,
其
中
u
为
学
习
率
,
取
0
−
1
区
间
迭代:[W,sita]=[W,sita]+u(y-Y)[X,-1], 其中u为学习率,取0-1区间
迭代:[W,sita]=[W,sita]+u(y−Y)[X,−1],其中u为学习率,取0−1区间
第五步:
输
入
下
一
个
样
本
,
重
复
1
−
4
步
,
直
到
所
有
样
本
输
入
完
毕
输入下一个样本,重复1-4步,直到所有样本输入完毕
输入下一个样本,重复1−4步,直到所有样本输入完毕
第六步:
判
断
W
,
s
i
t
a
是
否
为
所
求
解
,
如
果
不
是
,
重
复
1
−
5
步
;
如
果
是
,
则
结
束
,
输
出
W
,
s
i
t
a
判断W,sita是否为所求解,如果不是,重复1-5步;如果是,则结束,输出W,sita
判断W,sita是否为所求解,如果不是,重复1−5步;如果是,则结束,输出W,sita
第四步骤说明
为什么是[X,-1]:
对
于
一
个
神
经
元
,
y
=
s
g
n
(
w
1
x
1
+
w
2
x
2
+
…
…
+
w
n
x
n
−
s
i
t
a
)
相
当
于
y
=
s
g
n
(
[
W
,
W
n
+
1
)
]
∗
[
X
,
−
1
]
T
对于一个神经元,y=sgn(w1x1+w2x2+……+w_nx_n-sita)相当于y=sgn([W,W_n+1)]*[X,-1]^T
对于一个神经元,y=sgn(w1x1+w2x2+……+wnxn−sita)相当于y=sgn([W,Wn+1)]∗[X,−1]T
实际上在写程序的时候,sita只是相当于(-1)神经元的权重,既是只要对n+1个神经元的权重进行迭代就行了
为什么这样迭代:
该方法是收敛的,不断靠近正确的分界线(胡浩基老师的慕课中进行了证明)
第五步骤说明:
会不会下一个样本的迭代又扰乱了上一个样本的迭代而陷入无限迭代呢?
不会,也可以证明的是通过这样的迭代方式,只要样本是线性可分的,每一次迭代都是向着分离样本的方向前进的,所以一定是可以在有限次迭代中,找到W,sita的。具体的证明过程在胡浩基老师的慕课,《统计学习方法》等资源中都有描写。
总结:单层感知器只能用于线性可分的数据,另外寻找的分隔线具有随机性,不像SVM寻找的最佳分隔线
附MATLAB代码:
clc
clear
%%
tr=[1,1,1;
1,2,1;
2,2,1
-1,-1,0;
-2,-2,0;
-2,-4,0];
te=[1,5,1;
-2,-4,0];
[Aurrancy,number]=single_perceptron(tr,te);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%函数名称:单层感知器二分类函数 single_perceptron.m
%%入口参数:训练数据 测试数据 特征+标签 特征要求是两个维度 标签是0和1
%%出口参数:精度 迭代次数 图像
%%函数功能说明:
%%根据tr绘出二分类的边界曲线,对te进行测试
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [Aurrancy,number]=single_perceptron(tr,te)
%% 初始化
trl=tr(:,end); % 训练数据的标签
trc=tr(:,1:end-1); % 训练数据的标签
w=rand(1,size(tr,2)); % 为权值和偏执进行初始赋值
u=0.5; % 学习率
maxx=10000; % 最大的迭代次数
%% 迭代建模
for j=1:maxx % 迭代的次数
err=0;
for i=1:size(tr,1) % 对每一个样本
y=[trc(i,:),-1]*w'; % 计算w1x1+w2x2+……-b
y=sign(y); % 激活函数:阶跃函数
w=w+(trl(i)-y).*trc(i).*u; % 调整权重
err=err+abs(trl(i)-y); %统计误差
end
if err==0
break
end
end
number=j;
%% 画出边界
figure
hold on
grid on
x1=min(trc(:,1))-1:max(trc(:,1))+1; %设置横坐标
x2=(w(3)-w(1)*x1)/w(2); %分类曲线方程W1x1+W2x2-T=0
plot(x1,x2,'b--');
x=trc(tr(:,end)==0,1);
y=trc(tr(:,end)==0,2);
plot(x,y,'r*');
x=trc(tr(:,end)==1,1);
y=trc(tr(:,end)==1,2);
plot(x,y,'g*');
xlabel('x1')
ylabel('x2')
title('样本分布及分界线')
%% 预测
label=zeros(size(te,1),1);
for i=1:size(te,1)
y=[te(i,1:end-1),-1]*w';
y=sign(y);
label(i)=y;
end
Aurrancy=size(find(label==te(:,end)),1)./size(te,1);
x=te(:,1);
y=te(:,2);
plot(x,y,'k*');
end