单层感知机_线性神经网络_BP神经网络
单层感知机


最终y=t,说明经过训练预测值和真实值一致。下面图是sign函数





根据感知机规则实现的上述题目的代码
import numpy as np
import matplotlib.pyplot as plt
#输入数据
X = np.array([[,,],
[,,],
[,,],
[,,]])
#标签
Y = np.array([[],
[],
[-],
[-]])
#权值初始化,3行1列,取值范围-1到1
W = (np.random.random([,])-0.5)*
print(W)
#学习率设置
lr = 0.11
#神经网络输出
O = def update():
global X,Y,W,lr
O = np.sign(np.dot(X,W))
W_C = lr*(X.T.dot(Y-O))/int(X.shape[])#除于样本个数目的是分子计算的误差是所有样本误差之和,所以要进行平均
W = W + W_C
for i in range():
update()#更新权值
print(W)
print(i)
O = np.sign(np.dot(X,W))
if(O == Y).all():
print('finished')
print('epoch:',i)
break
#正样本
x1 = [,]
y1 = [,]
#负样本
x2 = [,]
y2 = [,] #计算分界线的斜率以及截距
k = -W[]/W[]
d = -W[]/W[]
print('k=',k)
print('d=',d) xdata = (,) plt.figure()
plt.plot(xdata,xdata*k+d,'r')
plt.scatter(x1,y1,c='b')
plt.scatter(x2,y2,c='y')
plt.show()
单层感知机解决异或问题
'''
异或
^ =
^ =
^ =
^ =
'''
import numpy as np
import matplotlib.pyplot as plt
#输入数据
X = np.array([[,,],
[,,],
[,,],
[,,]])
#标签
Y = np.array([[-],
[],
[],
[-]]) #权值初始化,3行1列,取值范围-1到1
W = (np.random.random([,])-0.5)* print(W)
#学习率设置
lr = 0.11
#神经网络输出
O = def update():
global X,Y,W,lr
O = np.sign(np.dot(X,W)) # shape:(,)
W_C = lr*(X.T.dot(Y-O))/int(X.shape[])
W = W + W_C
for i in range():
update()#更新权值
print(W)#打印当前权值
print(i)#打印迭代次数
O = np.sign(np.dot(X,W))#计算当前输出
if(O == Y).all(): #如果实际输出等于期望输出,模型收敛,循环结束
print('Finished')
print('epoch:',i)
break #正样本
x1 = [,]
y1 = [,]
#负样本
x2 = [,]
y2 = [,] #计算分界线的斜率以及截距
k = -W[]/W[]
d = -W[]/W[]
print('k=',k)
print('d=',d) xdata = (-,) plt.figure()
plt.plot(xdata,xdata*k+d,'r')
plt.scatter(x1,y1,c='b')
plt.scatter(x2,y2,c='y')
plt.show()

运行结果如上,可以知道单层感知机不适合解决如上类似的异或问题
线性神经网络

同时相比于感知机引入了Delta学习规则


解决感知机无法处理异或问题的方法

对于第二个方法

说明:X0是偏置值,值为1,X1,X2为线性输入,其它为添加的非线性输入,使用purelin激活函数(y=x)进行模型训练,再下面是y值的求法,用于图形绘制。
#题目:异或运算
#^=
#^=
#^=
#^=
import numpy as np
import matplotlib.pyplot as plt
#输入数据--这里偏置定为1
X = np.array([[,,,,,],
[,,,,,],
[,,,,,],
[,,,,,]])
#标签--期望输出
Y = np.array([-,,,-])
#权值初始化,1行6列,取-1到1的随机数
W = (np.random.random()-0.5)*
print(W)
#学习率
lr = 0.11
#计算迭代次数
n =
#神经网络输出
o = def update():
global X,Y,W,lr,n
n+=
o = np.dot(X,W.T)
W_C = lr*((Y-o.T).dot(X))/(X.shape[])#权值改变数,这里除掉行数求平均值,因为行数多,权值改变就会很大。
W = W + W_C
for i in range():
update()#更新权值 o = np.dot(X,W.T)
print("执行一千次后的输出结果:",o)#看下执行一千次之后的输出 #用图形表示出来
#正样本
x1 = [,]
y1 = [,]
#负样本
x2 = [,]
y2 = [,] def calculate(x,root):
a = W[]
b = W[]+x*W[]
c = W[]+x*W[]+x*x*W[]
if root == :#第一个根
return (-b+np.sqrt(b*b-*a*c))/(*a)
if root == :#第二个根
return (-b-np.sqrt(b*b-*a*c))/(*a) xdata = np.linspace(-,) plt.figure()
plt.plot(xdata,calculate(xdata,),'r')#用红色
plt.plot(xdata,calculate(xdata,),'r')#用红色
plt.plot(x1,y1,'bo')#用蓝色
plt.plot(x2,y2,'yo')#用黄色
plt.show()

import numpy as np
import matplotlib.pyplot as plt
#输入数据
X = np.array([[,,],
[,,],
[,,],
[,,]])
#标签
Y = np.array([[],
[],
[-],
[-]]) #权值初始化,3行1列,取值范围-1到1
W = (np.random.random([,])-0.5)* print(W)
#学习率设置
lr = 0.11
#神经网络输出
O = def update():
global X,Y,W,lr
O = np.dot(X,W)
W_C = lr*(X.T.dot(Y-O))/int(X.shape[])
W = W + W_C
for i in range():
update()#更新权值 #正样本
x1 = [,]
y1 = [,]
#负样本
x2 = [,]
y2 = [,] #计算分界线的斜率以及截距
k = -W[]/W[]
d = -W[]/W[]
print('k=',k)
print('d=',d) xdata = (,)
if i % == :
plt.figure()
plt.plot(xdata,xdata*k+d,'r')
plt.scatter(x1,y1,c='b')
plt.scatter(x2,y2,c='y')
plt.show()
BP神经网络

Sigmoid:sigmoid的优点是输出范围有限,数据在传递的过程中不容易发散,求导很容易(y=sigmoid(x), y’=y(1-y))。缺点是饱和的时候梯度太小。其输出范围为(0, 1),所以可以用作输出层,输出表示概率。

公式:
要注意的是对多层神经元先对最后一层权重更新,其结果再更新前一层的权重


bp神经网络解决异或问题的程序如下
import numpy as np # 输入数据
X = np.array([[, , ],
[, , ],
[, , ],
[, , ]])
# 标签
Y = np.array([[, , , ]])
# 权值初始化,取值范围-1到1
V = np.random.random((, )) * -
W = np.random.random((, )) * -
print(V)
print(W)
# 学习率设置
lr = 0.11
def sigmoid(x):
return / ( + np.exp(-x))
def dsigmoid(x):
return x * ( - x)#激活函数的导数
def update():
global X, Y, W, V, lr L1 = sigmoid(np.dot(X, V)) # 隐藏层输出(,)
L2 = sigmoid(np.dot(L1, W)) # 输出层输出(,) L2_delta = (Y.T - L2) * dsigmoid(L2)
L1_delta = L2_delta.dot(W.T) * dsigmoid(L1) W_C = lr * L1.T.dot(L2_delta)
V_C = lr * X.T.dot(L1_delta) W = W + W_C
V = V + V_C for i in range():
update() # 更新权值
if i % == :
L1 = sigmoid(np.dot(X, V)) # 隐藏层输出(,)
L2 = sigmoid(np.dot(L1, W)) # 输出层输出(,)
print('Error:', np.mean(np.abs(Y.T - L2))) L1 = sigmoid(np.dot(X, V)) # 隐藏层输出(,)
L2 = sigmoid(np.dot(L1, W)) # 输出层输出(,)
print(L2) def judge(x):
if x >= 0.5:
return
else:
return for i in map(judge, L2):
print(i)
单层感知机_线性神经网络_BP神经网络的更多相关文章
- 神经网络_线性神经网络 2 (Nerual Network_Linear Nerual Network 2)
1 LMS 学习规则 1.1 LMS学习规则定义 MSE=(1/Q)*Σe2k=(1/Q)*Σ(tk-ak)2,k=1,2,...,Q 式中:Q是训练样本:t(k)是神经元的期望输出:a(k)是神经元 ...
- TensorFlow从0到1之TensorFlow实现单层感知机(20)
简单感知机是一个单层神经网络.它使用阈值激活函数,正如 Marvin Minsky 在论文中所证明的,它只能解决线性可分的问题.虽然这限制了单层感知机只能应用于线性可分问题,但它具有学习能力已经很好了 ...
- TensorFlow单层感知机实现
TensorFlow单层感知机实现 简单感知机是一个单层神经网络.它使用阈值激活函数,正如 Marvin Minsky 在论文中所证明的,只能解决线性可分的问题.虽然限制了单层感知机只能应用于线性可分 ...
- BZOJ_2460_[BeiJing2011]元素_线性基
BZOJ_2460_[BeiJing2011]元素_线性基 Description 相传,在远古时期,位于西方大陆的 Magic Land 上,人们已经掌握了用魔 法矿石炼制法杖的技术.那时人们就认识 ...
- BZOJ_4004_[JLOI2015]装备购买_线性基
BZOJ_4004_[JLOI2015]装备购买_线性基 Description 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装备有 m 个属性,用向量zi(aj ,.....,am) ...
- LOJ114_k 大异或和_线性基
LOJ114_k 大异或和_线性基 先一个一个插入到线性基中,然后高斯消元. 求第K小就是对K的每一位是1的都用对应的线性基的一行异或起来即可. 但是线性基不包含0的情况,因此不能确定能否组成0,需要 ...
- BZOJ_2844_albus就是要第一个出场_线性基
BZOJ_2844_albus就是要第一个出场_线性基 Description 已知一个长度为n的正整数序列A(下标从1开始), 令 S = { x | 1 <= x <= n }, S ...
- BZOJ_3105_[cqoi2013]新Nim游戏_线性基+博弈论
BZOJ_3105_[cqoi2013]新Nim游戏_线性基+博弈论 Description 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作 ...
- 秒懂神经网络---BP神经网络具体应用不能说的秘密.
秒懂神经网络---BP神经网络具体应用不能说的秘密 一.总结 一句话总结: 还是要上课和自己找书找博客学习相结合,这样学习效果才好,不能单视频,也不能单书 BP神经网络就是反向传播神经网络 1.BP神 ...
随机推荐
- EE5111_A0206839W
EE5111 Selected Topics in Industrial Control & Instrumentation Assessment: Implement a simple ...
- 关于mysql的权限的问题
昨天因为同学的mysql数据库不知道做了什么操作,从而导致root用户无法使用了 具体是使用root用户不需要密码 进去只能看 看到 infomation_schema 表 ,感觉root权限丢失了 ...
- 按钮与js事件先后顺序
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- Foxmail公司邮箱配置
1.打开Foxmail点击新建输入账户密码,点击创建: 2.勾选IMAP服务器的ssl,修改SMTP服务器端口为587 点击应用,账号创建完成.可以拉取和发送邮件了:
- MySQL日期格式化 利用Mysql的DATE_FORMAT()进行日期格式转换
碰到一个MYSQL的问题,表logstatb中moment字段的内容是"年-月-日 时:分:秒",需要查询匹配“年月日”或“时:分:秒”即可的数据条目,这个时候就可以通过下面的SQ ...
- ACM-ICPC 训练平台 & 比赛 分析
the file can download in https://pan.baidu.com/s/1HwoLFHGAG-boQbIn9xIhxA occ5 the article is also pu ...
- 云栖干货回顾 | 云原生数据库POLARDB专场“硬核”解析
POLARDB是阿里巴巴自主研发的云原生关系型数据库,目前兼容三种数据库引擎:MySQL.PostgreSQL.Oracle.POLARDB的计算能力最高可扩展至1000核以上,存储容量可达100TB ...
- thinkphp 上传安全
网站的上传功能也是一个非常容易被攻击的入口,所以对上传功能的安全检查是尤其必要的. 大理石平台支架 系统提供的上传类Think\Upload提供了安全方面的支持,包括对文件后缀.文件类型.文件大小以及 ...
- Unity shader之金属质感衣服
一套QQ飞车的衣服,模仿其效果写的shader,效果如下: 部分shader如下: Shader "qq/Cloth" { Properties { _MainTex (" ...
- 【集合框架】JDK1.8源码分析之HashMap
一.前言 在分析jdk1.8后的HashMap源码时,发现网上好多分析都是基于之前的jdk,而Java8的HashMap对之前做了较大的优化,其中最重要的一个优化就是桶中的元素不再唯一按照链表组合,也 ...