单层感知机

单层感知机基础总结很详细的博客

关于单层感知机的视频

最终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神经网络

视频链接

反向传播(Back Propagation,简称BP)神经网络解决了多层神经网络的学习问题,广泛应用于分类识别、图像识别、压缩、逼近以及回归等领域,其结构如下所示。

另外介绍及格激活函数:sigmoid、tanh和softsign。神经网络中的激活函数,其作用就是引入非线性。
Sigmoid:sigmoid的优点是输出范围有限,数据在传递的过程中不容易发散,求导很容易(y=sigmoid(x), y’=y(1-y))。缺点是饱和的时候梯度太小。其输出范围为(0, 1),所以可以用作输出层,输出表示概率。
 
公式:
tanh和softsign:

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

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神经网络的更多相关文章

  1. 神经网络_线性神经网络 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)是神经元 ...

  2. TensorFlow从0到1之TensorFlow实现单层感知机(20)

    简单感知机是一个单层神经网络.它使用阈值激活函数,正如 Marvin Minsky 在论文中所证明的,它只能解决线性可分的问题.虽然这限制了单层感知机只能应用于线性可分问题,但它具有学习能力已经很好了 ...

  3. TensorFlow单层感知机实现

    TensorFlow单层感知机实现 简单感知机是一个单层神经网络.它使用阈值激活函数,正如 Marvin Minsky 在论文中所证明的,只能解决线性可分的问题.虽然限制了单层感知机只能应用于线性可分 ...

  4. BZOJ_2460_[BeiJing2011]元素_线性基

    BZOJ_2460_[BeiJing2011]元素_线性基 Description 相传,在远古时期,位于西方大陆的 Magic Land 上,人们已经掌握了用魔 法矿石炼制法杖的技术.那时人们就认识 ...

  5. BZOJ_4004_[JLOI2015]装备购买_线性基

    BZOJ_4004_[JLOI2015]装备购买_线性基 Description 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装备有 m 个属性,用向量zi(aj ,.....,am) ...

  6. LOJ114_k 大异或和_线性基

    LOJ114_k 大异或和_线性基 先一个一个插入到线性基中,然后高斯消元. 求第K小就是对K的每一位是1的都用对应的线性基的一行异或起来即可. 但是线性基不包含0的情况,因此不能确定能否组成0,需要 ...

  7. BZOJ_2844_albus就是要第一个出场_线性基

    BZOJ_2844_albus就是要第一个出场_线性基 Description 已知一个长度为n的正整数序列A(下标从1开始), 令 S = { x | 1 <= x <= n }, S ...

  8. BZOJ_3105_[cqoi2013]新Nim游戏_线性基+博弈论

    BZOJ_3105_[cqoi2013]新Nim游戏_线性基+博弈论 Description 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作 ...

  9. 秒懂神经网络---BP神经网络具体应用不能说的秘密.

    秒懂神经网络---BP神经网络具体应用不能说的秘密 一.总结 一句话总结: 还是要上课和自己找书找博客学习相结合,这样学习效果才好,不能单视频,也不能单书 BP神经网络就是反向传播神经网络 1.BP神 ...

随机推荐

  1. uptime - 告知系统运行了多久时间

    SYNOPSIS(总览) uptime uptime [-V] DESCRIPTION(描述) uptime 给出下列信息的一行显示. 当前时间, 系统运行了多久时间, 当前登陆的用户有多少, 以及前 ...

  2. js求三个数的最大值运算

    js代码: <script> // var num1 = 32, // num2 = 43, // num3 = 98; // if (num1 > num2) { // if (n ...

  3. js正则判断实现18位数字

    js实现18位数字 var stuCardReg = /^[0-9]{18}/; var stuCard = $('.inp).val();//获取input框中的数值 if (!stuCardReg ...

  4. quartz的使用(一)

    1.quartz是什么? Quartz 是一个完全由 Java 编写的开源作业调度框架,支持各种灵活的应用方式,并同时支持分布式和集群能力.2.quartz的基本要素 2.quartz的基本要素 Sc ...

  5. Q:elementUI中tree组件动态展开

    1,在组件中设置展开收缩开关  default-expand-all="isExpand" 2,展开收起触发按钮 <div class="tree-foot cle ...

  6. NX二次开发-UFUN修剪体UF_MODL_trim_body

    1 NX11+VS2013 2 3 4 #include <uf.h> 5 #include <uf_modl.h> 6 7 8 UF_initialize(); 9 10 / ...

  7. javascript html jquery 入门

    就开发难易程度来说,现在普遍使用jquery,本人学习jquery html css时间不长,以前写过Flex. CSS+JS+HTML组成HTML开发三驾马车.学习js开发我认为怎么入门十分重要.根 ...

  8. ionic-CSS:ionic 头部与底部

    ylbtech-ionic-CSS:ionic 头部与底部 1.返回顶部 1. ionic 头部与底部 Header(头部) Header是固定在屏幕顶部的组件,可以包如标题和左右的功能按钮. ion ...

  9. Devstack — screen 调试工具的使用

    目录 目录 为什么要使用 screen 工具 启动 screen screen 的切换常用 退出和重新连接 screen Restart Openstack Services screen 指令选项总 ...

  10. JVM内核-原理、诊断与优化学习笔记(三):常用JVM配置参数

    文章目录 Trace跟踪参数 -verbose:gc (打开gc的跟踪情况) -XX:+printGC(打开gc的log开关,如果在运行的过程中出现了gc,就会打印出相关的信息.) -XX:+Prin ...