入门——感知机训练

根据感知机学习规则,分类直线与权重向量正交。

如果开始的分类直线计算出来的Yj与预期输出Dj之间有误差Ej=Dj-Yj,就应该把连接权重Wj的方向依据学习向量X调整。

正误差时,Wj朝着X调整,因此,Wj(t+1)=Wj(t)+n*Ej*X.

据此,在Python中实现最简单的逻辑与的感知机学习代码:

# -*- coding: utf-8 -*-
import numpy as np
#------------------------------------------------------------
# 激活函数
def ssign(val):
    if (val>0):
      return(1)
    else:
        return(0);
#------------------------------------------------------------

#学习速率
langda = 0.15 #langda是权重的学习速率
beta = 0.15 #beta是偏置的学习速率

#偏置
ar_theta = np.random.randn(1)
theta = ar_theta[0]

#随机初始化权重
W = np.random.randn(1,2)#随机产生2行1列<-1,+1>
print('init W=', W)

print('------ 开始设置 ------')

#XS是学习样本
XS = np.array([[0, 0],
              [0, 1],
              [1, 0],
              [1, 1]])

#Dj是预期输出结果,即监督值
Dj = np.array([0, 0, 0, 1])

#最大允许的误差
maxDelta = 0.0001

Yj = 1 #运算的输出
n = 0
nLearnCount = 0#学习的次数
print('------ 开始学习 ------')
Ej = np.array([1, 1, 1, 1])

Ej[0] = Dj[0]-Yj #计算每次的误差值

#至少要把学习样本学习一次
while ((nLearnCount<4) or\
    (abs(Ej[0])>maxDelta)or(abs(Ej[1])>maxDelta) or\
    (abs(Ej[2])>maxDelta)or(abs(Ej[3])>maxDelta)) :
    print('n=', n)
    Sj= np.dot(W, XS[n]) + theta#Sj是一个数
    print('Sj=', Sj)
    Yj = ssign(Sj)
    print('Yj=', Yj)
    Ej[n] = Dj[n] - Yj #求误差
    print('误差:Ej=', Ej[n])
    print('XS[', n, ']=', XS[n])
    delta_W = langda*Ej[n]*XS[n]
    theta = theta + beta*Ej[n]
    print('delta_W', delta_W)
    print('theta', theta)
    W = W + delta_W
    print('W=', W)
    n = (n+1)%4

    nLearnCount = nLearnCount +1
    #s =input('Please press any key to continue.')
    #time.sleep(1)

print('the Final W:\n', W)
print('theta:', theta)

T = np.array([[0, 0],
              [0, 1],
              [1, 0],
              [1, 1]])
print('------------Try to Work---------------')
n=0
while (n<4) :
    Sj= np.dot(W, T[n]) + theta
    Yj = ssign(Sj)
    print('Yj=', Yj)
    n = n + 1

你可能感兴趣的:(神经网络)