单层感知机_线性神经网络_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神 ...
随机推荐
- whatis - 在 whatis 数据库里查找完整的单词
总览 (SYNOPSIS) whatis keyword ... 描述 (DESCRIPTION) whatis 命令在一些特定的包含系统命令的简短描述的数据库文件里查找关键字, 然后把结果送到标准输 ...
- yum处理损坏的包依赖关系
有时在安装多个软件包时,某个包的软件依赖关系可能会被另外一个包的安装覆盖掉.这叫做损坏的包依赖关系(broken dependency). 如果系统出现问题,可以先尝试: yum clean all ...
- 随笔记录 重置root密码 2019.8.7
方法1:进入单用户模式 1.开机进入以下界面选择要启动的系统按e 2.找到星号行在后面添加上init=/bin/sh 3.按住Ctrl+x执行 4.进入单用户模式 5.如果passwd命令失败,可以直 ...
- vue中使用axios与axios的请求响应拦截
VUE中使用Axios axios的安装 npm install axios vue-axios axios在vue的配置与使用 在main.js中引入axios和vue-axios import a ...
- mui请求数据接口问题
今天我在本地模拟做一个数据请求,第一次用的mui自带的方法来请求数据,当时我的本地接口地址是http://localhost:8087/jeecg/sightseerController.do?che ...
- thinkphp 防止XSS(跨站脚本攻击)
XSS(跨站脚本攻击)可以用于窃取其他用户的Cookie信息,要避免此类问题,可以采用如下解决方案: 直接过滤所有的JavaScript脚本: 转义Html元字符,使用htmlentities.htm ...
- NSDateFormatter 今年日期格式化成字符串是明年日期问题?
在项目里我要是把NSDate格式化成字符串 我的format是@"YYYY年MM月dd日 HH:mm" 传入日期2013-12-30 15:00:00后,返回给我的字符串是 201 ...
- CF1265B Beautiful Numbers
题意 给一个长度为\(n\)的排列\(P\),求对于\(1\) 到 \(n\)中的每个数\(m\),是否能找到一段长度为\(m\)的区间使得区间内的数是一个\(1\)到\(m\)的排列. 输出一个\( ...
- hdu多校第五场1004 (hdu6627) equation 1 计算几何
题意: 给你一个C,再给你n组a,b,让你求x取什么值的时候,$ \sum_{i=1}^n |a_i*x+b_i| =C $,要求求出解的个数,并用最简分数从小到大表示,如果有无穷多解,输出-1. 题 ...
- PMP项目管理——项目范围管理-规划范围管理
规划范围管理是为记录如何定义.确认和控制项目范围及产品范围,而创建范围管理计划的过程.主要作用是,在整个项目期间对如何管理范围提供指南和方向.制定范围管理计划和细化项目范围始于对下列信息的分析:项目章 ...