迭代计算

【Python学习】高级特性

╄→гoц情女王★ 提交于 2020-02-21 10:03:10
Python中,代码不是越多越好,而是越少越好。代码不是越复杂越好,而是越简单越好。 (一)切片 取一个list或tuple的部分元素 # --------------列表---------------- List = [ 'aa' , 'bb' , 'cc' , 'dd' ] # 取前2个元素 print ( List [ 0 : 2 ] ) # 从索引0开始取,直到索引为2为止,不包括索引2 # 如果第一个元素索引为0 print ( List [ : 2 ] ) # 从索引1开始,取2个元素 print ( List [ 1 : 3 ] ) # 倒数切片 倒数第一个元素的索引是-1 print ( List [ - 1 : ] ) # 0-100的数列 l = list ( range ( 101 ) ) # 取出前十个元素 print ( l [ 0 : 10 ] ) # 取出后十个元素 print ( l [ - 10 : ] ) # 前11-21的元素 print ( l [ 10 : 21 ] ) # 前10个数,每隔2个取一个 print ( l [ : 10 : 2 ] ) # 所有数,每隔9个取1个 print ( l [ : : 9 ] ) # 复制list print ( l [ : ] ) # --------------元组---------------

深度学习——循环神经网络

为君一笑 提交于 2020-02-19 06:09:16
理解 循环神经网络(Recurrent Neural Network, RNN)是一类以序列(sequence)数据为输入,在序列的演进方向进行递归(recursion)且所有节点(循环单元)按链式连接的递归神经网络(recursive neural network)。 递归神经网络(RNN)相对于MLP和CNN的主要优点是,它能够处理序列数据,在传统神经网络或卷积神经网络中,样本(sample)输入与输出是没有“顺序”概念的,可以理解为,如果把输入序列和输出序列重新排布,对整体模型的理论性能不会有影响。RNN则不同,它保证了输入和输出至少有一端是有序列特征的。 传统的神经网络结构可以归纳为下图左边的形式,隐藏层 h 的状态是不保存的,而在RNN中,每一个时间步的隐藏层状态都是由上一层的输入和上一个时间的状态共同计算得到。 为什么循环神经网络可以往前看任意多个输入值呢? 来看下面的公式,即 RNN 的输出层 o 和隐藏层 s 的计算方法: 如果反复把式 2 带入到式 1,将得到: RNN 的训练算法为:BPTT BPTT 的基本原理和 BP 算法是一样的,同样是三步: 1、前向计算每个神经元的输出值; 2、反向计算每个神经元的误差项值,它是误差函数E对神经元j的加权输入的偏导数; 3、计算每个权重的梯度。 最后再用随机梯度下降算法更新权重。 模型参数 W_xh: 状态-输入权重 W

机器学习:逻辑回归

ε祈祈猫儿з 提交于 2020-02-19 00:40:15
虽然名字里带回归,但实际上是一种分类方法,主要用于两分类问题,即只有两种分类 优点:计算代价不高,易于理解和实现 缺点:容易欠拟合,分类精度可能不高 原理 线性回归函数    \(\small z = f(X) = XW\)   其中      X 是特征值      W 是回归系数    X 和 W 都是向量,可展开为      \(\small z = XW = X_{0}W_{0} + X_{1}W_{1} + ... + X_{n}W_{n}\)   线性方程其实应该是      \(\small z = XW + b\)   为此这里固定      \(\small X_{0}=1\)      \(\small W_{0}=b\)   其他 X 值才是用户输入,这样变成两个向量相乘方便计算 逻辑回归函数 (Sigmoid 函数)    \(\small y=g(z)=\frac{1}{1+e^{-z}}\)   该函数模拟阶跃函数 (在某个跳跃点从 0 瞬间跳到 1,跳跃点两边的值固定为 0 和 1)   可以得出      \(\small y=\left\{\begin{matrix}0.12&z=-2\\0.5&z=0\\0.88&z=2\end{matrix}\right.\)   且满足      \(\small g(z) + g(-z) = 1\)   

快速幂算法 ——递归与迭代

若如初见. 提交于 2020-02-17 23:54:27
快速幂算法讲解 递归算法: int cpow(int m,int n) { if(n==0) return 1; else if(n%2==1){ return cpow(m,n-1)*m; }else if(n%2==0) { int temp = cpow(m,n/2); return temp*temp; } } 例如:当我们已知了 2^3,那么在计算2^6不就是相当于2^3*2^3,而快速幂就是运用了这样的原理,但是,如果我们碰到的幂为奇数时怎么办?直接提出来一个幂不就好了,例如在计算2^7,将此转换成2*2^6,之后2^6继续运用上面对待偶数的办法不就好了; 总结以上啰里啰嗦的话,转换成公式就是一下: 1 )当b是奇数时,那么有 a^b = a * a^*(b-1) 2)当b是偶数时,那么有 a^b = a^(b/2) * a^(b/2) 迭代算法: int qpow(int a,int n) { int nas = 1; while(n){ if(n&1) ans *= a; a *= a; n>>=1; } return ans; } 迭代算法运用到了位运算&,将递归算法的(n%2==0)改为(n&1); 对于 a ^ b来说,若果把 b 写成2 进制,那么b 就可以写成若干二次幂之和,如13 的二进制 1101,于是3 号位 、2号位、0号位就都是1

Scala集合(二)

℡╲_俬逩灬. 提交于 2020-02-17 23:27:29
将函数映射到集合 map方法 val names = List("Peter" , "Paul", "Mary") names.map(_.toUpperCase) // 等同于 for(n <- names) yield n.toUpperCase flatMap方法,如果函数产出一个集合,又想将所有值串联在一起 def ulcase(s:String) = Vector(s.toUpperCase(), s.toLowerCase()) names.map(ulcase)得到 List(Vector("PETER","peter"), Vector("PAUL","paul"), Vector("MARY","mary")) names.flatMap(ulcase)得到 List("PETER","peter","PAUL","paul","MARY","mary") collect 方法用于 partial function,那些并没有对所有可能的输入值进行定义的函数, 产出被定义的所有参数的函数值得集合 "-3+4".collect(case '+' -> 1; case '-' -> -1) // vector(-1,1) foreach方法 names.foreach(println) 化简、折叠和扫描 List(1,7,2,9).reduceLeft(_ - _)

初探迭代器Iterators

落花浮王杯 提交于 2020-02-17 11:26:47
一、概念引入: 除了使用下标来访问容器对象的元素外,标准库还提供了另一种访问元素的方法:使用迭代器(Iterators)。 迭代器是一种 检查容器内元素并遍历元素的 数据类型 。 所有的标准库容器都定义了相应的迭代器类型,而只有少数的容器支持下标操作。 因为迭代器对所有的容器都适用,现代 C++ 程序更倾向于使用迭代器而不是下标操作访问容器元素,即使对支持下标操作的 vector 类型也是这样。(即: 尽量使用迭代器访问容器元素 。) 二、困惑——迭代器和迭代器类型 最开始的时候容易搞不清楚,原因之一是由于同一个术语 iterator 往往表示两个不同的事物。 一般意义上指的是迭代器的概念;而具体而言时指的则是由容器定义的具体的 iterator 类型,如 vector<int> 。 重点要理解的是,有许多用作迭代器的类型,这些类型在概念上是相关的。若一种类型支持一组确定的操作(这些操作可用来遍历容器内的元素,并访问这些元素的值),我们就称这种类型为迭代器。 即: 每个容器都定义了一个名为 iterator 的类型,而这种类型支持(概念上的)迭代器的各种操作。 三、begin 和 end 操作 每种容器都定义了一对命名为 begin 和 end 的函数,用于返回迭代器。 如果容器中有元素的话,由 begin 返回的迭代器指向第一个元素。 由 end 操作返回的迭代器指向

C++之STL迭代器

别来无恙 提交于 2020-02-17 11:26:11
迭代器是一种检查容器内元素并遍历元素的数据类型。可以替代下标访问vector对象的元素。 每种容器类型都定义了自己的迭代器类型,如 vector: vector< int>::iterator iter; 这符语句定义了一个名为 iter 的变量,它的数据类型是 vector<int> 定义的 iterator 类型。每个标准库容器类型都定义了一个名为 iterator 的成员,这里的 iterator 与迭代器实际类型的含义相同。 begin 和 end 操作 每种容器都定义了一对命名为 begin 和 end 的函数,用于返回迭代器。如果容器中有元素的话,由 begin 返回的迭代器指向第一个元素: vector< int>::iterator iter = ivec.begin(); 上述语句把 iter 初始化为由名为 vector 操作返回的值。假设 vector 不空,初始化后,iter 即指该元素为 ivec[0]。由 end 操作返回的迭代器指向 vector 的“末端元素的下一个”。表明它指向了一个不存在的元素。如果 vector 为空,begin 返回的迭代器与 end 返回的迭代器相同。由 end 操作返回的迭代器并不指向 vector 中任何实际的元素,相反,它只是起一个哨兵(sentinel)的作用,表示我们已处理完 vector 中所有元素。 【备注

Python—迭代器和生成器

送分小仙女□ 提交于 2020-02-16 01:23:00
楔子 假如我现在有一个列表l=['a','b','c','d','e'],我想取列表中的内容,有几种方式? 首先,我可以通过索引取值l[0],其次我们是不是还可以用for循环来取值呀? 你有没有仔细思考过,用索引取值和for循环取值是有着微妙区别的。 如果用索引取值,你可以取到任意位置的值,前提是你要知道这个值在什么位置。 如果用for循环来取值,我们把每一个值都取到,不需要关心每一个值的位置,因为只能顺序的取值,并不能跳过任何一个直接去取其他位置的值。 但你有没有想过,我们为什么可以使用for循环来取值? for循环内部是怎么工作的呢? 迭代器 python中的for循环 要了解python中的for循环是怎么回事儿,咱们还是要从代码的角度出发。 首先,我们对一个列表进行for循环。 for i in [1,2,3,4]: print(i) 上面这段代码肯定是没有问题的,但是我们换一种情况,来循环一个数字1234试试 for i in 1234 print(i) 结果: Traceback (most recent call last): File "test.py", line 4, in <module> for i in 1234: TypeError: 'int' object is not iterable 看,报错了!报了什么错呢?“TypeError: 'int'

Java 中的迭代器 —— Iterator

半城伤御伤魂 提交于 2020-02-15 08:40:19
一、 Iterator 是什么? 1、迭代器模式 迭代器模式( Iterator Pattern )是一种非常常见的设计模式,这种模式用于顺序访问集合对象的元素,而不需要知道集合对象内部的实现方式。 所以,迭代器模式的优点就是: 简化了聚合类 。无论是增加新的聚合类还是增加迭代器类都会很方便,无须修改原有的代码。 它的优点也导致了它的缺点:由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类时也需要对应增加新的迭代器类,耦合度很高,这在一定程度上增加了系统的复杂性。 2、Iterator 接口 在 Java 中,提供了一个迭代器接口 Iterator ,把在集合对象中元素之间遍历的工作交给迭代器,而不是集合对象本身,迭代器为遍历不同的集合对象提供一个统一的接口。这就是 Java 集合框架中 Iterable 接口位于框架结构最顶层的原因。这其实也就是面向对象的思想。 二、Iterator 的使用 下面我们先看看 Iterator 是如何使用的。 1、Iterator 中的方法 先从 Iterator 接口的源码来分析一下: public interface Iterator < E > { boolean hasNext ( ) ; E next ( ) ; default void remove ( ) { throw new

OpenMP 中的线程任务调度

三世轮回 提交于 2020-02-14 17:12:07
OpenMP中任务调度主要针对并行的for循环,当循环中每次迭代的计算量不相等时,如果简单地给各个线程分配相同次数的迭代,则可能会造成各个线程计算负载的不平衡,影响程序的整体性能。 如下面的代码中,如果每个线程执行的任务数量平均分配,有的线程会结束早,有的线程结束晚: 1 #include<stdio.h> 2 #include<omp.h> 3 4 int main(){ 5 int a[100][100] = {0}; 6 #pragma omp parallel for 7 for (int i =0; i < 100; i++){ 8 for(int j = i; j < 100; j++ ) 9 a[i][j] = ((i%7)*(j%13)%23); 10 } 11 return 0; 12 } 为此,OpenMP提供了schedule子句来实现任务的调度。 schedule子句:   schedule(type[, size]),   参数type是指调度的类型,可以取值为static,dynamic,guided,runtime四种值。其中runtime允许在运行时确定调度类型,因此实际调度策略只有前面三种。   参数size表示每次调度的迭代数量,必须是整数。该参数是可选的。当type的值是runtime时,不能够使用该参数。 1.静态调度static