1、题目及实现思路
??题目:假设我们有 4 个 2 维的数据,数据的特征分别是(3,3),(4,3),(1,1),(2,1)。 ??(3,3),(4,3) 这两个数据的标签为 1, ??(1,1),(2,1)这两个数据的标签为-1。 ??构建神经网络来进行分类。
??思路:我们要分类的数据是 2 维数据,所以只需要 2 个输入节点(一般输入数据有几个特征,我们就设置几个输入神经元),我们可以把神经元的偏置值也设置成一个输入节点。这样我们需要 3 个输入节点。
??输入数据有 4 个(1,3,3),(1,4,3),(1,1,1),(1,2,1)
??数据对应的标签为(1,1,-1,-1)
??初始化权值 w1,w2,w3 取 0 到 1 的随机数
?? 学习率 lr(learning rate)设置为 0.1
??激活函数为 sign 函数
??我们可以构建一个单层感知器如图所示。
2、代码实战
import numpy as np
import matplotlib.pyplot as plt
X = np.array([[1,3,3],
[1,4,3],
[1,1,1],
[1,2,1]])
T = np.array([[1],
[1],
[-1],
[-1]])
W = np.random.random([3,1])
lr = 0.1
Y = 0
def train():
global W
Y = np.sign(np.dot(X,W))
E = T - Y
delta_W = lr * (X.T.dot(E)) / X.shape[0]
W = W + delta_W
for i in range(100):
train()
print('epoch:',i + 1)
print('weights:',W)
Y = np.sign(np.dot(X,W))
if(Y == T).all():
print('Finished')
break
x1 = [3,4]
y1 = [3,3]
x2 = [1,2]
y2 = [1,1]
k = - W[1] / W[2]
d = -W[0] / W[2]
xdata = (0,5)
plt.plot(xdata,xdata * k + d,'r')
plt.scatter(x1,y1,c='b')
plt.scatter(x2,y2,c='y')
plt.show()
结果:
??因为权值的初始化使用的是随机的初始化方式,所以每一次训练的周期以及画出来的图 可能都是不一样的。这里我们可以看到单层感知器的一个问题,虽然单层感知器可以顺利地 完成分类任务,但是使用单层感知器来做分类的时候,最后得到的分类边界距离某一个类别 比较近,而距离另一个类别比较远,并不是一个特别理想的分类效果。
|