单层感知机

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

关于单层感知机的视频

最终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. webstorm/vs取消eslint

    vs ——preference ——setting,添加"eslint.enable": false webstorm ——setting ——language ——javascr ...

  2. 2018-8-10-C#-配置文件存储-各种序列化算法性能比较

    title author date CreateTime categories C# 配置文件存储 各种序列化算法性能比较 lindexi 2018-08-10 19:16:52 +0800 2018 ...

  3. session复制

    环境描述:(三台服务器 系统:7.6)192.168.200.111 nginx192.168.200.112 tomcat192.168.200.113 tomcat环境配置:192.168.200 ...

  4. IDA静态编译之sub

    int __thiscall sub_10009800(const wchar_t *this, int a2, int a3, HKEY hKey){ } 说明:__thiscall  dll内子函 ...

  5. thinkphp 替换入口

    3.2版本支持根据当前的运行环境生成Lite文件,可以替换框架的入口文件或者应用入口文件,提高运行效率. 我们的建议是在生产环境中关闭调试模式后生成Lite文件.注意,目前SAE平台不支持直接生成Li ...

  6. thinkphp 模板驱动

    模板引擎驱动完成了第三方模板引擎的支持,通过定义模板引擎驱动,我们可以支持Smarty.TemplateLite.SmartTemplate和EaseTemplate等第三方模板引擎. 默认的模板引擎 ...

  7. electron-vue中关闭烦人的es语法检查

    本项目环境是 electron-vue搭建的项目,项目结构根vue-cli创建的项目结构稍微有所不同 主要修改的地方有3个 把这3个文件里面的以下代码全部删掉 { test: /\.(js)$/, e ...

  8. js设置当前窗口为最上层窗口

    实际使用iframe框架时会遇到当前窗口页面不能位于最上层窗口的情况,或者是防止自己的网站被别人放在他们的iframe中,这时就需要设置: <script language="java ...

  9. spark在collect收集数据的时候出现outOfMemoryError:java heap space

    spark的collect是action算子,所有最后会以数组的形式返回给driver端,当数据太大的时候就会出现堆内存溢出.OutofMemoryError:java heap space. 在sp ...

  10. linux 重定向命令

    标准输入,输出和错误 --------------------------------- 文件文件                描写叙述符 ----------------------------- ...