Java与算法之(2)

快速排序的基本思路是,每次选定数列中的一个基准数,将小于基准数的数字都放到基准数左边,大于基准数的数字都放到基准数右边。然后再分别对基准数左右的两个数列分别重复以上过程。仍以4362715为例。选定最左侧数字4为基准数,首先从右开始向左找小于4的数,找到第一个数1后停止。然后从左开始向右找到第一个大于4的数,即6。交换这两个数的位置,得到继续寻找,仍然从右边开始,从上一步找到1的位置向左寻找小于4的数,找到2停止。然后从左边找到6的位置向右找大于4的数。右移一格后,和右侧来的“探路者”相遇了,这意味着这一轮排序结束。最后把结束位置的数和基准数交换观察完成后的数列,可以看到以基准数4为分界线,左边的数全都比4小,右边的数全都比4大。接下来分别对左边的231和右边的765重复上面的排序步骤。231以2为基准数->213->123765以7为基准数->567我们例子中的数字较少,如果数列足够长,对第一次排序后得到的子数列排序,将再得到两个子数列,然后再一分为二、二分为四。。。直到以基准数拆分后两边都只剩下一个数字。首先来看递归形式的实现代码publicclassQuickS...
代码星球 代码星球·2021-02-12

Java算法之(1)

冒泡排序法的原理是,每次比较相邻的两个元素,如果它们的顺序错误就把它们交换过来。例如对4362715这7个数字进行从小到大的排序,从最左侧开始,首先比较4和3因为是从小到大排序,4和3的顺序显然是错误的,交换他们,得到接下来比较4和6顺序是正确的,不需要任何操作。接下来进行下一步,比较6和26显然应该排在2的后面,怎么办?交换它们,得到经过前面几步,已经可以总结出规律,那么接下来要做的比较依次是:7>1?得到34261757>5?得到到此,7的右边已经没有数可以比较,第一轮排队结束。经过这一轮,已经成功的把最大的数,即7放在了最后。但是前面6个数的顺序还是不对,但是按照上面的思路很容易想到,对前面6个数再来一遍,即可把6放到倒数第二的位置。然后再对前面5个数重复逐个比较的步骤。。。7个数字需要进行7-1=6次排队,每完成一轮排队,下一轮排队需要比较的数字个数减1,来看代码publicclassBubbleSort{publicvoidsort(int...numbers){//n个数执行n-1轮//每一轮后完成一个数字归位,下一轮要比较的数字个数减1(所以内层循环是j<...
代码星球 代码星球·2021-02-12

动态规划算法

 动态规划算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决。[1] 动态规划算法的基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。 编辑动态规划算法的基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。由于动态规划解决的问题多数有重叠子问题这个特点,为减少重复计算,对每一个子问题只解一次,将其不同阶段的不同状态保存在一个二维数组中。编辑能采用动态规划求解的问题的一般要具有3个性质:(1)最优化原理:如果问题的最优解所包含的子问题的解也是最优的,就称...
代码星球 代码星球·2021-02-12

深度学习剖根问底: Adam优化算法的由来

在调整模型更新权重和偏差参数的方式时,你是否考虑过哪种优化算法能使模型产生更好且更快的效果?应该用梯度下降,随机梯度下降,还是Adam方法?这篇文章介绍了不同优化算法之间的主要区别,以及如何选择最佳的优化方法。我们应该使用哪种优化器?在构建神经网络模型时,选择出最佳的优化器,以便快速收敛并正确学习,同时调整内部参数,最大程度地最小化损失函数。Adam在实际应用中效果良好,超过了其他的自适应技术。如果输入数据集比较稀疏,SGD、NAG和动量项等方法可能效果不好。因此对于稀疏数据集,应该使用某种自适应学习率的方法,且另一好处为不需要人为调整学习率,使用默认参数就可能获得最优值。如果想使训练深层网络模型快速收敛或所构建的神经网络较为复杂,则应该使用Adam或其他自适应学习速率的方法,因为这些方法的实际效果更优。希望你能通过这篇文章,很好地理解不同优化算法间的特性差异...

机器学习排序算法:RankNet to LambdaRank to LambdaMART

使用机器学习排序算法LambdaMART有一段时间了,但一直没有真正弄清楚算法中的所有细节。学习过程中细读了两篇不错的博文,推荐给大家:梯度提升树(GBDT)原理小结徐博FromRankNettoLambdaRanktoLambdaMART:AnOverview但经过一番搜寻之后发现,目前网上并没有一篇透彻讲解该算法的文章,所以希望这篇文章能够达到此目的。本文主要参考微软研究院2010年发表的文章FromRankNettoLambdaRanktoLambdaMART:AnOverview11,并结合自己的理解,试图将RankNet、LambdaRank和LambdaMART这三种算法的所有算法细节讲解透彻。RankNet、LambdaRank和LambdaMART是三个关系非常紧密的机器学习排序算法。简而言之,RankNet是最基础,基于神经网络的排序算法;而LambdaRank在RankNet的基础上修改了梯度的计算方式,也即加入了lambda梯度;LambdaMART结合了lambda梯度和MART(另称为GBDT,梯度提升树)。这三种算法在工业界中应用广泛,在BAT等国内大厂和微...

Learning to Rank算法介绍:RankNet,LambdaRank,LambdaMart

之前的博客:http://www.cnblogs.com/bentuwuying/p/6681943.html中简单介绍了LearningtoRank的基本原理,也讲到了LearningtoRank的几类常用的方法:pointwise,pairwise,listwise。前面已经介绍了pairwise方法中的RankSVM,IRSVM,和GBRank。这篇博客主要是介绍另外三种相互之间有联系的pairwise的方法:RankNet,LambdaRank,和LambdaMart。RankNet是2005年微软提出的一种pairwise的LearningtoRank算法,它从概率的角度来解决排序问题。RankNet的核心是提出了一种概率损失函数来学习RankingFunction,并应用RankingFunction对文档进行排序。这里的RankingFunction可以是任意对参数可微的模型,也就是说,该概率损失函数并不依赖于特定的机器学习模型,在论文中,RankNet是基于神经网络实现的。除此之外,GDBT等模型也可以应用于该框架。我们先定义两个概率:预测相关性概率、真实相关性概率。(...

C++ STL算法系列6---copy函数

 现在我们来看看变易算法。所谓变易算法(Mutating algorithms)就是一组能够修改容器元素数据的模板函数,可进行序列数据的复制,变换等。我们现在来看看第一个变易算法:元素复制算法copy。该算法主要用于容器之间元素的拷贝,即将迭代器区间[first,last)的元素复制到由复制目标result给定的区间[result,result+(last-first))中。下面我们来看看它的函数原型:1template<classInputIterator,classOutputIterator>2OutputIteratorcopy(3InputIterator_First,4InputIterator_Last,5OutputIterator_DestBeg6);参数_First, _Last指出被复制的元素的区间范围[_First,_Last)._DestBeg 指出复制到的目标区间起始位置返回值返回一个迭代器,指出已被复制元素区间的最后一个位置程序示例:首先我们来一个简单的示例,定义一个简单的整形数组myints,将其所有元...

使用sklearn进行K_Means聚类算法

首先附上官网说明 [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#examples-using-sklearn-cluster-kmeans]再附上一篇翻译文档 http://blog.csdn.net/xiaoyi_zhang/article/details/52269242再给一个百度上找的例子(侵权删):#-*-coding:utf-8-*-fromsklearn.clusterimportKMeansfromsklearn.externalsimportjoblibimportnumpyfinal=open('c:/test/final.dat','r')data=[line.strip().split('')forlineinfinal]feature=[[float(x)forxinrow[3:]]forrowindata]#调用kmeans类clf=KMeans(n_clusters=9)s=clf.fit(feature)prints#9个中心...

机器学习sklearn19.0聚类算法——Kmeans算法

一、关于聚类及相似度、距离的知识点 二、k-means算法思想与流程三、sklearn中对于kmeans算法的参数四、代码示例以及应用的知识点简介(1)make_blobs:聚类数据生成器 sklearn.datasets.make_blobs(n_samples=100,n_features=2,centers=3,cluster_std=1.0,center_box=(-10.0,10.0),shuffle=True,random_state=None)[source] 返回值为:(2)np.vstack方法作用——堆叠数组详细介绍参照博客链接:http://blog.csdn.net/csdn15698845876/article/details/73380803  [python] viewplain copy #!/usr/bin/env python  # -*- coding:utf-8 -*-  # A...

机器学习算法

计算机程序,是指为了得到某种结果而可以由计算机(等具有信息处理能力的装置)执行的代码化指令序列(或者可以被自动转换成代码化指令序列的符号化指令序列或者符号化语句序列)。通俗讲,计算机给人干活,但它不是人,甚至不如狗懂人的需要(《小羊肖恩》里的狗是多么聪明可爱又忠诚于主人)。那怎么让它干活呢,那就需要程序员用某种编程语言来写程序,编程语言就是计算机能理解的语言,计算机可以执行这些程序(指令),最终完成任务。下边的C++程序是完成n的阶乘:intn=std::atoi(argv[1]);//求n的阶乘doubleresult=1.0;for(inti=2;i<=n;i++){result*=i;}std::cout<<n<<"的阶乘是:"<<result<<std::endl;算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或者多个操作。举个简单的例子,并且大家生活中都能用得上的。现在做个小游戏,A在纸上随机写了一个1到100间的整数,B去猜,猜对的话游戏结束,猜错的话A会告诉B猜的小了还是大了。那...
代码星球 代码星球·2021-02-12

机器学习(二)--- 分类算法详解

感觉狼厂有些把机器学习和数据挖掘神话了,机器学习、数据挖掘的能力其实是有边界的。机器学习、数据挖掘永远是给大公司的业务锦上添花的东西,它可以帮助公司赚更多的钱,却不能帮助公司在与其他公司的竞争中取得领先优势,所以小公司招聘数据挖掘/机器学习不是为了装逼就是在自寻死路。可是相比Java和C++语言开发来说,机器学习/数据挖掘确实是新一些老人占的坑少一些,而且可以经常接触一些新的东西。还是赶紧再次抓住机会集中的再总结一下吧,不能再拖拖拉拉了。 其实数据挖掘的主要任务是分类、聚类、关联分析、预测、时序模式和偏差分析。本文先系统的介绍一下机器学习中的分类算法,主要目录如下: 常用分类算法Bayes朴素贝叶斯的优缺点朴素贝叶斯的公式DecisionTree决策树的优缺点决策树公式SVM支持向量机的优缺点支持向量机的公式KNNK近邻的优缺点K近邻的公式LogisticRegression逻辑回归的优缺点逻辑回归的公式逻辑回归的问题神经网络神经网络的优缺点神经网络公式深度学习EnsemblelearningGBDTAdaboostRandomForest参考文献 贝叶斯...

机器学习系列------1. GBDT算法的原理

GBDT算法是一种监督学习算法。监督学习算法需要解决如下两个问题:1.损失函数尽可能的小,这样使得目标函数能够尽可能的符合样本2.正则化函数对训练结果进行惩罚,避免过拟合,这样在预测的时候才能够准确。GBDT算法需要最终学习到损失函数尽可能小并且有效的防止过拟合。以样本随时间变化对某件事情发生的变化为例,如下几副图形象的说明了机器学习的作用。假设随着时间的变化对K话题存在如下样本:如果没有有效的正则化,则学习结果会如下图所示:这种情况下,学习结果跟样本非常符合,损失函数也非常小,但是这种样本在预测的时候,由于过拟合,失败率会很高。如果损失函数太大,则学习结果如下图所示: 这种情况,学习结果跟样本差别太大,损失函数也很大,在预测的时候由于误差跳大,失败率也会很高。损失函数和正则化防止过拟合平衡后的学习结果如下图所示:在这种情况下损失函数和正则化函数防止过拟合达到了一个平衡,预测会比较准。 GBDT算法训练结果是一个决策森林。GBDT算法在训练的时候迭代N次,森林里面就会包含N棵树,每棵树都包含若干个叶子,每个叶子对应某个特定的分数。GBDT决策森林的学习的最终结果是1...

机器学习中的算法(1)-决策树模型组合之随机森林与GBDT

版权声明:   本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com,本文可以被全部的转载或者部分使用,但请注明出处,如果有问题,请联系wheeleast@gmail.com。也可以加我的微博: @leftnoteasy 前言:   决策树这种算法有着很多良好的特性,比如说训练时间复杂度较低,预测的过程比较快速,模型容易展示(容易将得到的决策树做成图片展示出来)等。但是同时,单决策树又有一些不好的地方,比如说容易over-fitting,虽然有一些方法,如剪枝可以减少这种情况,但是还是不够的。   模型组合(比如说有Boosting,Bagging等)与决策树相关的算法比较多,这些算法最终的结果是生成N(可能会有几百棵以上)棵树,这样可以大大的减少单决策树带来的毛病,有点类似于三个臭皮匠等于一个诸葛亮的做法,虽然这几百棵决策树中的每一棵都很简单(相对于C4.5这种单决策树来说),但是他们组合起来确是很强大。  &nb...

机器学习中的算法——决策树模型组合之随机森林与GBDT

前言:决策树这种算法有着很多良好的特性,比如说训练时间复杂度较低,预测的过程比较快速,模型容易展示(容易将得到的决策树做成图片展示出来)等。但是同时,单决策树又有一些不好的地方,比如说容易over-fitting,虽然有一些方法,如剪枝可以减少这种情况,但是还是不够的。美国金融银行业的大数据算法:随机森林模型+综合模型模型组合(比如说有Boosting,Bagging等)与决策树相关的算法比较多,这些算法最终的结果是生成N(可能会有几百棵以上)棵树,这样可以大大的减少单决策树带来的毛病,有点类似于三个臭皮匠等于一个诸葛亮的做法,虽然这几百棵决策树中的每一棵都很简单(相对于C4.5这种单决策树来说),但是他们组合起来确是很强大。在最近几年的paper上,如iccv这种重量级的会议,iccv09年的里面有不少的文章都是与Boosting与随机森林相关的。模型组合+决策树相关的算法有两种比较基本的形式–随机森林与GBDT((GradientBoostDecisionTree),其他的比较新的模型组合+决策树算法都是来自这两种算法的延伸。本文主要侧重于GBDT,对于随机森林只是大概提提,因为...

Java垃圾收集算法

  相关阅读:  1、深入理解java虚拟机之java内存区域  2、深入理解java虚拟机之对象真的死了吗   标记清除算法分为“标记”和“清除”两个阶段,首先先标记出那些对象需要被回收,在标记完成后会对这些被标记了的对象进行回收;如下图:  这种算法的优点在于不需要对对象进行移动操作,仅对不存活的对象进行操作,所以在对象存活率较高的情况下效率非常高,但是从上图模拟的结果来看对象被回收后,可用的内存并不是连续的,而是断断续续,造成大量的内存碎片。存储对象时要求内存空间时连续的,所以虚拟机在给新的内存较大的对象分配空间时,有可能找不到足够大的连续的空闲的空间来存放,从而引发一次垃圾回收动作,实际上里面是有大量的空闲空间的,只是不连续而已。  复制算法是将内存分为两块大小一样的区域,每次是使用其中的一块。当这块内存块用完了,就将这块内存中还存活的对象复制到另一块内存中,然后清空这块内存。这种算法在对象存活率较低的场景下效率很高,比如说新生代,只对整块内存区域的一半进行垃圾回收,在垃圾回收的过程也不会出现内存碎片的情况,不需要移动对象,只需要移动指针即可,实现简单,所以运行效率很...
代码星球 代码星球·2021-02-12
首页上一页...7891011...下一页尾页