返回

实现单层感知器

发布时间:2023-09-12 15:10:32 229

单层感知器

  • 输入节点: x1、x2,x3
  • 输出节点: Y
  • 权向量:w1,w2,w3
  • 偏置因子:b
  • 激活函数:f =sign(x),即x>0时f=1,x<0时f=-1,x=0时f=0;

一个例子:【注释、解释在代码中】

假如设定b=0.7,x1、x2、x3的输入初始权重为0.5,0.6,0.4,且输入数据与标签如下:

testArray = np.array([[0,0,0,-1],
[0,0,1,-1],
[0,1,1,1],
[1,1,0,1]])
import pandas as pd
testD = pd.DataFrame(testArray,index=None,columns=['x1','x2','x3','Y'])
testD

实现单层感知器_数据

  • 在输入被输入到神经网络之前,会被初始权重处理,然后经过激活函数处理之后输出Y。
  • 则输出Y计算为:当(x1* 0.5+x2* 0.6+x3* 0.4-0.6)>0时,Y=1;当(x1* 0.5+x2* 0.6+x3* 0.4-0.6)<0时,Y=-1;当(x1* 0.5+x2* 0.6+x3* 0.4-0.6)=0时,Y=0。
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
# 输入数据 x1、x2、x3
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)
#学习率设置
learn_rate=0.11
# 计算的迭代次数
n=0
# 神经网络输出
output_y = 0
def update():
global X,Y,W,learn_rate,n
n+=1
output_y = np.sign(np.dot(X,W.T))
W_change = learn_rate*(Y-output_y.T).dot(X)/int(X.shape[0])
W = W_change+W #改变参数W,相当于权重

for _ in range(100):
update()#更新权值
print(W) #打印当前权值
print(n) #打印迭代次数
output_y = np.sign(np.dot(X,W.T)) #计算当前输出
if(output_y == Y.T).all(): #如果实际输出等于期望输出,模型收敛,循环结束。
print("完成!")
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)
plt.figure()
plt.plot(xdata,xdata*k+d,'r')
plt.plot(x1,y1,'bo')
plt.plot(x2,y2,'yo')
plt.show()

最终,迭代12次之后收敛趋于稳定。

实现单层感知器_权重_02

 

观察图形可知有效的区分开了数据:

实现单层感知器_权重_03

 

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线
下一篇
卷积与池化基础【MOOC课手记】 2023-09-12 12:07:49