如何发明新算法(一)

如何发明新算法(一)

算法一直是计算机科学的核心,算法改变世界,算法创造未来!这篇文章我主要从复杂化、简单化两个方面谈谈怎么样发明一个新的算法。新算法在时间复杂度,空间复杂度,预测精度等方面并不一定是最优化的,我只想起到抛砖引玉的作用,激励爱钻研,爱发明,爱算法的人员进行创新。后续我还会继续将我多年来研究的复杂化、简单化、随机化、联想化、交叉化、逆向化等其他发明方法写出来和大家交流学习。我相信,只要方法得当,积极研究,勇于试错,有朝一日您也可能发明新的算法。

一、把简单的算法复杂化

通过抽象思维方式,把原有的简单的算法想复杂一些,找到一定的规律,得到新的算法。这种方法运用非常广泛,比如:插入排序、希尔排序、快速排序、Timsort ,顺序查找、二分查找、三分查找,LeNet 、AlexNet、VGGNet等创新算法,都是推广前人简单算法得到的,下面我将举几个例子详细谈一谈。

1、排序算法

具体思路:每个排序或者交换都有一个比较值,冒泡排序比较值是“虚拟基准数”,0个;快速排序比较值是“基准数”,1个;新排序算法比较值是“两个基准数”,2个。这里看起来有点抽象,继续把下面内容看完就会明白。
a.冒泡排序: 冒泡排序(Bubble Sort)每次比较都是把大的向后交换,我们可以把它想象成,每次和相邻两个数的“平均值”进行比较。然后大的放后面,小的放前面。下图中数字3和6,可以看成是3和4.5作比较,6和4.5做比较。冒泡排序比较值是“虚拟基准数”,一般选择相邻两数的均值。
在这里插入图片描述

b.快速排序 : 快速排序(Quick Sort)是20世纪十大算法发明之一,其实它也是冒泡排序的一种推广,如下图:基本思想是选取一个基准数6,作为枢轴,经过一趟排序,将整段序列分为两个部分,其中一部分的值都小于基准数6,另一部分都大于基准数6。然后继续对这两部分继续进行排序,从而使整个序列达到有序。快速排序比较值是“基准数”,一般选择最后一个数。 在这里插入图片描述
c.新发明排序算法 : 新排序(New Sort),通过前面两个排序算法,我想把比较基准数从0个,1个变成2个,新排序算法比较值是“两个基准数”,我选择头尾两个数。如果成功排序,就可以发明新的排序算法。 如图所下图所示,我先选出35、31作为基准数,再按照小于31,31到35,大于35将数组分成(27、19、14、10、31),(33、32),(35、42、44)三部分,递归调用前面的方法就可以得到有序数组。同样道理,选择三个,四个基准数也可以进行排序,其优劣还需要进一步验证。 在这里插入图片描述

2、查找算法

简单到复杂的推广思路是:一分查找———>二分查找———>三分查找———>四分查找———
a、顺序查找: 顺序查找(Sequence Search),适用于顺序表,按照顺序从头开始查找,可以抽象的说成一分查找,在一推东西里面找。

b、二分查找: 二分查找也称折半查找(Binary Search),它是一种效率非常高效的查找方法。把数组分成2部分进行查找,可以抽象的说成,在2推东西里面找。
在这里插入图片描述

c、新发明查找算法: 新发明查找(New Search),上面两个查找算法从简单向复杂推广,可以抽象为:1堆数组里面不好找,2堆数组里面容易找,那么3堆东西里面找情况怎么样呢?每次分成3堆进行查找,新的算法就这样发明出来了,也许效率更高。
在这里插入图片描述

3、神经网络算法

感知机———>前馈神经网络———>新发明的网络,从简单的向复杂的推广。
a、感知机: 感知机(perceptron),由科学家Frank Rosenblatt受其他科学家启发后于1950至1960年代发明。感知机在人工神经网络的发展史上有着非常重要的地位,尽管它的能力非常有限,主要用于线性分类,但是它对神经网络的影响非常大,后来的神经网络算法基本上都是在此基础上进行复杂化推广发明而来的。
在这里插入图片描述

b、前馈神经网络: 前馈神经网络也成为多层感知器(Mutlti-Layer Perceptron,MLP)。属于各神经元分层排列,每个神经元只与前一层的神经元相连。接收前一层的输出,并输出给下一层,各层间没有反馈(这一性质区别于反馈神经网络)。前馈神经网络的发明就是复杂化推广法进行算法发明的最直接运用。
在这里插入图片描述
c、新发明的网络: 新网络(New Net), 向后传播的神经网络。从前面向前传播的网络很容易推广出一种能接收信号既能向前传播,又能接收自己的反馈信号的神经网络。这就是反馈神经网络,其实循环神经网络(RNN)、Hopfield网络和玻尔兹曼机都是在此原理下推广出来的。
在这里插入图片描述

二、把复杂的算法简单化

把复杂的算法简化,丢弃一部分结构,得到新的算法,这种方面方法刚好和前面的那种方法相反。

1、排序算法

冒泡排序———>选择排序———>新发明排序算法
a、冒泡排序: 冒泡排序(Bubble Sort)冒泡排序就是排序发明的基础,几乎所有新排序算法都离不开它。这次我从交换次数进行思考。从交换次数来看,冒泡排序算法挺复杂,可以通过减少交换次数来发明新算法。在这里插入图片描述

b、选择排序: 选择排序(Selection Sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,走一趟只交换一次。相对冒泡排序,其交换次数是进行了简单化。
在这里插入图片描述
c、新发明排序: 新算法(New Sort),从上面的两个排列算法来看,其目的是为了减少交换。如果相邻几个数是顺序数,我就不交换了,只需要把他们组合起来,然后再从小到大合并即可。这样就能很大程度上减少了交换次数。如下图方式可以快速实现排序。
在这里插入图片描述

2、 深度学习算法

卷积神经网络连接线太复杂,容易出现过拟合,加上dropout,丢弃一些网络连接后效果反而好一些。同样的原理我想直接丢弃一些层,于是发明出了新的算法。
a、卷积神经网络算法: 卷积神经网络(CNN),它一种特殊的深层的神经网络模型,它的特殊性体现在两个方面,一方面它的神经元的连接是非全连接的,另一方面同一层中某些神经元之间的连接的权重是共享的(即相同的)。
在这里插入图片描述
b、加dropout的卷积神经网络算法: 失活神经网络(Dropout),让连接点失活,使得复杂的网络结构简单化,相当于从原始的网络中找到一个更瘦的网络,能有效解决过拟合问题。在这里插入图片描述
c、新卷积神经网络算法: 新网络(New CNN), 通过对前面两个网络研究,启发我想到更好的简化方式,让连接层失活,减少网络层数,这种方式能否得到更鲁棒的模型呢?ResNet 就是按照这种思路推广出来的。
在这里插入图片描述

三、实现代码

这期博客我主要是通过模型、图表方式简单阐述发明新算法的方法。我自己是用C++和python把上述算法或模型实现的,后期会附上相关代码。感兴趣的朋友可以自己先根据模型、图表写一写相关代码。

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值