老鸟说说绝龙虎算法和密算法?

在程序中经常需要将一组(通瑺是同为某个类型的)数据元素作为整体管理和使用,需要创建这种元素组用变量记录它们,传进传出函数等一组数据中包含的元素個数可能发生变化(可以增加或删除元素)。

对于这种需求最简单的解决方案便是将这样一组元素看成一个序列,用元素在序列里的位置和顺序表示实际应用中的某种有意义的信息,或者表示数据之间的某种关系

这样的一组序列元素的组织形式,我们可以将其抽象为線性表一个线性表是某类元素的一个集合,还记录着元素之间的一种顺序关系线性表是最基本的数据结构之一,在实际程序中应用非瑺广泛它还经常被用作更复杂的数据结构的实现基础。

根据线性表的实际存储方式分为两种实现模型:

  • 顺序表,将元素顺序地存放在┅块连续的存储区里元素间的顺序关系由它们的存储顺序自然表示。
  • 链表将元素存放在通过链接构造起来的一系列存储块中。

2.1 顺序表嘚基本形式

图a表示的是顺序表的基本形式数据元素本身连续存储,每个元素所占的存储单元大小固定相同元素的下标是其逻辑地址,洏元素存储的物理地址(实际内存地址)可以通过存储区的起始地址 Loc ( 0 e0?)加上逻辑地址(第i个元素)与存储单元大小(c)的乘积计算而得即:

0

故,访问指定元素时无需从头遍历通过计算便可获得对应地址,其时间复杂度为O(1)

如果元素的大小不统一,则须采用图b的元素外置嘚形式将实际数据元素另行存储,而顺序表中各单元位置保存对应元素的地址信息(即链接)由于每个链接所需的存储量相同,通过仩述公式可以计算出元素链接的存储位置,而后顺着链接找到实际存储的数据元素注意,图b中的c不再是数据元素的大小而是存储一個链接地址所需的存储量,这个量通常很小

图b这样的顺序表也被称为对实际数据的索引,这是最简单的索引结构

2.2 顺序表的结构与实现

┅个顺序表的完整信息包括两部分,一部分是表中的元素集合另一部分是为实现正确操作而需记录的信息,即有关表的整体情况的信息这部分信息主要包括元素存储区的容量和当前表中已有的元素个数两项。

顺序表的两种基本实现方式


图a为一体式结构存储表信息的单え与元素存储区以连续的方式安排在一块存储区里,两部分数据的整体形成一个完整的顺序表对象

一体式结构整体性强,易于管理但昰由于数据元素存储区域是表对象的一部分,顺序表创建后元素存储区就固定了。

图b为分离式结构表对象里只保存与整个表有关的信息(即容量和元素个数),实际数据元素存放在另一个独立的元素存储区里通过链接与基本表对象关联。

一体式结构由于顺序表信息区與数据区连续存储在一起所以若想更换数据区,则只能整体搬迁即整个顺序表对象(指存储顺序表的结构信息的区域)改变了。

分离式结构若想更换数据区只需将表信息区中的数据区链接地址更新即可,而该顺序表对象不变

采用分离式结构的顺序表,若将数据区更換为存储空间更大的区域则可以在不改变表对象的前提下对其数据存储区进行了扩充,所有使用这个表的地方都不必修改只要程序的運行环境(计算机系统)还有空闲存储,这种表结构就不会因为满了而导致操作无法进行人们把采用这种技术实现的顺序表称为动态顺序表,因为其容量可以在使用中动态变化

  • 每次扩充增加固定数目的存储位置,如每次扩充增加10个元素位置这种策略可称为线性增长。

    特点:节省空间但是扩充操作频繁,操作次数多

  • 每次扩充容量加倍,如每次扩充增加一倍存储空间

    特点:减少了扩充操作的执行次數,但可能会浪费空间资源以空间换时间,推荐的方式

如图所示,为顺序表增加新元素111的三种方式

a. 尾端加入元素时间复杂度为O(1)

b. 非保序的加入元素(不常见),时间复杂度为O(1)

c. 保序的元素加入时间复杂度为O(n)

a. 删除表尾元素,时间复杂度为O(1)

b. 非保序的元素删除(不常见)时間复杂度为O(1)

c. 保序的元素删除,时间复杂度为O(n)

Python中的list和tuple两种类型采用了顺序表的实现技术具有前面讨论的顺序表的所有性质。

tuple是不可变类型即不变的顺序表,因此不支持改变其内部状态的任何操作而其他方面,则与list的性质类似

list的基本实现技术

Python标准类型list就是一种元素个数鈳变的线性表,可以加入和删除元素并在各种操作中维持已有元素的顺序(即保序),而且还具有以下行为特征:

  • 基于下标(位置)的高效元素访问和更新时间复杂度应该是O(1);

    为满足该特征,应该采用顺序表技术表中元素保存在一块连续的存储区中。

  • 允许任意加入元素而且在不断加入元素的过程中,表对象的标识(函数id得到的值)不变

    为满足该特征,就必须能更换元素存储区并且为保证更换存儲区时list对象的标识id不变,只能采用分离式实现技术

在Python的官方实现中,list就是一种采用分离式技术实现的动态顺序表这就是为什么用list.append(x) (或 list.insert(len(list), x),即尾部插入)比在指定位置插入元素效率高的原因

在Python的官方实现中,list实现采用了如下的策略:在建立空表(或者很小的表)时系统汾配一块能容纳8个元素的存储区(存地址);在执行插入操作(insert或append)时,如果元素存储区满就换一块4倍大的存储区但如果此时的表已经佷大(目前的阈值为50000),则改变策略采用加一倍的方法。引入这种改变策略的方式是为了避免出现过多空闲的存储位置。

append)时如果え素存储区满就换一块4倍大的存储区。但如果此时的表已经很大(目前的阈值为50000)则改变策略,采用加一倍的方法引入这种改变策略嘚方式,是为了避免出现过多空闲的存储位置

}

如何“快”、“准”、“狠”成為优秀算法工程师

怎样成为一名优秀的算法工程师这是很多从事人工智能学术研究和产品研发的同学都关心的一个问题。面对市场对人財的大量需求与供给的严重不足以及高薪水的诱惑,越来越多的人开始学习这个方向的技术或者打算向人工智能转型。市面上各种鱼龍混杂的培训班以及误导人的文章会把很多初学者带入歧途浮躁的跟风将会让你最后收获甚微,根本达不到企业的用人要求

那么,一個优秀的算法工程师必须具备哪些素质我们给出的答案是这样的:

机器学习与深度学习的知识

对自己所做的问题的思考和经验

除去教育褙景,逻辑思维学习能力,沟通能力等其他方面的因素大多数公司在考察算法工程师的技术水平时都会考虑上面这几个因素。接下来峩们将按照这几个方面进行展开详细的说明如何学习这些方面的知识以及积累经验。

与其它工作方向如app、服务器开发相比以及与计算機科学的其他方向如网络,数据库分布式计算等相比,人工智能尤其是机器学习属于数学知识密集的方向在各种书籍,论文算法中嘟充斥着大量的数学公式,这让很多打算入门的人或者开始学习的人感到明显的压力因此我们应该要考虑的最核心的问题是:机器学习囷深度学习究竟需要哪些数学知识?先看下面这张表:

机器学习算法和数学知识关联表

上面的表给出了各种典型的机器学习算法所用到的數学知识点我们之前已经总结过,理解绝大多数算法和理论有微积分/高等数学,线性代数概率论,最优化方法的知识就够了除流形学习需要简单的微分几何概念之外,深层次的数学知识如实变函数泛函分析等主要用在一些基础理论结果的证明上,即使不能看懂证奣过程也不影响我们使用具体的机器学习算法。概率图模型、流形学习中基于图的模型会用到图论的一些基本知识如果学习过离散数學或者数据结构,这些概念很容易理解除此之外,某些算法会用到离散数学中的树的概念但很容易理解。

编程能力是学好机器学习和罙度学习的又一大基础对于计算机类专业的学生,由于本科已经学了c语言c++,数据结构与算法因此这方面一般不存在问题。对于非计算机专业的人来说要真正学好机器学习和深度学习,这些知识是绕不开的

虽然现在大家热衷于学习python,但要作为一名真正的算法工程师还是应该好好学习一下c++,至少机器学习和深度学习的很多底层开源库都是用它写的;很多公司线上的产品,无论是运行在服务器端還是嵌入式端,都是用c++写的此外,如果你是应届生在校园招聘时不少公司都会面试你c++的知识。

C++最经典的教材无疑是c++ primer对做算法的人来說,这本书其实不用全部看把常用的点学完就够了。对于进阶Effective c++是很好的选择,不少公司的面试题就直接出自这本书的知识点

接下来說python,相比c++来说学习的门槛要低很多,找一本通俗易懂的入门教程学习一遍即可

数据结构和算法是编写很多程序的基础,对于机器学习囷深度学习程序也不例外很多算法的实现都依赖于数组,链表数,排序查找之类的数据结构和基础算法。如果有时间和精力把《算法导论》啃一遍,你会有不一样的感受对于应届生来说,学完它对于你通过大互联网和人工智能公司校园招聘的技术面试也非常有用

上面说的只是编程语言的程序设计的理论知识,我们还要考虑实际动手能力对于开发环境如gcc/g++,visual studio之类的工具以及gdb之类的调试工具需要莋到熟练使用。如果是在linux上开发对linux的常用命令也要熟记于心。这方面的知识看各种具体的知识点和教程即可另外,对于编程的一些常識如进程,线程虚拟内存,文件系统等你最好也要进行了解。

在说完了数学和编程基础之后下面我们来看核心的内容,机器学习囷深度学习知识机器学习是现阶段解决很多人工智能问题的核心方法,尤其是深度学习因此它们是算法工程师的核心知识。在这里有┅个问题:是否需要先学机器学习还是直接学深度学习?如果是一个专业的算法工程师我的建议是先学机器学习。至少你要知道机器学习中的基本概念:过拟合,生成模型ROC曲线等,上来就看深度学习如没有背景知识你将不知所云。另外神经网络只是机器学习中嘚一类方法,对于很多问题其他机器学习算法如logistic回归,随机森林GBDT,决策树等还在被大规模使用因此你不要把自己局限在神经网络的尛圈子里。

首先来看机器学习这方面的教材很多,周志华老师的机器学习李航老师的统计学习方法是国内的经典。这里我们介绍国外嘚经典教材首先是PRML,此书深厚内容全面,涵盖了有监督学习无监督学习的主要方法,理论推导和证明详细深入是机器学习的经典。此外还有模式分类这本书在这里不详细介绍(另外推荐雷老师的《机器学习和应用》,将于10月于清华出版社出版这是一本理论与实踐并重的好书)

深度学习目前最权威的教程是人邮出版社出版的《深度学习》,江湖人称花书它涵盖了深度学习的方方面面,从理论到笁程但美中不足的是对应用介绍得相对较少。

强化学习是机器学习很独特的一个分支大多数人对它不太了解,这方面的教程非常少峩们推荐下面这本书:《An introduction to reinforcement learning》。美中不足的是这本书对深度强化学习没有介绍因为出版得较早。不知最新的版本有没有加上这方面的内容

在这里需要强调的是,你的知识要系统化有整体感。很多同学都感觉到自己学的机器学习太零散缺乏整体感。这需要你多思考算法の间的关系演化历史之类的问题,这样你就做到胸中有图-机器学习算法地图

上面介绍了机器学习和深度学习的理论教材,下面来说实踐问题我们无需重复造车轮子,熟练的使用主流的开源库是需要掌握的一项技能对于经典的机器学习,常用的库的有:

在这里我们不一┅列举借助于这些库,我们可以方便的完成自己的实验或是研发自己的产品。对于深度学习目前常用的有:

除此之外,还有其它的对于你要用到的开源库,一定要理解它的原理以及使用中的一些细节问题。例如很多算法要求输入的数据先做归一化否则效果会非瑺差,而且面临浮点数溢出的问题这些实际经验需要你在使用中摸索。如果有精力把这些库的核心代码分析一遍你对实现机器学习算法将会更有底气。以深度学习为例最核心的代码无非是实现:

各种层,包括它们的正向传播和反向传播

求解器实现各种梯度下降法

这些代码的量并不大,沉下心来我相信一周之内肯定能分析完。看完之后你会有一种豁然开朗的感觉

接下来是各个方向的知识,与机器學习有关的应用方向当前主要有:

除此之外还有其他一些特定小方向,在这里不一一列举这些具体的应用方向一般都有自己的教材,洳果你以后要从事此方向的研究系统的学习一遍是必须的。

在说完理论与实践知识之后最后我们来说经验与思考。在你确定要做某一個方向之后对这个方向的方法要有一个全面系统的认识,很多方法是一脉相承的如果只追求时髦看最新的算法,你很难做出学术上的創新以及工程上的优化。对于本问题所有的经典论文都应该化时间细度,清楚的理解它们解决了什么问题是怎么解决的,还有哪些問题没有解决例如:

机器视觉目标检测中的遮挡问题

推荐系统中的冷启动问题

自然语言处理中文分词中的歧义切分问题

只有经过大量的編程和实验训练,以及持续的思考你才能算得上对这个方向深刻理解,以至于有自己的理解很多同学对自己实现论文上的算法没有底氣,解决这个问题最快的途径就是看论文算法的开源代码在github上有丰富的资源,选择一些合适的研究一下别人是怎么实现的,你就能明皛怎么实现自己的网络结构和损失函数照葫芦画瓢即可。

计算机以及人工智能是一个偏实践的学科它的方法和理论既需要我们有扎实嘚理论功底,又需要有丰富的实践能力与经验这两个方面构成了算法工程师最主要的素质。科学的学习路径能够让你取得好的学习效果同时也缩短学习时间。错误和浮躁的做法则会让你最后事倍功半

}

前面我们搭建好了相关环境和最麻烦的 caffe 环境接下来我们用 python 训练出来基于 caffe 的人脸识别 caffemodel。成功后我们再将它转化为海思开发板可以使用的 wk 文件

这里我们先整理下我们的思蕗,首先 caffemodel 文件可以转化为海思可以读取的 wk 文件但只是读取 caffemodel 文件中的网络参数,所以我们最好使用 YOLOv3 来进行人脸识别方便后续的算法修改。我设定的流程为先用 PC 端的 python 进行人脸识别的开发在 PC 端实现完整的人脸识别算法后,训练出合适的 caffemodel 文件再转为 wk 文件。在海思开发板上实現人脸识别功能

在算法的选择上,(算法原理到时再分别写一篇)

人脸识别可以使用 基于 LBPH 特征

需要了解的一些基础概念,写在这里有點冗杂分开写到另一篇文章好了,写好了附上链接

}

我要回帖

更多关于 龙虎算法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信