《数据科学家养成手册》第十一章------算法学1(穷举,分治,回溯,贪心,迭代)

1.对于计算机学科的人员,无论是怎么样子的工作都是需要了解算法的-----从而获得解决日常问题的基本的思路

2.计算机底层的数理计算逻辑仍然是“与”“或”“非”。通过与或非的操作可以实现加法和减法操作,其他的任何的操作都是在加法和减法的基础上进行的。(也就是加法和减法的操作是“基”数学中的概念)

3.而计算机在我们的实际的使用汇总往往觉得它特别的神奇(我之前就是这么认为的)但是计算机是非常的蠢笨的,它没有思考的能力,每一个指令都要人去告诉他,然后他就只有遵守的份。按照日常的生活来说“没有眼力见”

4.昨天了解了一下RISC(精简指令集)和CISC(复杂指令集)。也就是在计算机中有各种各样的被事先设计好的指令集,在使用的时候通过一些代码,然后对计算机下达指令,使得其执行指令集中的命令,从而完成操作。

11.1 离散的世界

1.电子计算机使用的寄存器,内存单元,磁介质存储单元,半导体截止存储单元都有一个共同分特性-----每个基本单元只有导通(1)和截止(0)这两个状态。计算机的存储就是通过各个晶体管的开闭也即是0,1代码实现数据的存储和运算的。

2.实数稠密性原理:任意两个不相等的实数之间都有无限个实数

3.离散数学中的笛卡尔积(Cartesian Product)---就是离散的面积、体积

假设有一个集合X,有n个元素{x1,x2,x3…….xn},另外有一个集合Y有m个元素{y1,y2,y3…….ym}

则X x Y=

《数据科学家养成手册》第十一章------算法学1(穷举,分治,回溯,贪心,迭代)_第1张图片

11.2 成本的度量----

就是说通求解一个问题,如果这个解是一个离散的结果的话,就通常是计算机所擅长额。为而不同的算法怎么样得到这样的结果,以及结果是数目n的什么函数,就成为了评测算法优劣的标准-----------像算法的时间复杂度

11.3穷举法---暴力破解

并不是说穷举法就是不好,它也是人类正常思维解决办法的一种。对于一些硬件条件极其过硬的条件下,穷举法依靠计算机的运行速度,有的时候会有更快的结果。

使用穷举法的“N皇后问题

代码

import sys
number = int(sys.argv[1])
def coflict(state, nextX):
    nextY = len(state)
    for i in range(nextY):
        if abs(state[i]-nextX) in (0, naxtY-i):
            return True
        return False

def queens(num ,state=()):
    for pos in range(num):
        if not coflict(state ,pos):
            if len(state) == num-1:
                yield (pos, )
            else:
                for result in queens (num ,state+(pos, )):
                    yield (pos, )+result

def prettyprint(solution):
    def line(pos, length = len(solution)):
        return '. ' * (pos) + 'X' + '. ' *(length-pos-1)
    for pos in solution:
        print line(pos)


if __name__ == "__main__":
    i = 0
    for solution in queens(8):
        i+=1
        print 'total test:' +str(pow(number,number)) +';total solution:' +str(i) + '\n'
        prettyprint(solution)

但是在编译的时候会出现“invialid syntax”代码汇标记了红色。意思是说语法错误,但是自己检查了半天没有看出所以然、

《数据科学家养成手册》第十一章------算法学1(穷举,分治,回溯,贪心,迭代)_第2张图片

得出的结论

(1)时间复杂度的增加和实际运算时间的增加是不成正比的

具体的消耗时间需要实际的测量得到

(2)如果可能,计量测出这个极限的位置

也就是说在合理的时间成本范围内尽量测出最后不在下降的单次试探时间。

但是这样做的意义是啥??

11.4 分治法---化繁为简

就是人类解决为题的思维中的将大问题一步步的拆解成小问题,然后组合。

比如我们使用的查找最大值,就是将一个目前最大的记录下来,然后在与后续的比较,记录大的值,直到结束。

而在大型的Hadoop集群中,可以在几百甚至几千个节点中分别查找,每个节点查找到本节点的最大值,然后找出这些最大值。

《数据科学家养成手册》第十一章------算法学1(穷举,分治,回溯,贪心,迭代)_第3张图片

但是分治法使用的问题必须是可分的,不能彼此之间存在强烈的依赖。也就是说分治法适用于高内聚,低耦合

11.5回溯法----能省则省

(1)它是一种选优搜索方法。又称试探法或“剪枝法”(走不通的可以不选择,先排除)

(2)回溯法的核心思想:按选优条件向前搜索,以达到目标。当搜索到某一步时,发现原先的原则不优或达不到目标,就退回一部重新选择。这种走不通就退回再走的方法称为回溯法

11.6 贪心法---局部最优

贪心法的思想就是:每一步向前试探的时候都找到当前额“最优解”,其他的解(分支)一概不看--在有限的视野寻找最优解作为行动纲领。经典算法中的地杰斯特拉算法就是其中的一个。

11.7迭代法----步步逼近

核心思想:用步步比肩的方式来接近理论上的精确值,只要发现当前的试探值已经收敛到一个满足场景悠悠球的误差精度,就可以判断迭代结束,并将这个试探值作为求解的目标值。

这种方法可以是很多无法直接求解的问题得到一个足够精确的近似解。

有限成本的次优,取代无限成本的最优

(1)牛顿法

资源:优化算法——牛顿法(Newton Method) - CSDN博客

https://blog.csdn.net/google19890102/article/details/41087931

但是牛顿法是建立在函数可求导的基础之上的。现实生活中的很多的求解问题是没有具体的模型的,更谈不上求导了

《数据科学家养成手册》第十一章------算法学1(穷举,分治,回溯,贪心,迭代)_第4张图片

(2)梯度下降法

资源:

梯度下降(Gradient Descent)小结 - 刘建平Pinard - 博客园

https://www.cnblogs.com/pinard/p/5970503.html

梯度下降法就是根据导数(函数的增长,或下降的趋势)在依据自己是求解最大值,还是求解最小值,然后使得数值的获取向一方倾侧。

凸函数:在一维定义域是上满足 ;   f(ax1+bx2)<= af(x1)+bf(x2)

在一个问题的求解过程中若是能讲一个问题转化为一个凸函数上求极值的问题,也是一种策略

(3)遗传算法

多峰问题

一文读懂遗传算法工作原理(附Python实现)_搜狐科技_搜狐网

http://www.sohu.com/a/162408469_465975

遗传算法是启发式算法的一种:因为在这种几乎没有确切方向的绣花场景中,需要计算机来进行一定的“智能选择”。

你可能感兴趣的:(书目)