神经网络单层感知器的实现(python)

问题:

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

思路:

二维数据,需要两个数据点,将神经元偏置设置成另一个输入点,一共需要三个输入点
输入数据:(1,3,3),(1,4,3),(1,1,1)
数据对应标签为(1,1,-1)
初始化权值为w0,w1,w2 为 -1 到 1 的随机数
学习率为0.11
激活函数:sign

最终我们确定下来的是w0,w1,w2
那么分界线的表达式为: w0+w1*x1+w2*x2=0
因为x2为y轴上的值,那么最终的表达式为:
y=(-w1/w2)*x - -w0/w2

python实现:

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行3列,取值范围-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))/X.shape[0]
    W = W+W_C

for _ in range(100):
    update()#更新权值
    print(W)#打印当前权值
    print(n)#打印迭代次数
    O = np.sign(np.dot(X,W.T))#计算当前输出
    if(O == Y.T).all():#如果实际输出等于期望输出,模型收敛循环结束
        print('Finished!')
        print('epoch',n)
        break
#正样本
x1 = [3,4]
y1 = [3,3]
#负样本
x2 = [1]
y2 = [1]
    
#计算分界线的斜率和截距
k = -W[1]/W[2]
d = -W[0]/W[2]
print('k=',k)
print('d=',d)
    
xdata = np.linspace(0,5)#生成一个50个数的等差序列,数的范围为(0,5)
print('xdata',xdata)
    
plt.figure()
plt.plot(xdata,xdata*k+d,'r')#plot()函数画出一系列的点,并且用线将它们连接起来
plt.plot(x1,y1,'bo')
plt.plot(x2,y2,'yo')
plt.show()

运行结果:

[ 0.78718521  0.68633867 -0.63251315]
1
[ 0.71385187  0.61300534 -0.70584648]
2
[ 0.64051854  0.539672   -0.77917981]
3
[ 0.64051854  0.68633867 -0.63251315]
4
[ 0.56718521  0.61300534 -0.70584648]
5
[ 0.49385187  0.539672   -0.77917981]
6
[ 0.49385187  0.68633867 -0.63251315]
7
[ 0.42051854  0.61300534 -0.70584648]
8
[ 0.34718521  0.539672   -0.77917981]
9
[ 0.34718521  0.68633867 -0.63251315]
10
[ 0.27385187  0.61300534 -0.70584648]
11
[ 0.27385187  0.759672   -0.55917981]
12
[ 0.20051854  0.68633867 -0.63251315]
13
[ 0.12718521  0.61300534 -0.70584648]
14
[ 0.12718521  0.759672   -0.55917981]
15
[ 0.05385187  0.68633867 -0.63251315]
16
[-0.01948146  0.61300534 -0.70584648]
17
[ 0.05385187  0.83300534 -0.48584648]
18
[-0.01948146  0.759672   -0.55917981]
19
[-0.09281479  0.68633867 -0.63251315]
20
Finished!
epoch 20
k= 1.085097874678484
d= -0.14673970555496188
xdata [0.         0.10204082 0.20408163 0.30612245 0.40816327 0.51020408
 0.6122449  0.71428571 0.81632653 0.91836735 1.02040816 1.12244898
 1.2244898  1.32653061 1.42857143 1.53061224 1.63265306 1.73469388
 1.83673469 1.93877551 2.04081633 2.14285714 2.24489796 2.34693878
 2.44897959 2.55102041 2.65306122 2.75510204 2.85714286 2.95918367
 3.06122449 3.16326531 3.26530612 3.36734694 3.46938776 3.57142857
 3.67346939 3.7755102  3.87755102 3.97959184 4.08163265 4.18367347
 4.28571429 4.3877551  4.48979592 4.59183673 4.69387755 4.79591837
 4.89795918 5.        ]

神经网络单层感知器的实现(python)_第1张图片

 

 

 

 

 

 

 
 
 

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