python3 加密模块的实现

python3 加密模块的实现(hashlib,hmac)

hashlib模块:
Version:Python 3.6.1
hashlib:不可逆加密
hmac:不可逆键值对方式加密

hashlib模块:
hashlib模块为不同的安全哈希/安全散列(Secure Hash Algorithm)和 信息摘要算法(Message Digest Algorithm)实现了一个公共的、通用的接口,也可以说是一个统一的入口。因为hashlib模块不仅仅是整合了md5和sha模块的功能,还提供了对更多中算法的函数实现,如:MD5,SHA1,SHA224,SHA256,SHA384和SHA512。
使用步骤:
1、获取一个哈希算法对应的哈希对象:
(1):通过hashlib.new(哈希算法名称,初始出入信息)来获取这个哈希对象,如:hashlib.new(“MD5”,“username”),hashlib.new(“SHA1”,“username”)等。
(2):通过hashlib.哈希算法名称()来获取这个哈希对象,如:hashlib.md5(),hashlib.sha1()等。
2、设置追加信息:
调用哈希对象的updata(输入的信息)方法,设置追加信息。多次调用后等价于把所有追加的参数全部拼接起来作为一个参数,传递给update(),是累加,不是覆盖。
3、获取输入信息对应的摘要:
调用已经的到哈希对象的digest()或者hexdigest(),可得到传递给update()方法的字符串参数的摘要信息。
(1)digest()与hexdigest()的区别:
a、digest():摘要信息是一个二进制格式的字符串,其中可能包含非ASCII字符,包括NUL字节,该字符串长度可以通过哈希对象的digest_size属性获取。
b、hexdigest():摘要信息是一个16进制格式的字符串,该字符串中只包含16进制的数字,且长度是digest()返回结果长度的2倍。
示例代码1:

def hash_test():
m = hashlib.md5()
m.update(b”username”)
m.update(b”password”) #*终加密的字符串参数是:username + password
print(m.digest_size)
print(m.digest())
print(m.hexdigest())
hash_test()
返回结果:

16
b’\xd5\x1c\x9a~\x93Stj` \xf9`-E))’
d51c9a7e9353746a6020f9602d452929
代码示例2:

def hash_func():
# hashlib.new(name[, data]) 创建hashlib(非首选), name=算法名, data:数据
hash = hashlib.new(‘sha1’, ‘username’.encode())
strs = hash.name # hash名称, 可传给new()使用
hash.update(“password”.encode()) # 字节缓冲区 hash.update(x) hash.update(y) == hash.update(x+y)
hash = hash.copy() # 拷贝hash对象副本
print(strs, hash)

# algorithms_guaranteed返回的是所有平台支持的hash算法的名称,结果是一个集合
dics = hashlib.algorithms_guaranteed
print(dics)

# algorithms_available返回的是在Python解析器中可用的hash算法的名称, 传递给new()时, 可识别,结果也是一个集合
dics1 = hashlib.algorithms_available
print(dics1)

“””
加盐加密方法介绍:
hashlib.pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None)
hash_name:hash名称, password:数据, salt:盐, iterations:循环次数, dklen:密钥长度
“””
hash_bytes = hashlib.pbkdf2_hmac(‘SHA1′, b’password’, b’80’, 100, 64)
print(hash_bytes)

num = hash.digest_size # hash结果的大小
num1 = hash.block_size # hash算法的内部块的大小
print(num, num1)

hash_func()
返回结果:

sha1
<sha1 HASH object @ 0x000002741602E030>
{‘sha256’, ‘blake2s’, ‘sha224’, ‘sha3_512’, ‘shake_128’, ‘md5’, ‘sha384’, ‘blake2b’, ‘sha3_256’, ‘sha512’, ‘sha3_224’, ‘shake_256’, ‘sha1’, ‘sha3_384’}
{‘sha256’, ‘blake2b’, ‘sha3_256’, ‘whirlpool’, ‘SHA’, ‘md5’, ‘sha384’, ‘RIPEMD160’, ‘dsaEncryption’, ‘sha’, ‘sha1’, ‘md4’, ‘SHA1’, ‘MD4’, ‘sha224’, ‘DSA-SHA’, ‘SHA256’, ‘sha512’, ‘sha3_224’, ‘SHA384’, ‘SHA224’, ‘SHA512’, ‘ripemd160’, ‘MD5’, ‘dsaWithSHA’, ‘blake2s’, ‘sha3_512’, ‘shake_128’, ‘DSA’, ‘shake_256’, ‘ecdsa-with-SHA1’, ‘sha3_384′}
b’]\x85C\xff\x1d\xe8\xce\x97\x128\x9bP\xe6\x98\xdf/\x1eQ\x19\xb4\x04v\xf5\xcd\x00\xb8\xff#\xee\xa7\x07\x81)\xb8\xc7Se\x85\xef\xfa\x9d\x0e\x9auA8\x19\t\x0e\xee\xb5`\x9b\x07:2M\xd4\xc0\x0c\xfaz^/’
20
64
hmac模块
hmac算法也是一种一种单项加密算法,并且它是基于上面各种哈希算法/散列算法的,只是它可以在运算过程中使用一个密钥来增增强安全性。hmac模块实现了HAMC算法,提供了相应的函数和方法,且与hashlib提供的api基本一致。
使用步骤:
hmac模块的使用步骤与hashlib模块基本一致,只是在获取hmac对象时,只能使用hmac.new()函数,因为hmac模块没有提供与具体哈希算法对应的函数来获取hmac对象。如:hashlib可以用hashlib.md5()来产生一个哈希对象,但是hmac不行。

代码示例1:

def hmac_demo():
hash = hmac.new(b”pwd”)
hash.update(b”uname”)
h_str = hash.hexdigest()
print(h_str.upper())
boolean = hmac.compare_digest(h_str, hmac.new(“pwd”.encode(), “uname”.encode()).hexdigest())
print(boolean)
hmac_demo()
返回结果:

675440AD536E602C322C90F8E0051975
True
示例代码2:

def hmac_func():
# 创建key和内容,再进行加密
# hmac.new(key, msg=None, digestmod=None)
# 创建新的hmac对象, key:键, msg:update(msg), digestmod:hash名称(同hashlib.new())(默认md5)
hc = hmac.new(“userid”.encode())
hc.update(“username”.encode()) # 字节缓冲区 hc.update(a) hc.update(b) == hc.update(a+b)
hash_bytes = hc.digest() # 字节hash
print(hash_bytes)
hash_str = hc.hexdigest().upper() # 16进制hash字符串
print(hash_str)
hc = hc.copy() # 拷贝hmac副本
print(hc)
num = hc.digest_size # hash大小
print(num)
strs = hc.name # hash名称
print(strs)
# hmac.compare_digest(a, b) // 比较两个hash密钥是否相同, 参数可为: str / bytes-like object, (注:建议使用此方法,不建议使用a==b)
boolean = hmac.compare_digest(hmac.new(“uid”.encode(), “uname”.encode()).digest(), hmac.new(“uid”.encode(), “uname”.encode()).digest())
print(boolean)

hmac_func()
返回结果:

b’\x82jU\xd4I\xa3A?\x1d\x05\x00\xd89\xf9z\xb1′
826A55D449A3413F1D0500D839F97AB1
<hmac.HMAC object at 0x0000014F15668080>
16
hmac-md5
True

云计算,虚拟化技术

OpenStack

是一个由NASA(美国国家航空航天局)和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。

是一个开源的云计算管理平台项目,由几个主要的组件组合起来完成具体工作。

支持几乎所有类型的云环境,项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。

通过各种互补的服务提供了基础设施即服务(IaaS)的解决方案,每个服务提供API以进行集成。

它的社区拥有超过130家企业及1350位开发者,这些机构与个人都将OpenStack作为基础设施即服务(IaaS)资源的通用前端。

项目的首要任务是简化云的部署过程并为其带来良好的可扩展性。

OpenStack 包含两个主要模块:Nova 和 Swift,前者是 NASA 开发的虚拟服务器部署和业务计算模块;后者是 Rackspace开发的分布式云存储模块,两者可以一起用,也可以分开单独用。

除了有 Rackspace 和 NASA 的大力支持外,还有包括 Dell、Citrix、 Cisco、 Canonical等重量级公司的贡献和支持,发展速度非常快,有取代另一个业界*开源云平台 Eucalyptus 的态势。

Eucalyptus

(桉树,Elastic Utility Computing Architecture for Linking Your Programs To Useful Systems ) 通过计算集群或工作站群实现弹性的、实用的云计算。它*初是美国加利福尼亚大学 Santa Barbara 计算机科学学院的一个研究项目,现在已经商业化,发展成为了 Eucalyptus Systems Inc。

不过,Eucalyptus 仍然按开源项目那样维护和开发。

分为open source版和enterprise版

源码是公开的。并且有提供给CentOS 5,Debian squeeze,OpenSUSE 11,Fedora 12的软件包。

Eucalyptus选择Xen和KVM作为虚拟化的管理程序。目前版本是3.2。

Eucalyptus的enterprise版已经对vSphere ESX/ESXi提供了支持。

Hadoop

是一个由Apache基金会所开发的分布式系统基础架构。
用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。
它实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。
Hadoop的框架*核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。

SPARK Spark是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用并行框架,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。这些有用的不同之处使 Spark 在某些工作负载方面表现得更加优越,换句话说,Spark 启用了内存分布数据集,除了能够提供交互式查询外,它还可以优化迭代工作负载。 Spark 是在 Scala 语言中实现的,它将 Scala 用作其应用程序框架。与 Hadoop 不同,Spark 和 Scala 能够紧密集成,其中的 Scala 可以像操作本地集合对象一样轻松地操作分布式数据集。 尽管创建 Spark 是为了支持分布式数据集上的迭代作业,但是实际上它是对 Hadoop 的补充,可以在 Hadoop 文件系统中并行运行。通过名为 Mesos 的第三方集群框架可以支持此行为。Spark 由加州大学伯克利分校 AMP 实验室 (Algorithms, Machines, and People Lab) 开发,可用来构建大型的、低延迟的数据分析应用程序。
————————————————

原文链接:https://blog.csdn.net/permike/article/details/52387552

ios 跳转到支付宝_使用iOS快捷指令执行快捷操作之1——每天早起定时打开蚂蚁森林…

写在前面——iOS快捷指令是新版本iOS所具有的功能,图标是下面这个样子:

%title插图%num

如果你的iOS设备找不到这个功能,可能这个功能被你屏蔽了,或者iOS版本不够,请升级你的iOS系统。

iOS快捷指令,我个人的感觉,有点类似于微软操作系统中早已存在的批处理文件,它可以执行一系列操作,所以这些日子我在琢磨它的使用方法以充分利用这个功能。于是我琢磨出来两个小快捷指令,分享给大家,抛砖引玉吧,大伙一起享受这个app的便捷之处。

我相信很多人都在玩支付宝的蚂蚁森林,我也在玩,而且我知道有很多人为了不让自己的能量被别人抢走,甚至设置了闹钟来提醒自己收能量球,我也是这么做的。尤其是每天早起7点来钟生成的前一天计步生成的能量,由于是支付宝每天定时定点生成的(每个人的时间都不一样,但是都是集中在7-8点,而且对于一个人来讲时间每天都是一样的),就特别适合定一个每天的闹钟来提醒自己收能量,还能顺便搜刮一下好友的能量,非常的值得。我现在每天能通过收取别人能量,每天就能抢到别人的500克以上的能量(被我天天抢能量的朋友们别生气哈 )!比自己辛辛苦苦走路计步容易多了!

那么iOS快捷指令就可以为你响完闹钟以后自动打开支付宝的蚂蚁森林,具体操作如下:

1、首先弄清楚你的蚂蚁森林能量每天是7点几分成熟,设置一个成熟之前一分钟之内的闹钟,起好名字,比如“蚂蚁森林”,如图:

%title插图%num
2、打开iOS快捷指令app,选择底部“自动化”,再选择右上角“+”,新建快捷指令,如图箭头所示:

%title插图%num
3、在弹出的窗口中选择“创建个人自动化”

%title插图%num
4、新自动化列表里选择“闹钟”-“停止时”-“现有”-找到那个闹钟,比如刚才的名字“蚂蚁森林”-右上角“完成”:

%title插图%num

%title插图%num

%title插图%num
5、返回之后变成这个样子,选择“下一步”:

%title插图%num
6、选择“添加操作”-操作列表里找到“来蚂蚁森林收能量”-“下一步”-再“下一步”-关闭“运行前询问”-“完成”:

%title插图%num

%title插图%num

%title插图%num

%title插图%num

这样这个快捷指令就会在每天提醒你收能量之后自动打开支付宝,并且直接跳转到蚂蚁森林界面啦!当你看见天天你的蚂蚁森林能量球只有一分钟就成熟,是不是很高兴呢?

注意,在响闹钟的提醒出现以后不要忽略这个提醒,而是点开它,当然如果有锁屏密码和支付宝需要解锁识别身份,还是不能跳过的,但是不会中断运行这个快捷指令!

IOS快捷指令的用法(快捷指令库使用方法)

1、打开快捷指令、找到快捷指令中心,随便添加一个系统给的快捷指令;然后点击我的快捷指令,点击刚加入的快捷指令运行一下。

%title插图%num

2、打开设置,搜索快捷指令,勾上允许不信任的快捷指令;

%title插图%num

3、用Safari浏览器搜索快捷指令库,从中找到自己想要的加入到快捷指令中心即可(点击获取捷径)。

%title插图%num

4、可以使用自动化功能运行此指令,比如NFC,或者打开某个应用时;做法:点击自动化—>创建新的自动化—>下一步—>然后搜索快捷指令—>运行我的快捷指令—>点击框中的快捷指令添加即可。

%title插图%num

云计算采用虚拟化技术,有要有哪些原因?

1.服务器上应用程序聚合,将多个应用程序运行在同一台服务器上可以使资源得到*佳利用;

2.由于每个程序对资源需求不同,例如有的需要大规模计算,有的需要更多的存储。采用虚拟化技术可以针对

不同的应用程序需求提供不同的资源;

3.增强了应用的可用性,虚拟化允许快速的恢复一个虚拟环境而不会中断服务,便于新旧程序的切换;

4.提高了响应能力,资源供应、监视和维护可以是自动的,常用资源可以被缓冲和重用。

云计算的核心技术,主要有哪些?

云计算在技术上是通过虚拟化技术架构起来的数据服务中心,实现对存储、计算、内存、网络等资源化,按照用户需求进行动态分配。用户不再是在传统的物理硬件资源上享受服务,而改变为在虚拟资源层上构建自己的应用。

(1)数据存储技术

为保证高可靠性、高可用性和经济性,云计算存储数据采用了分布式存储的方式,并采用冗余存储的方式确保存储数据的高可靠性,即为同一份数据存储多个副本或采用多份备份法,采取并行的方法为大量的用户提供服务,云计算的数据存储技术也具有高传输率和高吞吐率的特点,Google、英特尔、雅虎等厂商采用的都是这种数据存储技术。

(2)数据管理技术

为实现云计算系统对大量数据集进行处理和分析,进而向云计算用户提供高品质的服务,云计算的数据管理技术必须要实现高效的管理大数据集。同时,还要实现在规模巨大的数据中找到特定的数据。云计算的特点是对海量的数据进行存储、读取之后再进行大量的分析,数据读操作的频率远大于数据更新的频率。云计算中的数据管理是一种读优化的数据管理。因此,云计算系统的数据管理多数采用数据库领域中列存储的管理模式,将表按列划分后进行存储,Google 的 BigTable 数据管理技术就是比较成熟的技术。

(3)编程模型

云计算上的编程模型要确保简单,以保证用户能通过编写简单的程序就实现特定的目标,轻松的体会云计算提供的服务。同时也要求这种编程模型后台复杂的并行执行以及任务调度向用户和编程人员透明。

(4)云安全

云安全融合了网格计算、并行技术、未知病毒判别等等*新的信息安全概念和技术,是当今信息安全的全新体现。通过网状的大量客户端对网络中的软件行为异常进行检测,获取互联网上木马、恶意程序等的动态情况,实时推送到服务端进行分析处理,然后再将解决方案分发到客户端,从而及时实现安全处理。

云计算的其他相关技术还有:设备架构技术,包括节点互联技术、数据中心节能技术;资源管理技术,包括数据存储技术、数据管理技术;任务管理技术,包括任务调度技术、数据切分技术;改善服务技术,包括可行性技术、容错性技术;以及云安全技术、并行计算技术、负载均衡技术、虚拟机技术等。

云计算的飞速发展,给中小外贸企业提供了一种全新的、快捷的计算环境,免去了企业用户很多繁杂的工作,例如安装软件包,设置软件配置,甚至编写复杂软件,同时也给中小外贸企业节省了购置软硬件设备,配备专业人员的相关成本。云计算非常适合中小外贸企业的信息化建设。
————————————————

原文链接:https://blog.csdn.net/zhinengxuexi/article/details/89208943

云计算技术,主要包含哪些关键技术?

云计算的关键技术有三大点:

⑴虚拟化技术:云计算的虚拟化技术不同于传统的单一虚拟化,它是涵盖整个IT架构的,包括资源、网络、应用和桌面在内的全系统虚拟化,它的优势在于能够把所有硬件设备、软件应用和数据隔离开来,打破硬件配置、软件部署和数据分布的界限,实现IT架构的动态化,实现资源集中管理,使应用能够动态地使用虚拟资源和物理资源,提高系统适应需求和环境的能力。

对于信息系统仿真,云计算虚拟化技术的应用意义并不仅仅在于提高资源利用率并降低 成本,更大的意义是提供强大的计算能力。众所周知,信息系统仿真系统是一种具有超大计算量的复杂系统,计算能力对于系统运行效率、精度和可靠性影响很大,而虚拟化技术可以将大量分散的、没有得到充分利用的计算能力,整合到计算高负荷的计算机或服务器上,实现全网资源统一调度使用,从而在存储、传输、运算等多个计算方面达到高效。

⑵分布式资源管理技术:信息系统仿真系统在大多数情况下会处在多节点并发执行环境中,要保证系统状态的正确性,必须保证分布数据的一致性。为了分布的一致性问题,计算机界的很多公司和研究人员提出了各种各样的协议,这些协议即是一些需要遵循的规则,也就是说,在云计算出现之前,解决分布的一致性问题是靠众多协议的。但对于大规模,甚至超大规模的分布式系统来说,无法保证各个分系统、子系统都使用同样的协议,也就无法保证分布的一致性问题得到解决。云计算中的分布式资源管理技术圆满解决了这一问题。Google公司的Chubby是*著名的分布式资源管理系统,该系统实现了Chubby服务锁机制,使得解决分布一致性问题的不再仅仅依赖一个协议或者是一个算法,而是有了一个统一的服务(service)。

⑶并行编程技术:云计算采用并行编程模式。在并行编程模式下,并发处理、容错、数据分布、负载均衡等细节都被抽象到一个函数库中,通过统一接口,用户大尺度的计算任务被自动并发和分布执行,即将一个任务自动分成多个子任务,并行地处理海量数据。

对于信息系统仿真这种复杂系统的编程来说,并行编程模式是一种颠覆性的革命,它是在网络计算等一系列优秀成果上发展而来的,所以更加淋漓尽致地体现了面向服务的体系架构(SOA)技术。可以预见,如果将这一并行编程模式引入信息系统仿真领域,定会带来信息系统仿真软件建设的跨越式进步。
————————————————
版权声明:本文为CSDN博主「人工智能爱好者」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhinengxuexi/article/details/88199528

Python运算符

Python运算符

算数运算符
加法运算

print(1 + 1) #2
减法运算

print(1 – 1)#0
乘法运算

print(2 * 4)#8
除法运算

print(1 / 2)#0.5
整除运算

print(11 // 2) # 5
取余运算

print(11 % 2)#1
表示的是2的2次方

print(2 ** 2)#4
表示的是2的3次方

print(2 ** 3)#8 2*2*2
除数
print(9 // 4) # 2
print(-9 // -4) # 2
print(9 // -4) # -3
print(-9 // 4) # -3 一正一负的整数公式, 向下取整

print(9 % -4) # -3 公式 余数=被除数-除数*商 9-(-4)*(-3) 9-12>-3
print(-9 % 4) # 3 -9-4*(-3) +9+12–>3
赋值运算符。 运算顺序从右到左
i = 3 + 4
print(i)
a = b = c = 20 # 链式赋值
print(a, id(a))
print(b, id(b))
print(c, id(c))
print(‘———-支持参数赋值—–‘)
a = 20
a += 30
print(a)
a -= 10 # 相当于a=a-10
print(a)
a *= 2 # 相当于a=a*2
print(a)
print(type(a))
a /= 3
print(a)
print(type(a)) # float
a //= 2
print(a)
print(type(a))
a %= 3
print(a)
print(‘———–解包赋值——–‘)
a, b, c = 20, 30, 40
print(a, b, c)

# a,b=20,30,40 报错,因为左右变量的个数和值的个数不对应
print(‘————–交换两个变量的值—–‘)
a, b = 10, 20
print(‘交换之前:’, a, b)
# 交换
a, b = b, a
print(‘交换之后:’, a, b)
比较运算符
a, b = 10, 20
print(‘a>b吗?’, a > b) # false
print(‘a<b吗?’, a < b) # true
print(‘a<=b吗?’, a <= b) # true
print(‘a>=b吗?’, a >= b) # false
print(‘a==b吗?’, a == b) # false
print(‘a<=b吗?’, a <= b) # true
print(‘a!=b吗?’, a != b) # false

“””一个 = 称为赋值运算符 ,==称为比较运算符
一个变量由三部分组成,标识,类型,值
==比较是值还是标识呢? 比较的是值
比较对象的标识使用 is
“””
a = 10
b = 10
print(a == b) # true 说明,a与b的value 相等
print(a is b) # true 说明,a与b的id标识符,相等

lst1 = [11, 22, 33, 44]
lst2 = [11, 22, 33, 44]
print(lst1 == lst2) # value –>true
print(lst1 is lst2) # id –>false
print(id(lst1))
print(id(lst2))
print(a is not b) # false a的id与b的id是不相等的
print(lst1 is not lst2) # true
布尔运算符

print(‘————-and 并且———–‘)
a, b = 1, 2
print(a == 1 and b == 2) # true true and true–>true
print(a == 1 and b < 2) # false true and false–>false
print(a != 1 and b == 2) # false false and true–>false
print(a != 1 and b != 2) # false false and false–>false

print(‘————-or 或者——–‘)
print(a == 1 or b == 2) # true or true –>true
print(a == 1 or b <= 2) # true or false –>true
print(a != 1 or b == 2) # false or true –>true
print(a != 1 or b != 2) # false or false –>false

print(‘————-not 对bool类型操作数取反——–‘)
f = True
f2 = False
print(not f)
print(not f2)

print(‘—————-in 与not in————‘)
s = ‘hellworld’
print(‘w’ in s)
print(‘k’ in s)
print(‘w’ in s) # false
print(‘k’ in s) # true
位运算符
print(4 & 8) # 按位与&。同为1时结果为1
print(4 | 8) # 按位或|,同为0时结果为0
print(4 << 1) # 向左移动一位(移动一个位置)相当于乘余2
print(4 << 2) # 向左移动2位(移动2个位置)

print(4 >> 1) # 向右移动1位,相当于除以2
print(4 >> 2) # 向右移动2位,相当于除以4

标准BP算法、累积BP算法Python实现

标准BP算法、累积BP算法Python实现

标准BP,累积BP算法原理及MATLAB自编写实现在这里

以下是自己编写的Python的代码,欢迎指正

标准BP算法:

import numpy as np

x=np.matrix(np.random.rand(3,2)) #输入层,随机生成3个样本,每个样本有4个神经元
y=np.matrix(np.random.rand(3,2)) #输出层,随机生成3个样本,每个样本有2个神经元
q=3
N=100000
k = 0.1

”’
q: 隐层单元数目
v: 输入层到隐层的权值
r: 隐层的阀值
w: 隐层到输出层的权值
h: 输出层的阀值
k: 学习率
”’

def fc_sigmod(x):
return 1/(1+np.exp(-x))

def standard_BP(x0,y0,q,N,k):
L=y0.shape[1]
n=x0.shape[1]
v=np.matrix(np.random.rand(n,q))
r=np.matrix(np.random.rand(1,q))
w=np.matrix(np.random.rand(q,L))
h=np.matrix(np.random.rand(1,L))
index=0
y_hat = np.matrix(np.zeros((x0.shape[0],L)))
iter=1
while iter<N:
A=np.dot(x[index],v)
b=fc_sigmod(A-r)

B=np.dot(b,w)
# print(h)
y_hat[index]=fc_sigmod(B-h)

# E=0.5*np.dot(y[index]-y_hat[index],(y[index]-y_hat[index]).T)

‘以下对各个系数进行调整’
g=np.multiply(np.multiply(y_hat[index],(1-y_hat[index])),y[index]-y_hat[index])
e=np.multiply(np.multiply(b,(1-b)),(w*g.T).T)

for i in range(n):
for j in range(q):
v[i,j]=v[i,j]+k*e[0,j]*x[index,i]
r=r-k*e

for i in range(q):
for j in range(L):
w[i,j]=w[i,j]+k*g[0,j]*b[0,i]
h=h-k*g
if index>=x0.shape[0]-1:
index=index-x0.shape[0]+1
index = index +1
iter=iter+1
print(‘输入层到隐层的权值为:’)
print(v)
print(‘隐层的阀值为:’)
print(r)
print(‘隐层到输出层的权值为:’)
print(w)
print(‘输出层的阀值为:’)
print(h)
print(‘样本y的值’)
print(y)
print(‘训练后能得到y_hat的值’)
print(y_hat)

standard_BP(x,y,q,N,k)

我们看到训练后预测的y_hat值与原先的已经比较接近了。当然这里的标准BP算法实现比较简单~

累积BP算法:

import numpy as np

x=np.matrix(np.random.rand(3,2)) #输入层,随机生成3个样本,每个样本有4个神经元
y=np.matrix(np.random.rand(3,2)) #输出层,随机生成3个样本,每个样本有2个神经元
q=3
N=50000
k = 0.1

”’
q: 隐层单元数目
v: 输入层到隐层的权值
r: 隐层的阀值
w: 隐层到输出层的权值
h: 输出层的阀值
k: 学习率
”’

def fc_sigmod(x):
return 1/(1+np.exp(-x))

def acc_BP(x,y,q,N,k):
L=y.shape[1]
n=x.shape[1]
v=np.matrix(np.random.rand(n,q))
r=np.matrix(np.random.rand(1,q))
w=np.matrix(np.random.rand(q,L))
h=np.matrix(np.random.rand(1,L))
b=np.matrix(np.zeros((x.shape[0],q)))
g=np.matrix(np.zeros((x.shape[0],n)))
e=np.matrix(np.zeros((x.shape[0],q)))

y_hat = np.matrix(np.zeros((x.shape[0],L)))
iter=1
while iter<N:
for index in range(x.shape[0]):
A=np.dot(x[index],v)
b[index]=fc_sigmod(A-r)

B = np.dot(b[index],w)
y_hat[index]=fc_sigmod(B-h)

g[index]=np.multiply(np.multiply(y_hat[index],(1-y_hat[index])),y[index]-y_hat[index])
e[index]=np.multiply(np.multiply(b[index],(1-b[index])),(w*g[index].T).T)
#以下对各个系数进行调整
#对上述的一些系数调整至取均值
b_bar=b.mean(axis=0)
g_bar=g.mean(axis=0)
e_bar=e.mean(axis=0)
x_bar=x.mean(axis=0)

for i in range(n):
for j in range(q):
v[i,j]=v[i,j]+k*e_bar[0,j]*x_bar[0,i]
r=r-k*e_bar

for i in range(q):
for j in range(L):
w[i,j]=w[i,j]+k*g_bar[0,j]*b_bar[0,i]
h=h-k*g_bar
iter=iter+1
print(‘输入层到隐层的权值为:’)
print(v)
print(‘隐层的阀值为:’)
print(r)
print(‘隐层到输出层的权值为:’)
print(w)
print(‘输出层的阀值为:’)
print(h)
print(‘样本y的值’)
print(y)
print(‘训练后能得到y_hat的值’)
print(y_hat)

acc_BP(x,y,q,N,k)

这里训练后得到的效果不是很好,和自己先前用Matlab写的累积BP算法一样,训练后得到的y_hat值不是很准确.要想获得更加准确的模型,可以考虑一下几个因素

隐层和输出层的激活函数的选取(我们这里选取的都是sigmod函数)
学习因子
迭代次数
增加隐层单元数目
设置多隐层(我们这里只设置了一个隐层)
————————————————

Python简洁优雅的推导式

Python简洁优雅的推导式


Python语言有一种独特的推导式语法,相当于语法糖的存在,可以帮助你在某些场合写出较为精简酷炫的代码。但没有它,也不会有太多影响。Python语言有几种不同类型的推导式。


1. 列表推导式

列表推导式是一种快速生成列表的方式。其形式是用方括号括起来的一段语句,如下例子所示:

lis = [x * x for x in range(1, 10)]

print(lis)
输出

[1, 4, 9, 16, 25, 36, 49, 64, 81]
列表推导式要这么理解,首先执行for循环,对于每一个x,代入x*x中进行运算,将结果逐一添加到一个新列表内,循环结束,得到*终列表。它相当于下面的代码:

lis = []
for i in range(1, 10):
lis.append(i*i)

print(lis)
输出

[1, 4, 9, 16, 25, 36, 49, 64, 81]
列表推导式为我们提供了一种在一行内实现较为复杂逻辑的生成列表的方法。其核心语法是用中括号[]将生成逻辑封装起来。

列表推导式有多重用法:

增加条件语句

lis = [x * x for x in range(1, 11) if x % 2 == 0]
输出

[4, 16, 36, 64, 100]
多重循环

lis = [a + b for a in ‘123’ for b in ‘abc’]
输出

[‘1a’, ‘1b’, ‘1c’, ‘2a’, ‘2b’, ‘2c’, ‘3a’, ‘3b’, ‘3c’]
更多用法

dic = {“name”: “mumu”, “age”: “18”}
a = [k+”:”+v for k, v in dic.items()]
print(a) # [‘name:mumu’, ‘age:18’]
2. 字典推导式

dic = {x: x**2 for x in (2, 4, 6)}
print(dic)

print(type(dic))
注意:x: x**2的写法,中间的冒号,表示左边的key右边的value。

输出:

{2: 4, 4: 16, 6: 36}
<class ‘dict’>
3. 集合推导式

a = {x for x in ‘abracadabra’ if x not in ‘abc’}
print(a)

print(type(a))
输出:

{‘r’, ‘d’}
<class ‘set’>
4. 元组推导式?

没有元组推导式。

tup = (x for x in range(9))
print(tup)
print(type(tup))
<generator object <genexpr> at 0x0000013DB865AA40>
<class ‘generator’>
要通过类似方法生成元组,需要显式调用元组的类型转换函数tuple(),如下所示:

tup = tuple(x for x in range(9))
print(tup)
print(type(tup))
输出:

(0, 1, 2, 3, 4, 5, 6, 7, 8)
<class ‘tuple’>