单层感知器2

题目

假设平面坐标系上有几个点(3,3), (4,3)这三个点的标签为1,
(0,1),(1,1)这两个点的标签为-1,构建神经网络来分类

思路:

  • 构造神经元-单层感知器,有三个输入节点 (1,3,3),(1,4,3), (1,1,1)

  • 对应的数据标签为(1,1,-1)

  • 初始化权重值w0, w1,w2为-1到1之间的随机数

  • 学习率设置为0.11

  • 激活函数为Sign函数
    单层感知器的思路是模拟大脑中单个神经元的工作方式:激活与否。感知器接收多个输入信号,如果输入信号的和超过某个阈值则输出一个信号,否则就什么也不输出。

  • 输入节点:x1, x2, x3

  • 输出节点:y

  • 权向量: w1, w2, w3

  • 偏置因子:b

代码

import numpy as np
import matplotlib.pyplot as plt

X=np.array([[1,3,3],
           [1,4,3],
           [1,1,1]])

Y=np.array([1,1,-1])
### 产生三个随机权值,范围在 -1 ~ 1
W=(np.random.random(3)-0.5)*2
print(W)
lr=0.11  #学习率
n=0   #迭代次数
O=0  #预测输出

###更新权值
def update():
  global X, Y, W, lr, n
  n+=1
  O=np.sign(np.dot(X, W.T))
  W_C=lr*((Y-O.T).dot(X))/int(X.shape[0])
  W=W+ W_C

for _ in range(100):
  update()
  print(W)
  print(n)
  if(O==Y.T).all():
    print('Finished')
    print('epoch:',n)
    break

#diagram to show
#the category as 1, [3,3], [3,4]
x1=[3,4]
y1=[3,3]

#the category as -1 [1,1]
x2=[1]
y2=[1]
#斜率和截距
k=-W[1]/W[2]
d=-W[0]/W[2]

xdata=np.linspace(0,5)
plt.figure()
plt.plot(xdata, xdata*k+d, 'r')
plt.plot(x1,y1,'bo')
plt.plot(x2,y2,'yo')
plt.show

公式

  1. O=np.sign(np.dot(X, W.T))


    image.png
  2. 学习率乘输入


    image.png
  1. 斜率和截距


    image.png
image.png
image.png
  1. 结果:很好地区分开了这两类数据


    单层感知器2_第1张图片
    image.png

你可能感兴趣的:(单层感知器2)