学习笔记初识算法(Algorithm)
Posted SAP剑客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习笔记初识算法(Algorithm)相关的知识,希望对你有一定的参考价值。
初识算法(Algorithm)
—— 主要内容来自吴晶辰老师《算法通识课》学习笔记
一、算法的本质
1、算法的概念
说起算法,你可能觉得和程序有些相似,但是程序是以计算机能够理解的编程语言编写而成的,可以在计算机上面运行,而算法是以人类能够理解的方式描述的,用于编写程序之前。
不妨先来看看来自百度的解释“算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。”
总结就是“算法是有输入、有输出的解决问题的计算步骤”。
上面这些解释,我们知道了“算法是什么”。
那么“什么是算法”呢?
举个课程中媒婆牵线搭桥的例子,如下图所示,媒婆给人介绍对象需要符合四要素:双方距离离得近不近、年龄相差大不大、爱好匹不匹配、性格合不合得来。其中最后一点性格最重要,若合得来,其他要素可以适当放宽。
这个例子中,有输入“住址、年龄、爱好、性格”,然后匹配计算,输出合适的人选。
那这是个算法嘛?
—— 不是。
就拿距离来说,多远算近,离什么地方近?若交给计算机来做,都必须明确。
这就是算法和人的核心差异:人做事情可以接受一定程度的模糊,算法对明确性有极其严苛的要求。
同一个算法,相同的输入必然可以得到相同的输出,即能不能复现。
所以,本质上来说,算法就是一套通过确定性保证解决问题的工具。
2、算法的本质
你有没有发现,去某宝搜一件商品,这个APP会一直给你推荐相关商品;去某交友网站,也会一直给你推荐你可能认识的朋友;去电视里搜索《寂静岭》,各种类型的阴森诡异的片子扑面而来。
这些看似不相关的程序,背后可能是一套算法。这就是“模型化”。
模型化就是对不同的问题,用同样的方式来看待,用同一套算法来解决。
在算法工程师眼里,这些可能都是“距离”问题,即相关性(或相关度)。模型化最大的价值,就是赋予算法超乎寻常的问题迁移能力。
3、算法的好坏
算法并没有好坏,背后都是设计者的思想。
这里举一个K临近算法的例子。
k近邻算法是一种基本分类和回归方法。即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,就把该输入实例分类到这个类中。
如上图所示,有两类不同的样本数据,分别用蓝色的小正方形和红色的小三角形表示,而图正中间的那个绿色的圆所标示的数据则是待分类的数据。这也就是我们的目的,来了一个新的数据点,我要得到它的类别是什么?好的,下面我们根据k近邻的思想来给绿色圆点进行分类。
如果K=3,绿色圆点的最邻近的3个点是2个红色小三角形和1个蓝色小正方形,少数从属于多数,基于统计的方法,判定绿色的这个待分类点属于红色的三角形一类。
如果K=5,绿色圆点的最邻近的5个邻居是2个红色三角形和3个蓝色的正方形,还是少数从属于多数,基于统计的方法,判定绿色的这个待分类点属于蓝色的正方形一类。
K临近算法认为,要预测的数据和已有的数据在分布上是类似的。
所以,不要对算法评判对错和好坏,算法的模型只是人思想的体现,如果算法出现了问题,请回到人身上找问题。
算法永远不会有完美的,只要好用就行。
二、判断算法的效率
算法效率,通过依据该算法编制的程序,在计算机上运行时所消耗的时间来度量。算法效率是一个组合概念,“算法”+“效率”。算法是一系列解决问题清晰指令,能够对一定规范的输入,在有限时间内获得所要求输出。
【评价算法效率的两个难题】
第一个难题:硬件依赖
第二个难题:“无穷大”的难题
当算法的输入规模,趋近于无穷大的时候,算法解决问题所花的时间也趋近于无穷大。
面对这两个难题,我们需要另一种度量算法效率的工具,既能比较不同算法之间的效率高低,还不需要依赖于计算机的硬件水平,这个度量工具,我们称之为“时间复杂度”。
时间复杂度是算法中某些基本操作的总数量,随着算法输入的规模增长的函数关系。
便于理解这个概念,我们举个课程中的例子。
法老让两个奴隶盖金字塔,谁的工作效率低就处死谁,奴隶A一天垒一块石头,奴隶B三天垒一块石头,显而易见,奴隶B将被无情地处死。
若增加一个条件,法老要盖一座10米高的金字塔,设计图由两个奴隶自己想办法。奴隶A画了一个图纸,需要50万块石头,奴隶B画的图纸只需要10万块石头,这下奴隶A恐怕就无法幸免了。
这里把算法比喻成盖金字塔,垒石块就是算法的“基本操作”,金字塔的高度就是“输入规模”,而图纸则是垒石块的总量,跟盖金字塔高度之间的函数关系,就是时间复杂度。
作为算法工程师,就是为了找到更好的“图纸”,找到效率更高、时间复杂度更低的算法。
【如何降低时间复杂度】
方法一:空间换时间
这里要引入一个新的概念“空间复杂度”,它也是衡量算法效率的一个标准。但实际中,我们往往会用牺牲空间复杂度的方式来降低时间复杂度,即“空间换时间”。
空间复杂度也是一种函数关系,是算法占据的空间资源,随着输入规模变大而增长的函数关系。
空间复杂度的概念就是衡量不同算法在运算的时候,需要占据空间资源的大小。
方法二:分治思想
分治思想即“分而治之”,就是把一个复杂的问题分成若干个相同或者相似的子问题,再把子问题分成更小的子问题直到最后的子问题可以简单地直接求解,原问题的解即子问题的解的合并,这个思想是很多高效算法的基础,例如排序算法(快速排序,归并排序),傅里叶变换(快速傅里叶变换)等。
三、判断算法是否巧妙
效用选择模型:近似现实且保持可解性
算法是用数学公式表达的计算方法,和现实之间有一条鸿沟。而数学模型是连接这两端的桥,桥的选址有讲究,模型的选择也是同样这个道理。
人们在做选择的时候,一般会选择能够自己带来最大满足感的选项。苹果和橘子,如果苹果能够自己带来的满足感更大,就会选择苹果。这个用学术的词来讲,就是“效用”。人们会选择对自己来说效用最大的选项。
能不能合理低近似现实,同时保持可解性,是算法工程师评价一个模型是否巧妙的重要角度。
问题规模的减小
有时候,我们即使有了明确的数学模型描述,但是仍旧面临问题规模太大的问题。规模大得计算机也没办法处理了,就需要想办法扔掉一些信息。但是怎么扔,扔哪些,就是学问了。
能减小规模的算法有很多,它们背后的思想是通过舍弃了少量信息,把一个大到不能计算的问题减小到计算机可以处理的规模。这也是算法工程师评价一个模型是否巧妙的重要角度。
探索与利用:迭代得到结果
在算法问题中,不能一蹴而就得到答案的情况有很多。这时候算法能不能通过不断迭代,最终得到解决方案,同时又能保证很高的效率,也是算法工程师评价一个模型是否巧妙的重要角度。
把上面三个角度合在一起,你会发现,巧妙的算法常常有一个特点,就是背后的思想符合人的直觉。算法工程师厉害的一个原因,就是能够把直觉的思路以一种明确的方式表达出来,转换成算法,然后攻克复杂问题。
四、计算机能否避免人的错误
算法不能做一下三件事:
- 算法不能对问题负责;
算法只是执行人给他的指令,跟你特斯拉M3说“请安全驾驶”,它根本不懂。但是你给他设置如果其他车辆以100公里的时速靠近你,车距小于5米需要减速或者避让,它就可以执行。
算法是工具,就像手里的锤子一样,能钉钉子,能盖房子,但是其不知道这样做可以解决什么问题。
所以,人可以使用算法做事。但实际问题和算法能做的事情之间是有间隙的,算法不懂间隙是什么,只有人能够处理间隙,所以算法不能对问题负责。
- 算法不能对数据负责;
算法需要有输入、输入、计算过程。虽然说算法需要定义输入和输出,但算法执行的主要是计算过程。也就是算法只能负责“算”,其他的管不了。
如果输入的数据是垃圾,算法在好也没用。
- 算法不能对解释负责;
算法只能提供解决方案,不能提供解释。这也是目前人类抉择是否相信算法的最大困境。
算法复杂程度不同,意味着算法解释性水平也不同,这时候就需要算法设计者自己权衡。不得不说,有时候为了缓解这个矛盾,算法科学家宁可放弃一定的准确性,也会去选择那些更容易被解释和接受的算法。
以上是关于学习笔记初识算法(Algorithm)的主要内容,如果未能解决你的问题,请参考以下文章
挑子学习笔记:两步聚类算法(TwoStep Cluster Algorithm)——改进的BIRCH算法