随机算法

分类算法-决策树、随机森林

≡放荡痞女 提交于 2019-12-03 11:02:48
分类算法之决策树 决策树是一种基本的分类方法,当然也可以用于回归。我们一般只讨论用于分类的决策树。决策树模型呈树形结构。在分类问题中,表示基于特征对实例进行分类的过程,它可以认为是if-then规则的集合。在决策树的结构中,每一个实例都被一条路径或者一条规则所覆盖。通常决策树学习包括三个步骤:特征选择、决策树的生成和决策树的修剪 优点: 计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理逻辑回归等不能解决的非线性特征数据 缺点: 可能产生过度匹配问题 适用数据类型: 数值型和标称型 特征选择 特征选择在于选取对训练数据具有分类能力的特征。这样可以提高决策树学习的效率,如果利用一个特征进行分类的结果与随机分类的结果没有很大差别,则称这个特征是没有分类能力的。经验上扔掉这样的特征对决策树学习的京都影响不大。通常特征选择的准则是信息增益,这是个数学概念。通过一个例子来了解特征选择的过程。 我们希望通过所给的训练数据学习一个贷款申请的决策树,用以对文莱的贷款申请进行分类,即当新的客户提出贷款申请是,根据申请人的特征利用决策树决定是否批准贷款申请。特征选择其实是决定用那个特征来划分特征空间。下图中分别是按照年龄,还有是否有工作来划分得到不同的子节点 问题是究竟选择哪个特征更好些呢?那么直观上,如果一个特征具有更好的分类能力,是的各个自己在当前的条件下有最好的分类

图推荐-基于随机游走的personrank算法

六月ゝ 毕业季﹏ 提交于 2019-12-03 04:10:24
转自 http://blog.csdn.net/sinat_33741547/article/details/53002524 一 基本概念 基于图的模型是推荐系统中相当重要的一种方法,以下内容的基本思想是将用户行为数据表示为一系列的二元组,每一个二元组(u,i)代表用户u对物品i产生过行为,这样便可以将这个数据集表示为一个二分图。 假设我们有以下的数据集,只考虑用户喜不喜欢该物品而不考虑用户对物品的喜欢程度, 其中用户user=[A,B,C],物品item=[a,b,c],用户和物品有以下的关系: 上述便是一个典型的二分图,我们用G(V,E)来表示,其中V为用户user和物品item组成的顶点集即[A,B,C,a,b,c],而E则代表每一个二元组(u,i)之间对应的边e(u,i),我们这里不考虑用户对物品的喜爱程度,即默认喜爱则e=1,不喜爱则e=0。 那么我们如何使用上述的二分图模型进行物品的推荐呢?根据用户与物品的相关性,对于相关性高的顶点有如下的定义: (1)两个顶点之间有很多路径相连 (2)连接两个顶点之间的路径长度都比较短 (3)连接两个顶点之间的路径不会经过度比较大的顶点 上面有一个概念需要理解,度,顶点的度是指和该顶点相关联的边数。 基于上述的定义,我们这里使用基于随机游走的PersonalRank 算法 来计算,那么这个算法是什么意思呢? 在解释之前

RRT路径规划算法概述

匿名 (未验证) 提交于 2019-12-03 00:39:02
本文主要记录本人之前调研过在三维复杂环境下的路径规划算法。 (Rapidly-exploring Random TreesRRT)Steven M. LaValle1998 RRT RRT RRT是一种通过随机构建空间填充树来有效搜索非凸,高维空间的算法。树是从搜索空间中随机抽取的样本逐步构建的,并且本质上倾向于朝向大部分未探测区域生长。由于它可以轻松处理障碍物和差分约束(非完整和动力学)的问题,并被广泛应用于自主机器人 运动规划 。 RRT也可以被看作是一种为具有状态约束的非线性系统生成开环轨迹的技术。一个RRT也可以被认为是一个 蒙特卡罗 方法。用来将搜索偏向一个配置空间中图形的最大 Voronoi区域 。一些变化甚至可以被认为是随机分形。 改进的RRT算法: 基于概率P的RRT; RRT_Connect’ RRT*; Parallel-RRT; Real-time RRT; Dynamic domain RRT; 基于RRT的运动规划算法综述 介绍: 在过去的十多年中, 机器人的运动规划问题已经收到了大量的关注,因为机器人开始成为现代工业和日常生活的重要组成部分。最早的运动规划的问题只是考虑如何移动一架钢琴从一个房间到另一个房间而没有碰撞任何物体。早期的算法则关注研究一个最完备的运动规划算法(完备性指如果存在这么一条规划的路径,那么算法一定能够在有限时间找到它)

随机森林算法

匿名 (未验证) 提交于 2019-12-03 00:22:01
1.每棵树的按照如下规则生成   1)如果训练集大小为N,对于每棵树而言,随机且有放回地从训练集中的抽取N个训练样本(这种采样方式称为bootstrap sample方法),作为该树的训练集;   从这里我们可以知道:每棵树的训练集都是不同的,而且里面包含重复的训练样本(理解这点很重要)。    为什么要随机抽样训练集?(add @2016.05.28)   如果不进行随机抽样,每棵树的训练集都一样,那么最终训练出的树分类结果也是完全一样的,这样的话完全没有bagging的必要;    为什么要有放回地抽样? (add @2016.05.28)   我理解的是这样的:如果不是有放回的抽样,那么每棵树的训练样本都是不同的,都是没有交集的,这样每棵树都是"有偏的",都是绝对"片面的"(当然这样说可能不对),也就是说每棵树训练出来都是有很大的差异的;而随机森林最后分类取决于多棵树(弱分类器)的投票表决,这种表决应该是"求同",因此使用完全不同的训练集来训练每棵树这样对最终分类结果是没有帮助的,这样无异于是"盲人摸象"。   2)如果每个样本的特征维度为M,指定一个常数m<<M,随机地从M个特征中选取m个特征子集,每次树进行分裂时,从这m个特征中选择最优的;   3)每棵树都尽最大程度的生长,并且没有剪枝过程。   一开始我们提到的随机森林中的“随机”就是指的这里的两个随机性

[机器学习]集成学习--bagging、boosting、stacking

匿名 (未验证) 提交于 2019-12-03 00:19:01
集成学习简介 集成学习(ensemble learning)通过构建并结合多个学习器来完成学习任务。 如何产生“好而不同”的个体学习器,是集成学习研究的核心。 集成学习的思路是通过合并多个模型来提升机器学习性能,这种方法相较于当个单个模型通常能够获得更好的预测结果。这也是集成学习在众多高水平的比赛如奈飞比赛,KDD和Kaggle,被首先推荐使用的原因。 一般来说集成学习可以分为三大类: 用于减少方差的bagging 用于减少偏差的boosting 用于提升预测结果的stacking 集成学习方法也可以归为如下两大类: 串行集成方法,这种方法串行地生成基础模型(如AdaBoost)。串行集成的基本动机是利用基础模型之间的依赖。通过给错分样本一个较大的权重来提升性能。 并行集成方法,这种方法并行地生成基础模型(如Random Forest)。并行集成的基本动机是利用基础模型的独立性,因为通过平均能够较大地降低误差。 大部分集成模型都通过一个基础学习算法来生成一个同质的基础学习器,即同类型的学习器,也叫同质集成。 有同质集成就有异质集成,为了集成后的结果表现最好,异质基础学习器需要尽可能准确并且差异性够大。 Bagging Bagging是引导聚合的意思。减少一个估计方差的一种方式就是对多个估计进行平均。例如,我们可以用训练集的不同子集(随机选择并替代??

随机梯度下降

匿名 (未验证) 提交于 2019-12-02 22:56:40
梯度下降算法其实也很好理解,以简单的二元函数为例,如果我们想找到二元函数的极值,一般第一步我们是对该二元函数求导,然后令其为0,找出此时自变量的值,将该自变量代入函数式,即可求出该函数的极值。 随机梯度下降算法是为了解决深度学习中多元目标函数的最优值问题,已经有很多该算法的变种算法。 那么在深度学习中,针对实际问题,我们首先需要建立一个模型,然后确定一个目标函数。目标函数通常是网络输出值和目标之间的误差,误差的形式有很多种,例如常见的有平方差、交叉熵等等。 训练模型的目的是使得目标函数达到极小值。对于一个深度神经网络,它的参数数目比较庞大,因此目标函数通常是一个包含很多参量的非线性函数。对于这个非线性函数,我们采用的是随机梯度下降算法来对参数进行更新。具体步骤如下: (1)对网络参数进行初始化,一般情况下,权重初始化为均值是0,方差为0.01的高斯分布随机值,而偏置统一初始化为0; (2)将参数代入网络计算前馈输出值,从而可以根据已有的目标标签得出目标函数值; (3)根据目标函数值以及各参数与目标函数所构成的树结构,运用后向传播算法计算出每个参数的梯度; (4)设置学习率大小(随着迭代的步骤增多,学习率通常要逐渐减小,这样可以有效避免训练中出现误差震荡情况),进行参数更新,最一般的更新方式是 新参数=旧参数-学习率×梯度; (5)重复进行第2~4步,直到网络收敛为止。

机器学习:集成学习

限于喜欢 提交于 2019-12-02 05:29:58
集成学习 基本概念 集成学习(Ensemble Learning)的 思想 是将若干个学习器(分类|回归)组合之后产生一个新的学习器, 如何产生“好而不同”的个体学习器,是集成学习研究的核心 ; 一般性用于集成的学习器都为 弱学习器 ,即学习器的预测精度不需要太高但是应该好于随机预测的结果; 集成学习 算法的成功 在于保证了弱分类器的多样性(Diversity),即学习器之间具有 差异性 弱分类器间存在一定的差异性,会导致分类的边界不同,即会存在错误;但当多个弱分类器合并后,就可以得到更加合理的边界,能减少错误率,实现更好的效果; 对于数据集过大/过小,可以进行划分/有放回抽样的操作产生不同的数据子集,然后使用数据子集训练不同的学习器,最后合并成一个大的学习器 若数据划分边界过于复杂,使用线性模式很难描述,可以训练多个模型,后将模型进行合并; 对于多个异构的特征集的时候,很难进行融合,那么可以考虑每个数据集构建一个学习器模型,然后将多个模型融合 常见的集成算法有: Bagging Boosting Stacking 按照集成方式划分: 串行集成方法:通过串行的方法生成基础模型(如AdaBoost);串行集成的 基本动机 是利用基础模型之间的依赖,给被错分的样本一个较大的权重来提升性能; 并行集成方法:并行的生成基础模型(若Random Forest);并行集成的 基本动机

结对编程

非 Y 不嫁゛ 提交于 2019-12-01 14:05:04
作者:蒋权 陈庆生 一,Github地址: https://github.com/Cercis-chinensis/PTESSM 二,PSP2.1表格 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 150 120 · Estimate · 估计这个任务需要多少时间 150 120 Development 开发 1680 2280 · Analysis · 需求分析 (包括学习新技术) 60 60 · Design Spec · 生成设计文档 150 250 · Design Review · 设计复审 (和同事审核设计文档) 30 130 · Coding Standard · 代码规范 (为目前的开发制定合适的规范) 20 30 · Design · 具体设计 120 150 · Coding · 具体编码 1200 1500 · Code Review · 代码复审 60 80 · Test · 测试(自我测试,修改代码,提交修改) 40 80 Reporting 报告 90 120 · Test Report · 测试报告 50 80 · Size Measurement · 计算工作量 20 20 · Postmortem & Process Improvement Plan ·

结对编程—四则运算

吃可爱长大的小学妹 提交于 2019-12-01 14:04:22
作者:蒋权 陈庆生 一,Github地址: https://github.com/Cercis-chinensis/PTESSM 二,PSP2.1表格 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 150 120 · Estimate · 估计这个任务需要多少时间 150 120 Development 开发 1680 2280 · Analysis · 需求分析 (包括学习新技术) 60 60 · Design Spec · 生成设计文档 150 250 · Design Review · 设计复审 (和同事审核设计文档) 30 130 · Coding Standard · 代码规范 (为目前的开发制定合适的规范) 20 30 · Design · 具体设计 120 150 · Coding · 具体编码 1200 1500 · Code Review · 代码复审 60 80 · Test · 测试(自我测试,修改代码,提交修改) 40 80 Reporting 报告 90 120 · Test Report · 测试报告 50 80 · Size Measurement · 计算工作量 20 20 · Postmortem & Process Improvement Plan ·

随机选择算法-来自 胡凡 曾磊的《算法笔记》

折月煮酒 提交于 2019-11-30 07:53:29
#include <cstdio> #include <cstdlib> #include <ctime> #include <algorithm> #include <math.h> using namespace std; const int maxn = 100010; int A[maxn], n; int randPartition(int A[], int left, int right){ int p = (round(1.0*rand()/RAND_MAX*(right - left) + left)); swap(A[p],A[left]); int temp = A[left]; while(left < right){ while(left<right&&A[right]>temp) right--; A[left] = A[right]; while(left<right&&A[left]<=temp) left++; A[right] = A[left]; } A[left] = temp; return left; } //随机选择算法 void randSelect(int A[], int left, int right, int K){ if(left==right) return; int p = randPartition(A,left