单层感知机_线性神经网络_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神 ...
随机推荐
- 《提高c++性能的编程技术》读书笔记
一个程序的执行效率是取决于改程序翻译成汇编语言之后的执行的机器指令的条数.而每一个机器指令的执行的周期是一定的.C语言和C++都是高于汇编语言的高级语言,其中,C语言源代码与其相应的机器指不是完全同一 ...
- backface-visibility:hidden
backface-visibility:hidden 不面向屏幕时隐藏
- Laravel Route Resource 方法
新增的 resource 方法将遵从 RESTful 架构为用户资源生成路由.该方法接收两个参数,第一个参数为资源名称,第二个参数为控制器名称. Route::resource('users', 'U ...
- mysqld_safe A mysqld process already exists
最近修改mysql密码遇到mysqld_safe A mysqld process already exists问题: 解决步骤: 1:ps aux |grep mysql 查看mysql的进程. ...
- Stack&Heap的理解
Heap(堆):在英文中有杂乱的堆意思,意译中文为堆:其特点为先进先出. 堆空间分配:一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表. Stack(栈):在英 ...
- WPF 模仿 UltraEdit 文件查看器系列 开篇和导读
WPF 模仿 UltraEdit 文件查看器系列 开篇和导读 运行环境:Win10 x64, NetFrameWork 4.8, 作者:乌龙哈里,日期:2019-05-10 学 .Net FrameW ...
- Go 位运算符
Go 位运算符 package main import "fmt" func main() { var a uint = 60 /* 60 = 0011 1100 */ var b ...
- bzoj1042题解
[题意分析] 有q个询问,每次询问求一个只有四个物品的背包方案数. [解题思路] 先计算出所有面值硬币的无限背包方案数. 考虑容斥,每个限制表示选取大于di个面值ci的硬币,总方案数=0限制方案数-1 ...
- 依赖背包优化——hdu1561
傻逼依赖背包的优化 #include<bits/stdc++.h> using namespace std; #define N 205 ]; int head[N],tot,n,m,a[ ...
- NX二次开发-UFUN获取图层类别的信息UF_LAYER_ask_category_info
1 NX11+VS2013 2 3 #include <uf.h> 4 #include <uf_ui.h> 5 #include <uf_layer.h> 6 7 ...