递归(动态规划)解决问题的应用方向(就是什么情况下用递归)+启发式优化算法+机器学习基础

递归主要的解决方向:解可以构成解空间树。(补:递归经常用在求解什么最大,最小等最优问题)

例如,递归最常用的分治,就是每次树增加深度时,节点一分为二(或多)。

再例如,旅行商问题,每一层的节点选择就是n!(如有四个城市可以选择时,解空间树向下节点个数就是4*3*2*1)。01背包问题,就是每一层(代表第0-N个背包)有选该背包或者不选2种状态。

当然,递归会有很多的重复计算(冗余),这时候我们就想到把计算过的状态存下来(例如放在数组中),之后再出现该状态就不用再计算了,节约了计算时间(存下来多了空间,就是以空间换时间)->这就是动态规划的意义所在。具体案例大家可以看我博客另一篇01背包动态规划详解。

解可以构成解空间树的时候,递归就是以深度遍历来看是否满足要求。(广度遍历时,用队列来实现

题做多了,套路(比如让你求什么最大值,最小值等最优问题)一般就是用递归(递推)->动态规划。有的时候不是那么容易看出解的形式,想想递推等能不能解决。



除了这两种搜索解空间树的方法(深度,广度遍历),还有启发式搜索(例如遗传算法,蚁群算法,蜂群,鱼群,粒子群,模拟退火等)等优化算法

(例如用蚁群算法解决TSP等路径规题:http://www.cnblogs.com/asxinyu/p/Path_Optimization_Tsp_Problem_Ant_System_CSharp.html)

也可以用来求解某个函数的最大(小)值(包括x在一定条件下求极值)。

扫描二维码关注公众号,回复: 1588866 查看本文章


还有方法:一般还可以用高斯牛顿法等迭代方法来迭代求上述问题的最优解(求偏导数这一步很重要,可以借助matlab的diff函数);有的还可以借助matlab中求这类问题的函数fmincon,具体参考https://www.zhihu.com/question/47963781。高斯牛顿等方法就是凸优化方法中的一种。凸优化可以解决很多求解在某些约束条件下(约束是线性的话相对简单,非线性解决复杂)最小(大)值。(凸优化:http://blog.csdn.net/baidu_26408419/article/details/78831698)



机器学习等用来分类,拟合(一般是有监督),聚类(无监督)。(当然有时候数据要降维(PCA,SVD)。还有推荐算法推荐算法最早是基于协同过滤的方法,当然后来又有很多,比如基于内容的推荐)。启发式+机器学习,我推荐一个很好的博客(原理+代码):http://blog.csdn.net/google19890102/article/details/39781573。非常非常详细!他的博客写了很多种优化算法+机器学习基础算法!

机器学习一些经典的模型以及代码,可以参考http://blog.csdn.net/google19890102/article/details/39781573这里面的一些,也可以看《python实战》里面都有。另外,opencv里面随机森林等代码也都有(用来分类或者回归)。matlab也提供了很多经典模型函数。分类,回归等机器学习,也可以用pyCaffe(或者TensorFlow)(深度学习基础的知识代码,可以搜UFLDL教程来打基础),或者XGBoost(python中有)等 学习能力强的模型来进行学习。




猜你喜欢

转载自blog.csdn.net/baidu_26408419/article/details/54447019