迭代计算

PSO算法

断了今生、忘了曾经 提交于 2019-12-06 10:54:04
1.简介 粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由Eberhart 博士和kennedy 博士提出,源于对鸟群捕食的行为研究 。该算法最初是受到飞鸟集群活动的规律性启发,进而利用群体智能建立的一个简化模型。粒子群算法在对动物集群活动行为观察基础上,利用群体中的个体对信息的共享使整个群体的运动在问题求解空间中产生从无序到有序的演化过程,从而获得最优解。 2.基本思想 粒子群算法是模拟群体智能所建立起来的一种优化算法,粒子群算法可以用鸟类在一个空间内随机觅食为例,所有的鸟都不知道食物具体在哪里,但是他们知道大概距离多远,最简单有效的方法就是搜寻目前离食物最近的鸟的周围区域。对粒子群优化算法操作的一个简单解释如下:每一个粒子都代表了当前优化任务的一个可能解决方案。在每次迭代过程中,每个粒子都会朝着自己的最优解的方向加速,也会朝着种群中任何粒子迄今为止发现的全局最佳位置的方向加速。这意味着,如果一个粒子发现了一个更好的解,所有其他粒子都会靠近它,在这个过程中不断地搜索最优解。可以总结出粒子群算法地三条简单规则:(1)飞离最近的个体,以避免碰撞;(2)飞向目标;(3)飞向群体的中心。 假设存在一个维度为S的搜索空间,由m​个粒子组成粒子种群,其中第i​个粒子用一个S​维的向量表示,具体为Xi=(xi1,xi2,…,xiS)

迭代(for循环)

混江龙づ霸主 提交于 2019-12-06 05:47:24
例子 #for x in [1,2,3]: #列表 # print(x) #for x in (1,2,3): #元组 # print(x) 文件本身也是个可迭代的对象: 创建一个new file:data.txt在里面写入 优品课堂学编程 好心情www.codeclassroom.comwww.youpinketang.comwww.uke.cc 再在main.py里写入 f = open('data.txt',encoding='utf8') for line in f: #for line在刚才的f里 print(line, end=' ') #遍历出来结果的行,结尾用空格结束 1、迭代协议:_next_() _next_()不是暴露出来给客户调用,可以获取下一个元素,就是一行一行读 next:所占内存空间不变的情况,如果想获得数据,移到下一项,移动指针用的 pyhon console里写入 f = open('data.txt',encoding='utf8')f.__next__() '优品课堂\n' 典型支持迭代协议对象 >>> f = open('data.txt',encoding='utf8') >>> next(f) '优品课堂\n' >>> next(f) '学编程 好心情\n' >>> next(f) 'www.codeclassroom.com\n' >>

(原来是这样的啊!)角谷静夫不动点(Kakutani fixed point theorem)----资料整理

冷暖自知 提交于 2019-12-05 21:05:57
一、不动点算法 又称固定点算法。所谓不动点,是指将一个给定的区域 A ,经某种变换ƒ( x ),映射到 A 时,使得 x =ƒ( x )成立的那种点。最早出现的 不动点理论 是布劳威尔定理(1912):设 A 为 R n 中的一紧致凸集, ƒ为将 A 映射到 A 的一连续函数,则在 A 中至少存在一点 x ,使得 x =ƒ( x )。其后, 角谷静夫 于1941年将此定理推广到点到集映射上去。设对每一 x ∈ A ,ƒ( x )为 A 的一子集。若ƒ( x )具有性质:对 A 上的任一收敛序列 x i → x 0 ,若 y i ∈ƒ( x i )且 y i → y 0 ,则有 y 0 ∈ƒ( x 0 ),如此的ƒ( x )称为在 A 上半连续, 角谷静夫定理:设 A 为 R n 中的一紧致凸集,对于任何 x ∈ A ,若ƒ( x )为 A 的一非空凸集,且ƒ( x )在 A 上为上半连续,则必存在 x ∈ A ,使 x ∈ƒ( x )。 J.P.绍德尔和 J.勒雷 又将布劳威尔定理推广到巴拿赫空间。   不动点定理在代数方程、微分方程、积分方程、数理经济学等学科中皆有广泛的应用。例如,关于代数方程的基本定理,要证明ƒ( x )=0必有一根,只须证明在适当大的圆│ x │≤ R 内函数ƒ( x )+ x 有一不动点即可;在运筹学中,不动点定理的用途至少有二:

Python函数高级

主宰稳场 提交于 2019-12-05 19:35:26
一、 闭包函数 闭包:闭是封闭(函数内部函数),包是包含(该内部函数对外部作用域而非全局作用域的变量的引用)。闭包指的是:函数内部函数对外部作用域而非全局作用域的引用。 def outter(x): x = 1 def inner(): print(x) return inner f = outter(2) f() # 1 f() # 1 f() # 1 # 查看闭包的元素 print(f.__closure__[0].cell_contents) # 1 闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得, 该函数无论在何处调用,优先使用自己外层包裹的作用域。 1、应用领域: 延迟计算(原来我们是传参,现在我们是包起来)、爬虫领域。 import requests def outter(url): def get(): response = requests.get(url) print(f"done: {url}") return get baidu = outter('https://www.baidu.com') python = outter('https://www.python.org') baidu() baidu() python() python() 二、 装饰器 装饰器指的是为被装饰器对象添加额外功能

[ch02-03] 梯度下降

ぐ巨炮叔叔 提交于 2019-12-05 19:31:56
系列博客,原文在笔者所维护的github上: https://aka.ms/beginnerAI , 点击star加星不要吝啬,星越多笔者越努力。 2.3 梯度下降 2.3.1 从自然现象中理解梯度下降 在大多数文章中,都以“一个人被困在山上,需要迅速下到谷底”来举例,这个人会“寻找当前所处位置最陡峭的地方向下走”。这个例子中忽略了安全因素,这个人不可能沿着最陡峭的方向走,要考虑坡度。 在自然界中,梯度下降的最好例子,就是泉水下山的过程: 水受重力影响,会在当前位置,沿着最陡峭的方向流动,有时会形成瀑布(梯度下降); 水流下山的路径不是唯一的,在同一个地点,有可能有多个位置具有同样的陡峭程度,而造成了分流(可以得到多个解); 遇到坑洼地区,有可能形成湖泊,而终止下山过程(不能得到全局最优解,而是局部最优解)。 2.3.2 梯度下降的数学理解 梯度下降的数学公式: \[\theta_{n+1} = \theta_{n} - \eta \cdot \nabla J(\theta) \tag{1}\] 其中: \(\theta_{n+1}\) :下一个值; \(\theta_n\) :当前值; \(-\) :减号,梯度的反向; \(\eta\) :学习率或步长,控制每一步走的距离,不要太快以免错过了最佳景点,不要太慢以免时间太长; \(\nabla\) :梯度,函数当前位置的最快上升点;

PL真有意思(四):控制流

旧巷老猫 提交于 2019-12-05 16:57:04
前言 对大多数计算模型而言,顺序都是基本的东西,它确定了为完成所期望的某种工作,什么事情应该最先做,什么事应该随后做,我们可以将语言规定顺序的机制分为几个类别: 顺序执行 选择 迭代 过程抽象 递归 并发 异常处理和推断 非确定性 对于不同类别的语言对不同类别的控制流的重要性也不尽相同,比如顺序执行相比于函数式对于命令式则更加重要。而命令式中更倾向用迭代,函数则更强调递归 表达式求值 在讨论控制流之前先讨论下表达式的问题,先明确两个概念:运算符通常是指那些采用特殊语法形式的内部函数(比如+-*/等),运算对象指的是运算符的参数(如2+3,2和3就是运算对象),那么运算符和运算对象的组合就是表达式。一般根据运算符出现的位置(相对于运算对象而言),可以分为3类表示形式:前缀、中缀和后缀。比如Lisp就运用前缀语法: (+ 1 3 4 6) (* (+ 1 7) 8) 大多数命令式语言对二元运算符都使用中缀记法,而对一元运算符和其它函数使用前缀激发。但是像Lisp就全部统一使用中缀记法 优先级和结合性 大多数程序设计语言都提供丰富的内部算术。在用中缀方式(没有括号)写出就可能出现歧义。所以就需要优先级和结合性来解决歧义性,但是我觉得 妈的你写括号就完事儿了 而且不同语言的优先级和结合性也不尽相同 赋值 在纯函数式语言中,程序的基本组成部分是表达式,计算也仅是对表达式求值

[ch02-02] 非线性反向传播

时光怂恿深爱的人放手 提交于 2019-12-05 16:55:26
系列博客,原文在笔者所维护的github上: https://aka.ms/beginnerAI , 点击star加星不要吝啬,星越多笔者越努力。 2.2 非线性反向传播 2.2.1 提出问题 在上面的线性例子中,我们可以发现,误差一次性地传递给了初始值w和b,即,只经过一步,直接修改w和b的值,就能做到误差校正。因为从它的计算图看,无论中间计算过程有多么复杂,它都是线性的,所以可以一次传到底。缺点是这种线性的组合最多只能解决线性问题,不能解决更复杂的问题。这个我们在神经网络基本原理中已经阐述过了,需要有激活函数连接两个线性单元。 下面我们看一个非线性的例子,如图2-8所示。 图2-8 非线性的反向传播 其中 \(1<x<=10,0<y<2.15\) 。假设有5个人分别代表x、a、b、c、y: 正向过程 第1个人,输入层,随机输入第一个x值,x取值范围(1,10],假设第一个数是2 第2个人,第一层网络计算,接收第1个人传入x的值,计算: \(a=x^2\) 第3个人,第二层网络计算,接收第2个人传入a的值,计算b: \(b=\ln (a)\) 第4个人,第三层网络计算,接收第3个人传入b的值,计算c: \(c=\sqrt{b}\) 第5个人,输出层,接收第4个人传入c的值 反向过程 第5个人,计算y与c的差值: \(\Delta c = c - y\) ,传回给第4个人 第4个人

访问图像的三种方法

我的梦境 提交于 2019-12-05 15:21:38
方法一:用指针访问像素 利用c语言中的操作符[],这种方法最快,但是略有些抽象。实验条件下单次运行时间为0.00665378 方法二:用迭代器操作像素 这种方法与STL库的用法类似,在迭代法中,我们所需要的就是获得图像矩阵的begin和end,然后增加迭代直至从begin到end。将*操作符添加在迭代指针前,即可访问当前只想的内容。 方法三:动态地址计算 使用动态地址运算配合at方法。 来源: https://www.cnblogs.com/shuguomeifuguo/p/11930695.html

JDK 1.8 新特性之Stream

拜拜、爱过 提交于 2019-12-05 14:33:16
2018-08-27 22:11:21 更多 另一个链接: https://www.jianshu.com/p/2a35a263e8fe 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/fanxiaobin577328725/article/details/82119982 由浅入深的学习推荐阅读图书《 Java 8 实战_高清中文版 》 学习流之前,需要有一定的Lambda表达式的基础知识,可阅读《 JDK 1.8 新特性之Lambda表达式 》 一、前言 流是 Java 8 的新成员,它允许你 以声明式方式处理数据集合 (通过查询语句来表达,而不是临时编写一个实现)。此外,流还可以 透明地并行处理 ,你无需写任何多线程代码了! 流的简短定义:从支持 数据处理操作 的 源 生成的 元素序列 。 元素序列 :就像集合一样,流也提供了一个接口,可以访问特定元素类型的一组有序值。因为集合是数据结构,所以它的主要目的是以特定的时间/空间复杂度存储和访问元素(如ArrayList 与 LinkedList)。但流的目的在于表达计算。 集合讲的是数据,流讲的是计算。 源 :流会使用一个提供数据的源,如 集合、数组或输入/输出资源 。 请注意,从有序集合生成流时会保留原有的顺序

100天搞定机器学习|Day57 Adaboost知识手册(理论篇)

丶灬走出姿态 提交于 2019-12-05 12:16:57
Boosting算法 Boosting是一种用来提高弱分类器准确度的算法,是将“弱学习算法“提升为“强学习算法”的过程,主要思想是“三个臭皮匠顶个诸葛亮”。一般来说,找到弱学习算法要相对容易一些,然后通过反复学习得到一系列弱分类器,组合这些弱分类器得到一个强分类器。 Boosting算法要涉及到两个部分,加法模型和前向分步算法。 加法模型就是说强分类器由一系列弱分类器线性相加而成。一般组合形式如下: $$F_M(x;P)=\sum_{m=1}^n\beta_mh(x;a_m)$$ 其中,$h(x;a_m)$就是一个个的弱分类器,$a_m$是弱分类器学习到的最优参数,$\beta_m$就是弱学习在强分类器中所占比重,$P$是所有$\alpha_m$和$\beta_m$的组合。这些弱分类器线性相加组成强分类器。 前向分步就是说在训练过程中,下一轮迭代产生的分类器是在上一轮的基础上训练得来的。也就是可以写成这样的形式: $$F_m (x)=F_{m-1}(x)+ \beta_mh_m (x;a_m)$$ 用下面的GIF看起来会更加生动 Adaboost基本概念 AdaBoost是典型的Boosting算法,属于Boosting家族的一员。 对于AdaBoost,我们要搞清楚两点: 1、每一次迭代的弱学习$h(x;a_m)$有何不一样,如何学习? 2、弱分类器权值$\beta_m$如何确定