算法

你没听过的梅森旋转算法

戏子无情 提交于 2020-01-24 20:13:50
(标准开头) 如果单独提梅森旋转算法可能大家都很陌生,但如果说到C++11的random可能大家就都熟悉多了。事实上,C++,python等多种计算机语言的随机数都是通过梅森旋转算法产生的。(也有一个称呼是梅森缠绕算法) 那,本文就着重介绍这个梅森 螺旋 旋转算法 (算法本身挺学术的,我努力写得轻松点) 先在这里感谢一下@ dgklr 大佬的引导。如果没有他提及,笔者可能还不知道这个算法。 旋转算法简介 梅森旋转算法,也可以写作MT19937。是有由松本真和西村拓士在1997年开发的一种能快速产生优质随机数的算法。 其实这个算法跟梅森没有什么关系,它之所以叫做是梅森旋转算法是因为它的循环节是2^19937-1,这个叫做梅森素数。 如果看过我的那篇随机数的文章应该知道关于伪随机的一些知识。这个随机算法之所以说是产生“优质“”随机数,特点就是它的循环节特别长。而且产生的数分布是比较平均的。 可能有的同学对这个循环节有点质疑。可能觉得2^19937-1有点短? 我在这里大概给一个概念: 银河系中的恒星数量级10^11 撒哈拉沙漠中的沙子数数量级是10^26 宇宙中目前可观察的粒子数量级是10^87 2^19937数量级是10^6001 这个比较大概心里有数了吧 相差的已经不止是一个数量级了 同时他在623维中的分布都十分的均匀(这个不用理解) 知道分布平均就好了 (梅森镇楼) -

浅谈欧洲算法——模拟退火

↘锁芯ラ 提交于 2020-01-24 20:13:26
初听说退火这个名词感觉就很(zhuang)帅(A__CDEFG...) 直到学了退火之后,我才发现: 退火不只是帅,而且非常万能 甚至比 D (大) F (法) S (师)还要万能 简直就是骗(de)分神器啊 简介 作为一个计算机算法,它竟然在百度上有物理词条! 当时我看了就懵了,你说计算机一个算法,跟冶炼金属有什么关系啊? 后来我看了算法的词条... 是不是更懵了... 方便大家理解( 变得更懵 ),我搬了百度上的定义: Simulate Anneal Arithmetic (SAA,模拟退火算法) 根据Metropolis准则,粒子在温度T时趋于平衡的概率为e-ΔE/(kT),其中e为温度T时 的内能,ΔE为其改变量,k为Boltzmann常数。用固体退火模拟组合优化问题,将内能E模拟为目标函数值f,温度T演化成控制参数t,即得到解组合优化问题的模拟退火算法:由初始解i和控制参数初值t开始,对当前解重复“产生新解→计算目标函数差→接受或舍弃”的迭代,并逐步衰减t值,算法终止时的当前解即为所得近似最优解,这是基于蒙特卡罗迭代求解法的一种启发式随机搜索过程。退火过程由冷却进度表(Cooling Schedule)控制,包括控制参数的初值t及其衰减因子Δt、每个t值时的迭代次数L和停止条件S。 (懒的话不看也罢,本来就是拿来凑字数的) 说实话看完还是挺清楚(?)的,总计一下就是:

知识点二十:分治算法

我们两清 提交于 2020-01-24 17:47:34
前言 MapReduce 是 Google 大数据处理的三驾马车之一,另外两个是 GFS 和 Bigtable。MapReduce在倒排索引、PageRank 计算、网页分析等搜索引擎相关的技术中都有大量的应用。尽管开发一个 MapReduce 看起来很高深,感觉跟我们遥不可及。实际上,万变不离其宗,它的本质就是 分治算法 。 如何理解分治算法? 分治算法(divide and conquer)的核心思想其实就四个字: 分而治之 ,也就是 将原问题划分成 n 个规模较小,并且结构与原问题相似的子问题,递归地解决这些子问题,然后再合并其结果,就得到原问题的解 。这个定义看起来有点类似递归的定义。关于分治和递归的区别,我们只要记住一点, 分治算法是一种处理问题的思想,而递归是一种编程技巧 。实际上,分治算法一般都比较适合用递归来实现。分治算法的递归实现中,每一层递归都会涉及这样三个操作: 分解:将原问题分解成一系列子问题; 解决:递归地求解各个子问题,若子问题足够小,则直接求解; 合并:将子问题的结果合并成原问题。 分治算法能解决的问题,一般需要满足下面这几个条件: 原问题与分解成的小问题具有相同的模式; 原问题分解成的子问题可以独立求解, 子问题之间没有相关性 ,这一点是分治算法跟动态规划的明显区别; 具有分解终止条件,也就是说,当问题足够小时,可以直接求解;

【算法应用】异常检测:百度是这样做的

杀马特。学长 韩版系。学妹 提交于 2020-01-24 17:16:14
自动异常检测旨在发现复杂业务指标(请求量、收入等)的异常波动,是智能监控系统中的重要环节。百度的业务种类繁多,各业务的监控需求迥异,参数配置成本繁重,给异常检测带来了巨大的挑战。本文整理了运小博在 2017CNUTCon 全球运维技术大会上分享的《百度大规模时序指标自动异常检测实战》和在 CCF TF“人工智能时代的互联网运维”主题研讨会中分享的《百度智能运维实践之异常检测》的内容。主要介绍百度运维部 IOP 团队开发的自动异常检测系统及其核心技术能力,并重点讨论了大规模时序异常检测参数配置成本高的问题。演讲展示了三种常用异常检测算法及其适用场景,并基于此讨论了算法的自主选择策略,以及每种算法的参数自动配置方法。 异常检测需要监控的业务繁多,覆盖了搜索、广告、地图、糯米等百度大部分的产品业务。及时发现这些业务请求数、拒绝数、响应时间、流水和订单等数据的异常波动,是业务稳定性的重要保证。这些数据不但数量众多,而且不同业务的曲线也有截然不同的特征。从上图的三幅曲线图可以看出: 第一幅曲线图中有蓝、绿两根曲线,分别代表当前时刻数据和上周同一时刻的数据。蓝色曲线几乎完全覆盖了绿色曲线,说明数据有规整的周期特性。 第二幅曲线图中,紫色曲线是当前时刻数据,蓝色曲线是上一周的数据。可以看出:数据有一定的周期性,但又不如第一幅图那么规整。 第三幅曲线图中的数据大致平稳,在某些时段出现了异常上涨。

sklearn算法库的顶层设计

匆匆过客 提交于 2020-01-24 16:18:39
sklearn监督学习的各个模块 neighbors近邻算法,svm支持向量机,kernal_ridge核岭回归,discriminant_analysis判别分析,linear_model广义线性模型 ensemble集成方法,tree决策树,native_bayes朴素贝叶斯,cross_decomposition交叉分解,gaussian_process高斯过程 neural_network多层神经网络,calibration概率校准,isotonk保序回归,feature_selection监督特征选择,multiclass多类多标签算法 sklearn无监督学习模块 decomposition矩阵因子分解,cluster聚类分析,manifold流形学习,mixture高斯混合模型 neural_network无监督神经网络,density密度估计,covariance协方差估计 sklearn数据变换模型 feature_extraction特征抽取,feature_selection 特征选择,preprocessing数据预处理 random_projection随机投影,kernel_approximation核逼近,pipline管道流 下面是一个sklearn的基本的类的内容,任何一个sklearn中实现的算法都会使用下边的一个或多个类 下面以svm为例

GC垃圾回收(四个算法)

不羁岁月 提交于 2020-01-24 14:57:37
GC垃圾回收的地方: 堆+方法区 GC是什么: 分代垃圾回收算法 频繁收集新生代 较少收集老年代 基本不动元空间 JVM在进行GC时,并非每次都对上面三个内存区域一起回收的,大部分时候回收的都是指新生代。 因此GC按照回收的区域又分了两种类型,一种是普通GC(minor GC),一种是全局GC(major GC or Full GC) Minor GC和Full GC的区别 普通GC(minor GC): 只针对新生代区域的GC,指发生在新生代的垃圾收集动作,因为大多数Java对象存活率都不高,所以Minor GC非常频繁,一般回收速度也比较快。 全局GC(major GC or Full GC) :指发生在老年代的垃圾收集动作,出现了Major GC,经常会伴随至少一次的Minor GC(但并不是绝对的)。Major GC的速度一般要比Minor GC慢上10倍以上 四种GC垃圾回收算法 1.标记回收算法(已经不使用了): 2.复制算法(使用在新生代): HotSpot JVM把年轻代分为了三部分:1个Eden区和2个Survivor区(分别叫from和to)。默认比例为8:1:1,一般情况下,新创建的对象都会被分配到Eden区(一些大对象特殊处理),这些对象经过第一次Minor GC后,如果仍然存活,将会被移到Survivor区。对象在Survivor区中每熬过一次Minor

分词中常用算法比较与设想

陌路散爱 提交于 2020-01-24 14:40:28
与基于理解的分词算法和基于统计的分词算法相比,基于文本匹配的算法更加通用。基于文本匹配的算法又称之为“机械分词算法”,他是它是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行配,若在词典中找到某个字符串,则匹配成功,可识别出一个词。按照扫描方向的不同,文本匹配分词方法可以分为正向匹配和逆向匹配两种;按照不同长度优先匹配的情况,可以分为最大(最长)匹配和最小(最短)匹配;按照是否与词性标注过程相结合,又可以分为单纯分词方法和分词与标注相结合的一体化方法。 常用的几种机械分词方法如下: 1) 正向最大匹配法(由左到右的方向) 2) 逆向最大匹配法(由右到左的方向) 3) 最少切分(使每一句中切出的词数最小)。 其他的还有将上述各种方法相互组合形成的分词算法,例如,可以将正向最大匹配方法和逆向最大匹配方法结合起来构成双向匹配法。由于汉语单字成词的特点,正向最小匹配和逆向最小匹配一般很少使用。本文中着重讨论正向最大匹配法和逆向最大匹配法。 由于机械分词算法的准确性取决于算法的准确性与词库完备性两个方面。在本文中设想词库充分大,包含需要的词语。 一般说来,逆向匹配的切分精度略高于正向匹配,遇到的歧义现象也较少。统计结果表明,单纯使用正向最大匹配的错误率为1/169,单纯使用逆向最大匹配的错误率为1/245。但这种精度还远远不能满足实际的需要。实际使用的分词系统

处理器调度算法

陌路散爱 提交于 2020-01-24 13:53:33
1. P117页,练习15:最高响应比 HRRF最高响应比优先算法 2. P119页,练习22(2):时间片轮转 进程P1运行完成时,P2和P3到达就绪队列 进程P2运行完成时,P3,P1,P4依次到达就绪队列 进程P3运行完成时,P1,P4,P2依次到达就绪队列 3. 现设定采用三级反馈队列调度算法,三个队列分别为0、1和2,对应时间片为2、4、8。现有四个进程A、B、C、D,到达时刻分别为0、5、7、12,执行时间分别为7、4、13、2。请写出整个进程调度过程,包括每个时间段,执行的进程,执行后进程状态,各个队列内进程的变化。 4. 从以下几个方面比较各个调度算法的优缺点: 1.资源利用率 2.吞吐率 3.周转率 4.响应时间 5.公平性 6.适用范围 (1)先来先服务调度算法:先来先服务调度算法是一种非抢占式的算法,先进入就绪队列的进程,先分配处理机运行。一旦一个进程占有了处理机,它就一直运行下去,直到该进程完成工作或者因为等待某事件发生而不能继续运行时才释放处理机。 (2)最短作业优先算法:最短作业优先算法这是对FCFS算法的改进,其目标是减少平均周转时间。对预计执行时间短的作业(进程)优先分派处理机。通常后来的短作业不抢先正在执行的作业。 (3)最短剩余时间优先算法:这是一个剥夺式调度算法。此算法的资源利用率和吞吐率较高,周转率较快,响应时间较短,也是一个不是很公平的算法

排序算法-插入排序

巧了我就是萌 提交于 2020-01-24 12:46:49
一、插入排序(InsertSort) 插入排序从第二个数开始,拿出第二个数进行向前插入排序,一直到最后一个数向前做插入排序。算法稳定。 插入排序的时间复杂度为O(n^2),空间复杂度为O(1)。最好的时间复杂度是O(n),最坏也就是平均是O(n^2) 二、图解 对于一串数字(3,5,2,1,4,10)进行插入从小到大排序,如下图演示 三、算法分析 /** * 插入排序 * 1、确定插入排序的数,从第二个开始选择 * 2、选择插入排序的数,保存为num * 3、计算num前一个数的索引 * 4、进行检查,如果num小于前面的数,则将前一个数往后移,若比前一个数大,则结束此次循环 * 5、结束时的位置保存num * @param arr */ public static void insertSort(int[] arr) { for (int i = 1; i < arr.length; i++) { //选择插入排序的数,保存为num int num = arr[i]; //计算num前一个数的索引 int preIndex = i - 1; for (; preIndex >= 0; preIndex--) { //进行检查,如果num小于前面的数,则将前一个数往后移,若比前一个数大,则结束此次循环 if (num < arr[preIndex]) arr[preIndex +

机器学习算法评价指标之group auc(gauc)

时光怂恿深爱的人放手 提交于 2020-01-24 08:41:20
在机器学习算法中,很多情况我们都是把auc当成最常用的一个评价指标,而auc反映整体样本间的排序能力,但是有时候auc这个指标可能并不能完全说明问题,有可能auc并不能真正反映模型的好坏,以CTR预估算法(推荐算法一般把这个作为一个很重要的指标)为例,把用户点击的样本当作正样本,没有点击的样本当作负样本,把这个任务当成一个二分类进行处理,最后模型输出的是样本是否被点击的概率。  举个很简单的例子,假如有两个用户,分别是甲和乙,一共有5个样本,其中+表示正样本,-表示负样本,我们把5个样本按照模型A预测的score从小到大排序,得到 甲-,甲+,乙-,甲+,乙+. 那么实际的auc应该是 (1+2+2)/(32)=0.833, 那假如有另一个模型B,把这5个样本根据score从小到大排序后,得到 甲-,甲+,甲+,乙-,乙+, 那么该模型预测的auc是(1+1+2)/(32)=0.667.  那么根据auc的表现来看,模型A的表现优于模型B,但是从实际情况来看,对于用户甲,模型B把其所有的负样本的打分都比正样本低,故,对于用户甲,模型B的auc是1, 同理对于用户乙,模型B的auc也应该是1,同样,对于用户甲和乙,模型A的auc也是1,所以从实际情况来看,模型B的效果和模型A应该是一样好的,这和实际的auc的结果矛盾。  可能auc这个指标失真了,因为用户广告之间的排序是个性化的