随机算法

Python & 机器学习之项目实践

你说的曾经没有我的故事 提交于 2020-04-03 22:01:57
机器学习是一项经验技能,经验越多越好。在项目建立的过程中,实践是掌握机器学习的最佳手段。在实践过程中,通过实际操作加深对分类和回归问题的每一个步骤的理解,达到学习机器学习的目的。 预测模型项目模板 不能只通过阅读来掌握机器学习的技能,需要进行大量的练习。本文将介绍一个通用的机器学习的项目模板,创建这个模板总共有六个步骤。通过本文将学到: 端到端地预测(分类与回归)模型的项目结构。 如何将前面学到的内容引入到项目中。 如何通过这个项目模板来得到一个高准确度的模板。 机器学习是针对数据进行自动挖掘,找出数据的内在规律,并应用这个规律来预测新数据,如图19-1所示。 图19-1 在项目中实践机器学习 端到端地解决机器学习的问题是非常重要的。可以学习机器学习的知识,可以实践机器学习的某个方面,但是只有针对某一个问题,从问题定义开始到模型部署为止,通过实践机器学习的各个方面,才能真正掌握并应用机器学习来解决实际问题。 在部署一个项目时,全程参与到项目中可以更加深入地思考如何使用模型,以及勇于尝试用机器学习解决问题的各个方面,而不仅仅是参与到自己感兴趣或擅长的方面。一个很好的实践机器学习项目的方法是,使用从 UCI机器学习仓库(http://archive.ics.uci.edu/ml/datasets.html) 获取的数据集开启一个机器学习项目。如果从一个数据集开始实践机器学习

[Z]谷歌(Google)算法面试题

旧时模样 提交于 2020-03-29 09:02:41
谷歌(Google)算法面试题 1.谷歌面试题:给定能随机生成整数 1 到 5 的函数,写出能随机生成整数 1 到 7 的函数。 回答:此题的关键是让生成的 1 到 7 的数出现概率相同。 只要我们可以从 n 个数中随机选出 1 到 n 个数,反复进行这种运算,直到剩下最后一个数 即可。 我们可以调用 n 次给定函数,生成 n 个 1 到 5 之间的随机数,选取最大数所在位置即 可满足以上要求。 例如 初始的 7 个数[1,2,3,4,5,6,7]. 7 个 1 到 5 的随机数[5,3,1,4,2,5,5] 那么我们保留下[1,6,7], 3 个 1 到 5 的随机数[2,4,1] 那么我们保留下[6] 6 就是我们这次生成的随机数。 2. 谷歌面试题:判断一个自然数是否是某个数的平方。当然不能使用开方运算。 回答: 假设待判断的数字是 N。 方法 1: 遍历从 1 到 N 的数字,求取平方并和 N 进行比较。 如果平方小于 N,则继续遍历;如果等于 N,则成功退出;如果大于 N,则失败退出。 复杂度为 O(n^0.5)。 方法 2: 使用二分查找法,对 1 到 N 之间的数字进行判断。 复杂度为 O(logn)。 方法 3: 由于 (n+1)^2 =n^2+2n+1, =... =1+(2*1+1)+(2*2+1)+...+(2*n+1) 注意到这些项构成了等差数列

机器学习算法

谁说我不能喝 提交于 2020-03-28 07:40:58
转载自: http://www.cnblogs.com/tornadomeet   朴素贝叶斯:   有以下几个地方需要注意:   1. 如果给出的特征向量长度可能不同,这是需要归一化为通长度的向量(这里以文本分类为例),比如说是句子单词的话,则长度为整个词汇量的长度,对应位置是该单词出现的次数。   2. 计算公式如下:      其中一项条件概率可以通过朴素贝叶斯条件独立展开。要注意一点就是 的计算方法,而由朴素贝叶斯的前提假设可知, = ,因此一般有两种,一种是在类别为ci的那些样本集中,找到wj出现次数的总和,然后除以该样本的总和;第二种方法是类别为ci的那些样本集中,找到wj出现次数的总和,然后除以该样本中所有特征出现次数的总和。   3. 如果 中的某一项为0,则其联合概率的乘积也可能为0,即2中公式的分子为0,为了避免这种现象出现,一般情况下会将这一项初始化为1,当然为了保证概率相等,分母应对应初始化为2(这里因为是2类,所以加2,如果是k类就需要加k,术语上叫做laplace光滑, 分母加k的原因是使之满足全概率公式)。    朴素贝叶斯的优点:   对小规模的数据表现很好,适合多分类任务,适合增量式训练。    缺点 :   对输入数据的表达形式很敏感。   决策树:   决策树中很重要的一点就是选择一个属性进行分枝,因此要注意一下信息增益的计算公式,并深入理解它

随机排列算法

╄→гoц情女王★ 提交于 2020-03-26 04:40:50
随机排列是个很常用的算法,比如洗牌。算法思想很简单,比如有一副整理好的牌,每次随机抽取一张最后就组成一副随机的牌了,并且可以证明所有可能性的排列是等概率的。但是该算法的空间复杂度是O(n),如果每次抽牌都插入到头部,则最坏情况下的时间复杂度是O(n*n)。参考Introduction to Algorithm 5.3的算法,其实对第二种方法稍作改进就可以达到O(n)。算法如下: 保持头部的以抽取队列,以及尾部的为抽取队列,一开始头为空,尾为满。 从尾部随机抽牌,与尾部第一张交换,头部加一,尾部减一 直到尾部为空 以下是javascript代码 var array = [1,2,3,4];for(var i=0,len=array.length;i<len-1;i++){ var pos = i + Math.floor((len - i)*Math.random()); var tmp = array[pos]; array[pos] = array[i]; array[i] = tmp;}alert(array.join(', ')); 来源: https://www.cnblogs.com/dragonpig/archive/2011/01/16/1936512.html

[转] [博客园] 迷宫生成算法x4

余生长醉 提交于 2020-03-25 22:44:20
简介 所谓迷宫生成算法,就是用以生成随机的迷宫的算法 迷宫生成算法是处于这样一个场景: 一个row行,col列的网格地图,一开始默认所有网格四周的墙是封闭的 要求在网格地图边缘,也就是网格的边上打通2面墙 所有网格都至少保证网格周围至少有一堵墙打通 所有网格都能通过打通的墙能形成一条通路 博主已实现RecursiveBacktracking(递归回溯),RecursiveSegmentation(递归分割),随机Prim算法,Kruskal+并查集四种迷宫生成算法,这篇文章主要对这四种算法进行简要的介绍 基于Unity的迷宫生成算法代码实现 Github链接 递归回溯算法 复杂度 空间:O(n),时间:O(n),n为迷宫节点数row*col 原理 以一个栈作为辅助的数据结构,用以记录打通区域的顺序,用以回溯 一开始随机在地图中选择一个区域,加入栈。 之后在之前选择的区域周围随机选择一个未打通的区域,将新选择的区域和之前选择区域的墙打通,并把新的区域的加入栈 如果四周的区域都打通,就让栈出栈,将当期所选择的区域设置栈新的栈顶,表示回退到上一个区域 之后递归的按之前的步骤选择下一个区域直到所有区域都被打通 缺点 这种算法实现思路极为简单,但通路过于明显,甚至有可能会出现上图中的迷宫,很尴!!! 递归分割算法 复杂度 递归空间复杂度:O(row * col),最好时间复杂度:O

详解聚类算法Kmeans的两大优化——mini-batch和Kmeans++

淺唱寂寞╮ 提交于 2020-03-25 09:36:18
本文始发于个人公众号: TechFlow ,原创不易,求个关注 今天是 机器学习专题的第13篇 文章,我们来看下Kmeans算法的优化。 在上一篇文章当中我们一起学习了Kmeans这个聚类算法,在算法的最后我们提出了一个问题:Kmeans算法虽然效果不错,但是每一次迭代都需要遍历全量的数据,一旦数据量过大,由于计算复杂度过大迭代的次数过多,会导致 收敛速度非常慢 。 想想看,如果我们是在面试当中遇到的这个问题,我们事先并不知道正解,我们应该怎么回答呢? 还是老套路,我们在回答问题之前,先来分析问题。问题是收敛速度慢,计算复杂度高。计算复杂度高的原因我们也知道了, 一个是因为样本过大,另一个是因为迭代次数过多 。所以显然,我们想要改进这个问题,应该从这两点入手。 这两点是问题的关键点,针对这两点我们其实可以想出很多种优化和改进的方法。也就是说这是一个开放性问题,相比标准答案,推导和思考问题的思路更加重要。相反,如果我们抓不住关键点,那么回答也会跑偏,这就是为什么我在面试的时候,有些候选人会回答使用分布式系统或者是增加资源加速计算,或者是换一种其他的算法的原因。 也就是说分析问题和解决问题的思路过程,比解决方法本身更加重要。 下面,我们就上面提到的两个关键点各介绍一个优化方法。 mini batch mini batch的思想非常朴素,既然全体样本当中数据量太大

【论文总结】LINE和DEEPWALK方法总结与比较

血红的双手。 提交于 2020-03-17 07:53:58
LINE(large-scale information network embedding) 研究问题: 大规模信息网络嵌入低维向量空间。 模型优点: 1、可适应任意类型的网络:有向、无向、有权、无权。 2、采用一阶相似度和二阶相似度结合 3、边采样优化方法解决了SGD的局限性(边的权值变换很大 时,学习率难以选择,并且权值和乘以梯度导致梯度爆炸) 模型描述: 1、一阶相似度的LINE模型(只用于无向图) 为了模拟一阶相似度,对于每个无向边(i,j),我们定义顶点vi和vj之间的联合概率如下: (sigmoid function,向量越接近,点积越大,联合概率越大。其中,ui表示节点vi对应的向量。) 经验概率可以定义为:(两点之间边的权值越大,经验概率越大) 为了保持一阶相似性,一个简单的办法是最小化下面的目标函数: 我们选择最小化两个概率分布的KL散度,用KL散度代替d(·,·)并省略一些常数,得到: KL散度公式: 只考虑一阶相似度的情况下,改变同一条边的方向对于最终结果没有什么影响。因此一阶相似度只能用于无向图,不能用于有向图。 2、二阶相似度的LINE模型 二阶相似度可以用于 有向图和无向图 。下面是针对有向图的算法(在无向图中,可以将每条边看成是两条方向相反且有相同权重的有向边)。   二阶相似度假设共享邻居的顶点彼此相似。每个顶点扮演两个角色

8.机器学习之聚类算法

倾然丶 夕夏残阳落幕 提交于 2020-03-14 01:43:39
分类 是在一群已经知道类别标号的样本中,训练一种分类器,让其能够对某种未知的样本进行分类,分类算法属于一种有监督的学习。分类算法的分类过程就是建立一种分类模型来描述预定的数据集或概念集,通过分析由属性描述的数据库元组来构造模型。分类的目的就是使用分类对新的数据集进行划分,其主要涉及分类规则的准确性、过拟合、矛盾划分的取舍等。 ———————————————— 聚类 是在一群未知类别标号的样本上,用某种算法将他们分成若干类别,这是一种无监督学习。给定一组数据点,我们可以用聚类算法将每个数据点分到特定的组中,理论上属于同一组的数据点应该有相似的属性和/或特征,而属于不同组的数据点应该有非常不同的属性和/或特征。所以在给定的数据集中,我们可以通过聚类算法将其分成一些不同的组。 聚类是一种将数据点按一定规则分群(分组)的机器学习技术。其主要研究数据间逻辑上或物理上的相互关系。聚类分析本身不是一个特定的算法,而是要解决的一般任务。它可以通过各种算法来实现,这些算法在理解群集的构成以及如何有效地找到它们方面存在显着差异。由聚类所组成的簇是一组数据对象的集合,这些对象与同一簇中的对象彼此类似,与其他簇中的对象相异。其分析结果不仅可以揭示数据间的内在联系与区别,还可以为进一步的数据分析与知识发现提供重要依据。 监督学习: 当我们根据一组给定的预测因子变量或自变量去预测一个目标变量时

【从0到1学算法】快速排序

谁说胖子不能爱 提交于 2020-03-12 21:34:19
系列文章导航: 【从0到1学算法】二分查找法 【从0到1学算法】大O表示法 【从0到1学算法】 数组和链表 【从0到1学算法】选择排序 【从0到1学算法】递归 今天我们将学习快速排序,是最快的排序算法之一,速度比选择排序快得多! 一、分而治之 在学习快速排序前,先上开胃菜,快速排序中用到的算法--分而治之(divide and conquer, D&C,分治法)。只能解决一种问题的算法毕竟用处有限,而D&C提供了解决问题的思路。当面对新问题束手无策时,不妨自问:使用分而治之能解决吗?来个示例:假设你是农场主,有一块土地。 你要将这块土地均匀分成方块(正方形),且分出的方块要尽可能大。显然,下面的分法都不符合要求。 使用D&C解决问题分为两个步骤: 找出基线条件,这个条件必须尽可能简单。 不断将问题分解(或者说缩小规模),直到符合基线条件。 下面就来使用D&C找出解决方案。首先,找出基线条件。最容易处理的情况是,一条边的长度是另一条的整数倍。比如下图,一边是50m,另一边是25m,那么最大方块为25mx25m。 接下来是缩小问题规模,首先找出这块地可容纳的最大方块。 划出了两块640mx640m的方块,同时余下一小块地。接下来我们将继续对余下的小块地使用相同的算法。 适用于这小块地的最大方块,也适用于整块地的最大方块(可参阅欧几里算法)。问题规模缩小了

13集成算法与随机森林

这一生的挚爱 提交于 2020-03-10 05:18:57
唐宇迪《python数据分析与机器学习实战》学习笔记 13集成算法与随机森林 竞赛题使用较多中准确率较高,三种集成算法 1.Bagging模型 (并形算法) 并行训练多棵树,结果累加取平均。随机森林构造了N棵树,最终结果把树进行分类取众数。 二重随机性:数据采样随机性(例如100个有放回选60-80个),特征随机性(寻则部分特征) feature比较原理,举例:比如ABCD四个特征,B为年龄(36、27、65…),用着四个特征建模错误率为err1;后面对B特征进行破坏加上噪音,替换为垃圾值(0.1、68…),然后继续用这四个特征建模,错误率为err2; 如果err1=err2,则B特征没啥用。如果err2>>err1,则B重要。最后特征的重要性排序如上图右下角。 其他算法的Bagging模型,例如KNN模型缺点比较明显。公认的集成算法还是是上面的树模型。 树模型的树数量对效果的影响,数量增加效果浮动。(虽然理论上数量越多泛化能力越强) 2. Boosting模型 (串形算法) 从弱学习器开始,例如实际1000,第一棵A树预测950,差异50,让这个50值越小越好;第二棵B树,为了弥补50误差,就预测残差50,可能预测为30;第三棵C树,1000-950-30=20,就预测残差20,可能预测为18.最终预测值为998,实际为1000. 典型代表:AdaBoost,Xgboost