精华内容
下载资源
问答
  • 1 引 言  DSP(digital signal processor)是一种独特微处理器,是以数字信号来处理大量信息... DSP以其强大数据处理能力高速数字信号处理方面得到广泛的应用。TMS320VC5402(以下简称C5402)是TI公司TMS32
  • 平面变压器因为特殊平面结构和绕组紧密耦合,使得高频寄生参数得到了很大降低,极大地改进了开关电源的工作表现,因此近些年得到广泛的应用。本文研究了几种不同平面结构和绕组制作方式,并且谈到了...
  • ease软件建筑声学、建筑扩声设计广泛的应用。我们应用ease对扬子江药业大型会议厅工程进行了三维仿真计算。 EASE是the Enhanced Acoustic Simulator for Engineers缩写,意为增强工程师声学模拟软件。...
  • 面向对象编程,继承是功能强大特性之一,通过继承,派生类可以继承基类特性,可重用基类 代码。本章讨论公有继承,这种继承模拟了is-a关系,即派生对象是基对象特例。例如,物理学家是科 学家特例。...
  • 面向对象编程,继承是功能强大特性之一,通过继承,派生类可以继承基类特性,可重用基类 代码。本章讨论公有继承,这种继承模拟了is-a关系,即派生对象是基对象特例。例如,物理学家是科 学家特例。...
  • 面向对象编程,继承是功能强大特性之一,通过继承,派生类可以继承基类特性,可重用基类 代码。本章讨论公有继承,这种继承模拟了is-a关系,即派生对象是基对象特例。例如,物理学家是科 学家特例。...
  • 随着全球各国日益注重节能减排要求, LED作为新光源以其高效节能越来越得到广泛的应用。下面主要介绍关于小功率段1-30W之间LED驱动应用非隔离技术方面介绍。  一 阻容降压:  1. 阻容降压原理和应用: ...
  • 七年级教学工作计划篇一 一、指导思想 当今人类社会已经进入21世纪,以计算机、网络和通信技术为核心现代信息技术社会各个领域都得到广泛的应用,并逐渐改变着人们学习、工作和生活方式。信息获取、传输...
  • LVS(Linux Virtual Server)即Linux虚拟服务器,是一个高性能...从Linux 2.4开始,LVS代码已经进入了官方内核,并得到广泛的应用在实际应用场景下,LVS常常与Keepalived搭配工作,实现高可用、高性能、可...

    LVS(Linux Virtual Server)即Linux虚拟服务器,是一个高性能的服务器集群系统,主要被用来做负载均衡的工作。它是由章文嵩博士于98年在国防科技大学读博的时候创建的开源项目,是中国国内最早出现的开源软件项目之一。从Linux 2.4开始,LVS的代码已经进入了官方内核中,并得到了广泛的应用。

    在实际应用场景下,LVS常常与Keepalived搭配工作,实现高可用、高性能、可伸缩、可管理的服务器集群。本文是Keepalived与VRRP协议的续篇,主要介绍LVS的核心概念及一般用法。

    LVS主要由内核模块IPVSKTCPVS与对应的管理程序ipvsadmtcpvsadm组成。IPVS(IP Virtual Server)负责IP负载均衡,即四层网络的交换。KTCPVS(Kernel TCP Virtual Server)是基于内容的负载均衡,即七层网络的交换。

    IPVS的工作原理为:当SYN报文到达时,它就选择后边的一台服务器,将报文转发过去,在此之后的所有包含相同IP和TCP报文头地址的数据包都会被转到之前选择的服务器上,这个网络级别的转发效率最高。

    因为在TCP握手之前,IPVS已经完成了转发的工作,所以它无法感知请求的内容。因此LVS又提供了KTCPVS模块,它可以根据请求的内容来选择合适的服务器,主要应用在WEB服务器的高级负载均衡场景下,比如动态内容与静态内容分离,将相同内容分发到同一服务器以提高缓存命中率等。

    IPVSKTCPVS都是跑在内核空间里的,节省了内核空间与用户空间之间的内存拷贝与上下文切换的损耗,所以它的性能一般要比其他负载均衡软件如HAProxy高。

    在我手边的Linux发行版中,Debian(Linux jessie 3.16.0-4-amd64)与CentOS(3.10.0-693.el7.x86_64)的内核都有ip_vs模块,需要手动开启。ArchLinux(4.13.11-1-ARCH)的内核中没有该模块,需要自行编译安装,Linux当前最新的官方4.14内核中也能找到ip_vs模块。

    不论是官方还是非官方,都很难找到关于KTCPVS的资料,而且根据现有的资料推测,KTCPVS可能并不稳定,也没有真实的应用案例,所以本文着重介绍IPVS

    转发方式

    IPVS支持三种转发方式:

    • VS/NAT(Virtual Server via Network Address Translation):通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器;真实服务器的响应报文通过调度器时,报文的源地址被重写,再返回给客户,完成整个负载调度过程。
    • VS/TUN(Virtual Server via IP Tunneling):调度器把请求报文通过IP隧道转发至真实服务器,而真实服务器将响应直接返回给客户。
    • VS/DR(Virtual Server via Direct Routing):通过改写请求报文的MAC地址,将请求发送到真实服务器,而真实服务器将响应直接返回给客户。

    采用VS/NAT技术时,由于请求和响应报文都必须经过调度器地址重写,因此它的伸缩能力有限,当服务器结点数目升到20时,调度器本身有可能成为系统的新瓶颈。但是可以与DNS负载均衡协同工作,进一步增加集群的规模。

    而使用VS/TUNVS/DR时,调度器只处理请求报文,真实服务器的响应是直接返回给客户端的,因此可以极大的提高转发的性能,由于一般网络服务应答比请求报文大许多,使用VS/TUNVS/DR时,最大吞吐量可以提高10倍,可以调度上百台服务器,本身不会成为系统的瓶颈。

    VS/DRVS/TUN的性能要稍好一些,它没有IP隧道的开销,对集群中的真实服务器也没有必须支持IP隧道协议的要求,但是要求调度器与真实服务器都有一块网卡连在同一物理网段上,且服务器网络设备(或者设备别名)不作ARP响应。

    调度算法

    IPVS支持十种负载均衡调度算法:

    • 轮叫(Round Robin):以轮叫的方式依次将请求调度到不同的服务器,会略过权值是0的服务器。
    • 加权轮叫(Weighted Round Robin):按权值的高低和轮叫方式分配请求到各服务器。服务器的缺省权值为1。假设服务器A的权值为1,B的权值为2,则表示服务器B的处理性能是A的两倍。例如,有三个服务器A、B和C分别有权值4、3和2,则在一个调度周期内(mod sum(W(Si)))调度序列为AABABCABC。
    • 最少链接(Least Connections):把新的连接请求分配到当前连接数最小的服务器。
    • 加权最少链接(Weighted Least Connections):调度新连接时尽可能使服务器的已建立连接数和其权值成比例,算法的实现是比较连接数与加权值的乘积,因为除法所需的CPU周期比乘法多,且在Linux内核中不允许浮点除法。
    • 基于局部性的最少链接(Locality-Based Least Connections):主要用于Cache集群系统,将相同目标IP地址的请求调度到同一台服务器,来提高各台服务器的访问局部性和主存Cache命中率。LBLC调度算法先根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于其一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。
    • 带复制的基于局部性最少链接(Locality-Based Least Connections with Replication):主要用于Cache集群系统,它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射。LBLCR算法先根据请求的目标IP地址找出该目标IP地址对应的服务器组;按“最小连接”原则从该服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载;则按“最小连接”原则从整个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。
    • 目标地址散列(Destination Hashing):通过一个散列(Hash)函数将一个目标IP地址映射到一台服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。使用素数乘法Hash函数:(dest_ip* 2654435761UL) & HASH_TAB_MASK
    • 源地址散列(Source Hashing):根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
    • 最短期望延迟(Shortest Expected Delay Scheduling):将请求调度到有最短期望延迟的服务器。最短期望延迟的计算公式为(连接数 + 1) / 加权值。
    • 最少队列调度(Never Queue Scheduling):如果有服务器的连接数是0,直接调度到该服务器,否则使用上边的SEDS算法进行调度。

    LVS允许运行时动态的增减负载均衡池中的服务器及调整其权值,所以可以自行通过软件实现一些动态反馈负载均衡算法,如根据服务器网络流量、CPU、内存、磁盘IO等资源的使用情况综合调整权重(Redhat Piranha提供了类似功能)。现在很多应框架也提供了友好的监控接口,如Spring Boot Actuator,JMX等,让自行实现动态反馈负载均衡更加简单。从性能方面考虑,官方建议权值调整时间间隔应该在5到20秒之间。

    性能

    IPVS需要记住每一个头地址对应的连接,其内部是使用一个哈希表来保存这个对应关系的,每一条记录需要128字节的存储空间,内存占用的计算公式为:连接数 x 128 x (往返时延 + 连接空闲时间) [bytes]。只要带宽与CPU计算能力允许,假设每个连接时延1秒,1G内存可以支持8M的并发。

    在实际应用情境中,LVS常常与Keepalived搭配,做MySQL集群读写分离的负载均衡与故障时的主备切换,下边是一组常用的负载均衡软件对三台MySQL服务器做代理的对比评测:

    blb_bench.png

    图一:MySQL负载均衡TPS比较

    blb_avg.png

    图二:MySQL负载均衡平均TPS比较

    可以看到,在评测中使用VS/DR模式的IPVS的性能与直接连接几乎没有差别,而其他的负载均衡软件都要慢40%左右。MySQL应用是典型的请求数据包小于应答数据包的情况,使用VS/DR可以极大的改善性能,另外IPVS运行在内核空间在性能上也更有优势。

    使用ipvsadm管理集群

    ipvsadmIPVS的命令行管理工具,下边使用一个实验来演示ipvsadm的基本用法,实验使用VirtualBoxVagrant,实验脚本可以在https://github.com/sean-liang/labs/tree/master/lvs-dr-nginx下载。

    在开始之前先介绍几个概念:

    • Director Server(DS):负责负载均衡调度的LVS服务器
    • Real Server(RS):负载均衡池中真实工作的服务器
    • Director Server IP(DIP):DS的IP地址
    • Real Server IP(RIP):RS的IP地址
    • Virtual Server IP(VIP):虚拟服务器的IP地址,在VS/DR模式下,DSRS除了有自己的IP,同时还需要配置相同的VIP

    下边是实验环境的拓扑结构:

    topo.png

    图三:实验环境的拓扑结构图

    实验环境中,因为客户端与DSRS在同一个物理网网段中,所以会有ARP问题。因为DSRS都有相同的VIP,当客户端需要访问VIP地址时,RS有可能先于DSARP解析进行抢答,这样客户端就会直接与RS交互,DS就起不到负载均衡的作用了。所以要在RS的相应网络接口上禁用ARP功能,详细配置方法见对应路径下的bootstrap.sh文件。

    下载测试环境后,首先在directorrealserver1realserver2目录下分别运行vagrant up命令,启动服务器,当看到director的终端下出现LVS集群状态时,再启动client

    在客户端运行命令watch -n 1 curl 192.168.33.50,每秒发送一次http请求,因为LVS配置的是轮叫调度算法,所以可以看到客户端交替输出realserver1realserver2的网页内容,此时在director的命令行下输入sudo ipvsadm -l --stats,可以看到下边的输出:

    1
    2
    3
    4
    5
    6
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
    -> RemoteAddress:Port
    TCP 192.168.33.50:http 38 228 0 15086 0
    -> 192.168.33.20:http 19 114 0 7543 0
    -> 192.168.33.30:http 19 114 0 7543 0

    从输出可以看到,两个RS的负载是平均分配的,而且OutPkts与OutBytes一列都是0,说明使用VS/DR模式做转发,只有进入的数据包,返回的数据包由RS直接发给客户端,并不经过DS

    如果需要维护一个运行中的服务器,可以使用命令ipvsadm -e -t 192.168.33.50:80 -r 192.168.33.30 -w 0将其权值设置为0,这样LVS就不会再向它转发请求,当维护结束后,将其权值还原即可。

    可以使用命令ipvsadm -d -t 192.168.33.50:80 -r 192.168.33.30在运行时将一个RS从集群中删除,使用命令ipvsadm -a -t 192.168.33.50:80 -r 192.168.33.30可以将新机器加入集群。

    不论是将权值置0还是移出集群,LVS都会立即停止转发新请求到该RS,但会等待现有的连接全部断开或者超时。

    ipvsadm-saveipvsadm-restore也比较常用,可以保存与恢复LVS的配置。

    另外,LVS还提供了主备DS之间的状态同步功能,即将所有连接的状态同步到备份DS上边,这样在故障切换的时候可以更加平顺。根据文档介绍,这个功能还在实验阶段,其实现是主DS不停的广播连接状态给所有备份DS,所以在负载大的情况下,会在一定程度上影响转发的性能。要使用该功能,可以在主DS上运行ipvsadm --start-daemon=master --mcast-interface=eth0,在备份DS上运行ipvsadm --start-daemon=backup --mcast-interface=eth0

    参考

    展开全文
  • 主要包括线性方程组数值解法、非线性方程数值解法、矩阵特征值及特征向量计算、插值法与最小二乘法曲线拟合、数值微积分、常微分方程数值解法,有利于工程技术人员在实际中方便快捷地应用,也可在数值分析...
  • 我能能够理解,正交基具有很多优点(信息不冗余,对偶基是本身),实际应用中也是最广泛的,可惜的是在实际工作中,发现并得到一组好的正交基往往是不容易的。 正式正交基,或者更广泛地说,分解对研究

    1.前言

    信号分解或信号变换的基本思路是将信号x(t)和一组函数(或向量)做內积,从而得到一组分解系数an
    分解(或变换)的目的是研究原始信号中有哪些有哟用的信息,并讨论如何抽取这些有用的信息。我能能够理解,正交基具有很多优点(信息不冗余,对偶基是本身),实际应用中也是最广泛的,可惜的是,在实际工作中,发现并得到一组好的正交基往往是不容易的。
    正式正交基,或者更广泛地说,分解对研究信号具有很重要的意义,我们不仅反问自:
    1.用于分解的一组函数如何构成拍一组正交基?
    2.用于分解的一组函数如何构成一组基呢?
    3.如果不能构成一组基,既是线性相关的,那么在什么条件下可保证对信号的分解是完备的,并且可以稳定地实现信号的重建?
    标价理论要解决的恰恰是最后一个问题。

    2.基本定义

    2.1 标架

    是Hilbert空间H中的一组向量,对任一信号x∈H,如果存在常数A、B,c<A≤B<∞。并使下式成立:

    称构成一个标架。显然,标架是Hilbert空间中的一组向量

    2.2 对偶标架

    是Hilbert空间中的一个标架,定义标架算子S为:  

    下面的结论可以证明:
    • 也是一个标架,标架的边界为 ,它称为对偶标架
    • Hilbert空间的任一信号x都可表示为形式:
    • 如果A=B,则称构成了一个“紧(tight)标架”。这时满足:

    2.3 紧标架

    如果构成一紧标架,且A=1,则是一正交基。
    根据基函数及对偶函数关于原始信号重建原则,有下式:

    这里需要注意的是,双正交情况下满足关系:
    通过上式,即可证明正交变换必为紧标架。基向量具备线性相关时,标架在Hibert空间依然能够做到信号分解,并满足“完备性”,当然信息冗余无法避免。
    展开全文
  • Android应用开发揭秘--详细书签版

    热门讨论 2012-12-12 13:27:46
    开发、android游戏引擎设计、android应用优化、opengl等高级知识,重要的是还全面介绍了如何利用原生的c/c++(ndk)和python、lua等脚本语言(android scripting environment) 来开发android应用;本书实战性强...
  • 后面是IDE设备类型和硬件参数,TYPE用来说明硬盘设备类型,我们可以选择AUTO、USER、NONE的工作模式,AUTO是由系统自己检测硬盘类型,系统存储了1-45类硬盘参数,使用该设置值时不必再设置其它参数;...
  • 什么是VLAN

    2013-10-23 09:59:12
    同一个VLAN中的工作站,不论它们实际与哪个交换机连接,它们之间通讯就好象独立交换机上一样。同一个VLAN中的广播只有VLAN中的成员才能听到,而不会传输到其他VLAN去,这样可以很好控制不必要广播...
  • 操作系统Ximu以及TCP/IP协议实现书中都有介绍,并且应用到了商业产品。 译者: 蒋慧 蒋慧,女,1973年2月出生。1995年毕业于南京通信工程学院计算机系,获计算机应用专业工学学土学位。1998年于南京...
  • 导读:实际工程由于PID 控制多重应用型优点(如,结构简单、调整方便、稳定性好、工作可靠等),因此它还是应用最广泛的调节器控制规律,或是基于基本PID 控制各种改进型PID 控制。  1. PID 控制系统原理及...
  • 下面是一些XML metadata在实际应用中的用途: 1.可以验证数字签名,使在线商务提交动作(submission)有效。 2.可以被方便建立索引和进行更有效搜索。 3.可以在不同语言之间传输数据。 W3C组织正在研究一种...
  • 其中,应用最广泛,也是最早出现推荐算法包括协同过滤算法,但是该算法还存在着许多不足之处.该算法主要考虑用户评分数据,未能结合项目进行考虑,同时选取当前用户最近邻用户时,通常统一规定了近邻用户数目,没有...
  • 刮板输送机由于结构强度高,运输能力大,既可弯曲,又便于推移,煤矿生产中得到广泛的应用。中部槽是刮板输送机主要部件,也是容易出问题部件,主要失效形式是摩擦失效。结合多年的实际工作经验提出了24点磨损,并...
  • 特别应当指出的是已经使用国外GIS软件的用户,有相当一部分用户并不满意,计划今后的投资采用国产软件。  产品发展的同时,国内一批以GIS软件和应用为主要方向的企业发展起来,出现了像深圳雅都信息...
  • 目前,CLR各种环境中都得到广泛应用,例如,性能和可伸缩性上有着极高要求大型服务器程序,以及日常使用桌面程序等。随着CLR日益普及,基于CLR来开发软件人们同样面临着越来越多挑战,因为他们...
  • 只要准确理解一个系统的业务逻辑之后才可能开发出适应其应用的应用系统来,并且系统之间模块的科学划分与结构组织都是正确理解实际应用的业务逻辑需求的前提下完成的。 此外、利用SQL 2005建立好关系数据库...
  • 可以说人们日常生活,除了工作,学习,玩一款自己喜欢游戏正在成为一种时尚。所以,开发一款大家都比较喜欢,高品质休闲游戏,将会收到人们普遍欢迎。让人们在工作学习之余,享受游戏快乐,也是一款...
  • 本文以构造新特征提取算法为主要研究方向,并结合实际应用来验证算法优劣,对于算法中部分参数选择讨论不足,这将以后研究工作中予以关注。 还原 【Abstract】 ATR is one of the most significant ...
  • 只要准确理解一个系统的业务逻辑之后才可能开发出适应其应用的应用系统来,并且系统之间模块的科学划分与结构组织都是正确理解实际应用的业务逻辑需求的前提下完成的。 此外,利用oracle建立好关系数据库和...
  • 只要准确理解一个系统的业务逻辑之后才可能开发出适应其应用的应用系统来,并且系统之间模块的科学划分与结构组织都是正确理解实际应用的业务逻辑需求的前提下完成的。 此外、利用SQL 2000建立好关系数据库...
  • Protel DXP 是第一套完整板卡级设计系统,真正实现单个应用程序中的 集成。设计从一开始目的就是为了支持整个设计过程,Protel DXP 让你可以 选择适当设计途径来按你想要方式工作。Protel DXP PCB 线路...
  • 机器学习之决策树

    2017-05-31 16:43:00
    决策树是数据挖掘中一种基本分类与回归方法,与其他算法相比,决策树原理浅显易懂,计算复杂度较小,而且输出结果易于理解,因此在实际工作中有着广泛的应用 基本算法 决策树分类算法流程如下: 初始化根...

    背景

    决策树是数据挖掘中一种最基本的分类与回归方法,与其他算法相比,决策树的原理浅显易懂,计算复杂度较小,而且输出结果易于理解,因此在实际工作中有着广泛的应用

    基本算法

    决策树分类算法的流程如下:

    1. 初始化根结点,此时所有的观测样本均属于根结点
    2. 根据下文中介绍的划分选择,选择当前最优的划分属性。根据属性取值的不同对观测样本进行分割
    3. 对分割后得到的节点重复使用步骤2,直到
      • 分割得到的观测样本属于同一类
      • 属性用完或者达到预先设定的条件,如树的深度。以叶子节点中大多数样本的类别作为该叶子节点的类别

    划分选择

    从上述算法可以看出,决策树学习的关键是步骤2,即如何选择最优划分属性。一般而言,随着划分的不断进行,我们希望决策树的分支节点所包含的样本尽可能的属于同一个类别。即节点的纯度越高。于是特征选择问题就转化为了纯度的定义问题。目前有3种常见的决策树算法

    • ID3
    • C4.5
    • CART

    ID3与信息增益

    信息熵是度量样本集合纯度最常用的一种指标。假定当前样本集合D中第k类样本所占的比例为\(p_k\) \((k = 1, 2, 3, ...,|y|)\),则D的信息熵定义为
    \[Ent(D) = - \sum_{k=1}^{|y|}p_k\log_{2}p_k\]

    • 信息熵越大,说明这个节点的纯度越低;当节点的类别均匀分布时,信息熵为1;当只包含一类时,信息熵为0

    信息增益

    信息增益的定义是分类前的节点信息熵减去分类后子节点熵的加权和。即不纯度的减少量,也即纯度的增加量。特征选择的规则是选择使该节点信息增益最大的属性分割该节点
    假定离散属性a有v个可能的取值\((a_1,a_2,a_3,...,a_V)\),若使用a来对样本集进行划分,则会产生V个分支节点。其中第V个分支节点包含了样本集合D中在属性a上取值为\(a_V\)的样本\(D^V\)。我们可以根据信息熵的公式计算信息熵。考虑到不同分支节点包含的样本数不同,样本数越多的分支节点权重越大,给分支节点赋予权重\(\frac{D^v}{D}\)。可以计算出以属性a做为划分属性,最后得到的信息增益如下:
    \[Gain(D,a) = Ent(D) - \sum_{v=1}^{V}\frac{D^v}{D}Ent(D^v)\]
    我们来举个例子说明一下
    假设我们的数据集如下

    no age income student credit_rating buys_computer
    1 <=30 high no fair no
    2 <=30 high no excellent no
    3 [30,40) high no fair yes
    4 >40 medium no fair yes
    5 >40 low yes fair yes
    6 >40 low yes excellent no
    7 [30,40) low yes excellent yes
    8 <=30 medium no fair no
    9 <=30 low yes fair yes
    10 >40 medium yes fair yes
    11 <=30 medium yes excellent yes
    12 [30,40) high yes fair yes
    13 [30,40) medium no excellent yes
    14 >40 medium no excellent no
    • 特征x包括age, income, student, credit_rating, y变量buys_computer

    我们根据信息增益来确定下一步要选择的划分特征

    • 划分前的信息增益
      共有9个正例,5个负例
      \[Ent(D) = -\frac{1}{14}\log_2\frac{9}{14} - \frac{5}{14}\log_2\frac{5}{14}=0.940\]

    • 按照age划分
      使用p表示正例的个数,n表示负例的个数,E(p,n)表示熵
      age共有3个取值

      • <=30的正例2个,负例3个,信息熵为E(2,3)=0.971
      • [31,40)的正例4个,负例0个,信息熵为E(4,0)=0
      • 40的正例3个,负例2个,信息熵为E(3,2)=0.971

    \[\begin{eqnarray*} Gain(age) & = & Ent(D) - \frac{5}{14}*E(2,3) + \frac{4}{14}*E([4,0)) + \frac{5}{14}*E(3,2) \\ & = & 0.940 - \frac{5}{14}*0.971 + \frac{4}{14}*0 + \frac{5}{14}*0.971 \\ & = & 0.246 \end{eqnarray*}\]

    • 按照其他的属性分割
      • Gain(income) = 0.029
      • Gain(student) = 0.151
      • Gain(credit_rating) = 0.048

    可以看出在当前选择age做为划分属性信息增益最大,所以我们的第一个属性选择age

    C4.5

    在上面的分析中,我们有意漏掉了no属性,它表示每个样本的编号。如果使用no做为划分属性,得到的信息增益为0.940,远大于其他候选划分属性。这很好理解,使用no将产生14个分支节点,每个分支节点仅包含一个样本。这些分支节点的纯度已达到最大,但是很显然这样的决策树不具有泛化能力。信息增益存在的问题是倾向于选择包含多取值的参数。为了避免这个问题,著名的C4.5算法不直接使用信息增益,而是使用增益率。增益率定义为:
    \[Gain\_ratio(D,a) = \frac{Gain(D,a)}{IV(a)}\]
    \[IV(a) = -\sum_{v=1}^{V}\frac{|D^v|}{|D|}\log_2\frac{|D^v|}{|D|}\]
    \(IV(a)\)的定义可以看出,当a的取值只有一个时,取值为0;当a的取值有多个,且每个取值的观测数完全一样时,取值最大。a的取值数目越多,则IV(a)的值越大。增益率准则对可取值数目较少的属性有所偏好。为了克服这个问题,C4.5算法采用了一个启发式的算法:先从候选划分属性中找出信息增益高于平均水平的属性。再从中选择增益率最高的

    CART

    CART决策树使用基尼指数来选择划分属性,基尼值的定义如下:

    \[\begin{eqnarray*} Gini(D) & = & \sum_{K=1}^{|y|}\sum_{{k}'\neq k}p_kp_{k'} \\ & = & 1 - \sum_{K=1}^{|y|}{p_k}^2 \end{eqnarray*}\]

    直观来说,Gini(D)反映了从数据集D中随机抽取两个样本,其类别标记不一致的概率,因此Gini(D)越小,则数据集D纯度越高。基尼值在节点取值分布均匀时取最大值1-1/V,在只包含一个类别时取最小值0.
    属性a的基尼指数定义为
    \[Gini\_index(D,a) = \sum_{v=1}^{V}\frac{|D_v|}{|D|}Gini(D^v)\]
    于是,我们在候选属性集合A中,选择那个使得划分后基尼指数最小的属性作为最优划分属性
    \[a_* = \arg\min_{a\in A}Gini\_index(D,a)\]

    剪枝

    在决策树学习中为了尽可能的正确分类训练样本,节点划分过程将不断重复,有时会造成决策树分支过多,这时就可能因训练样本学的太好了,导致泛化能力较低。为了解决这个问题,有两种解决办法:预剪枝,后剪枝

    预剪枝

    常用的有三种方法

    1. 预先设定一个树的最大深度,如果分裂后树的深度达到阈值,则停止分裂
    2. 设定一个分裂阈值,若分裂得到的信息增益不大于这个阈值,则停止分裂
    3. 按照树的准确度,如果分裂后树的准确度提升,则分裂

    优缺点

    预剪枝使得决策树的很多分支都没有展开,这不仅降低了过拟合的风险,还显著减少了决策树训练和预测的时间开销。但是另一方面,有些分支的当前划分虽然不能带来泛化性能的提升,甚至可能导致泛化性能暂时下降,但在其基础上进行的后续划分却有可能导致泛化性能显著上升。所以基于贪心策略的预剪枝可能带来欠拟合的风险

    后剪枝

    首先生成与训练集完全拟合的决策树,然后自下而上地逐层剪枝,如果一个节点的子节点被删除后,决策树的准确度没有降低,那么就将该节点设置为叶节点(基于的原则是Occam剪刀:具有相似效果的两个模型选择较简单的那个)

    优缺点

    优点

    • 决策树易于理解和解释.人们在通过解释后都有能力去理解决策树所表达的意义。
    • 对于决策树,数据的准备往往是简单或者是不必要的.其他的技术往往要求先把数据一般化,比如去掉多余的或者空白的属性。
    • 同时接受离散和连续的数据,不需要做预处理和归一化

    代码

    随机森林

    简介

    随机森林(Random Forest RF)是一种新兴起的、高度灵活的机器学习算法。近年来,得益于其广泛适用、易于理解以及高准确率等方面的优势,它在各个领域的关注度与受欢迎程度都有着显著的提升。从市场营销到医疗保健保险,随机森林既可以用来做市场营销模拟的建模,统计客户的来源,保留和流失等情况,也可用来预测不同疾病的风险和病患者的易感性。

    生成规则

    通过上面决策树的介绍,我们已经掌握了生成树的方法,那么从一棵树到一片森林,其生成规则如下:

    1. 如果训练集大小为N,对于每棵树而言,随机且有放回地从训练集中的抽取N个训练样本(bootstrap抽样方法),作为该树的训练集;每棵树的训练集都是不同的,但里面包含重复的训练样本。
    2. 如果每个样本的特征维度为M,指定一个常数m,且\(m \ll M\),随机地从M个特征中选取m个特征子集,每次树进行分裂时,从这m个特征中选择最优的;
    3. 每棵树都尽最大程度的生长,并且没有剪枝过程。

      在森林中,每棵树都是独立的,99.9%不相关的树做出的预测结果涵盖了所有的情况,这些预测结果将会彼此抵消。少数优秀的树的预测结果将会超脱于芸芸“噪音”,做出一个好的预测。将若干个弱分类器的分类结果进行投票选择,从而组成一个强分类器,这就是随机森林bagging的思想。
      不过我们需要认识到:bagging不用单棵决策树来做预测,具体哪个变量起到重要作用变得未知,所以bagging改进了预测准确率但损失了解释性。
      在生成随机森林时,为什么要有放回的抽样呢?这里引用博客[Machine Learning & Algorithm] 随机森林(Random Forest)的解释:
      如果不是有放回的抽样,那么每棵树的训练样本都是不同的,都是没有交集的,这样每棵树都是"有偏的",都是绝对"片面的"(当然这样说可能不对),也就是说每棵树训练出来都是有很大的差异的;而随机森林最后分类取决于多棵树(弱分类器)的投票表决,这种表决应该是"求同",因此使用完全不同的训练集来训练每棵树这样对最终分类结果是没有帮助的,这样无异于是"盲人摸象"。
      这样,我们对随机森林中的“随机”进行了详细的解释,它包含两个方面:随机抽取样本,随机抽取特征。这两个随机性的引入对随机森林的分类性能至关重要。由于它们的引入,使得随机森林不容易陷入过度拟合,并且具有很好得抗噪能力(比如:对缺省值不敏感)。

    随机森林分类效果

    1. 森林中任意两棵树的相关性: 相关性越大,错误率越大
    2. 森林中每棵树的分类能力: 每棵树的分类能力越强,整棵森林的错误率越低

    减小特征选择个数m,树的相关性和分类能力也会相应的降低;增大m,两者也会随之增大。所以关键问题是如何选择最优的m(或者是范围),这也是随机森林唯一的一个参数。

    袋外错误率

    上面我们提到,构建随机森林的关键问题就是如何选择最优的m,要解决这个问题主要依据计算袋外错误率oob error(out-of-bag error)。

    随机森林有一个重要的优点就是,没有必要对它进行交叉验证或者用一个独立的测试集来获得误差的一个无偏估计。它可以在内部进行评估,也就是说在生成的过程中就可以对误差建立一个无偏估计。

    我们知道,在构建每棵树时,我们对训练集使用了不同的bootstrap sample(随机且有放回地抽取)。所以对于每棵树而言(假设对于第k棵树),大约有1/3的训练实例没有参与第k棵树的生成,它们称为第k棵树的oob样本。

    而这样的采样特点就允许我们进行oob估计,它的计算方式如下:

    1. 对每个样本,计算它作为oob样本的树对它的分类情况(约1/3的树);
    2. 然后以简单多数投票作为该样本的分类结果;
    3. 最后用误分个数占样本总数的比率作为随机森林的oob误分率。

    信息熵的通俗解释

    下面是引用自 通俗理解信息熵

    信息量

    信息的大小跟随机事件的概率有关。越小概率的事情发生了产生的信息量越大,如湖南产生的地震了;越大概率的事情发生了产生的信息量越小,如太阳从东边升起来了(肯定发生嘛,没什么信息量)。这很好理解!

    例子

    脑补一下我们日常的对话:
    师兄走过来跟我说,立波啊,今天你们湖南发生大地震了。
    我:啊,不可能吧,这么重量级的新闻!湖南多低的概率发生地震啊!师兄,你告诉我的这件事,信息量巨大,我马上打电话问问父母什么情况。
    又来了一个师妹:立波师兄,我发现了一个重要情报额,原来德川师兄有女朋友额~德川比师妹早进一年实验室,全实验室同学都知道了这件事。我大笑一声:哈哈哈哈,这件事大家都知道了,一点含金量都没有,下次八卦一些其它有价值的新闻吧

    因此一个具体事件的信息量应该是随着其发生概率而递减的,且不能为负。
    但是这个表示信息量函数的形式怎么找呢?
    随着概率增大而减少的函数形式太多了!不要着急,我们还有下面这条性质
    如果我们有俩个不相关的事件x和y,那么我们观察到的俩个事件同时发生时获得的信息应该等于观察到的事件各自发生时获得的信息之和,即:
    \(h(x,y) = h(x) + h(y)\)
    由于x,y是俩个不相关的事件,那么满足\(p(x,y) = p(x)*p(y)\)

    根据上面推导,我们很容易看出h(x)一定与p(x)的对数有关(因为只有对数形式的真数相乘之后,能够对应对数的相加形式,可以试试)。因此我们有信息量公式如下:
    \(h(x)=-log_{2}p(x)\)

    下面解决俩个疑问?

    1. 为什么有一个负号
      其中,负号是为了确保信息一定是正数或者是0,总不能为负数吧!
    2. 为什么底数为2
      这是因为,我们只需要信息量满足低概率事件x对应于高的信息量。那么对数的选择是任意的。我们只是遵循信息论的普遍传统,使用2作为对数的底!

    信息熵

    下面我们正式引出信息熵。
    信息量度量的是一个具体事件发生了所带来的信息,而熵则是在结果出来之前对可能产生的信息量的期望——考虑该随机变量的所有可能取值,即所有可能发生事件所带来的信息量的期望。即
    \(H(x)=-sum (p(x)log_{2}p(x) )\)
    转换一下为:
    \[Ent(D) = - \sum_{k=1}^{y}p_k\log_{2}p_k\]

    参考文献

    转载于:https://www.cnblogs.com/duanxingxing/p/6924899.html

    展开全文
  •  综上所述,数据管理方面,NAS具有很大优势,某些数据膨胀较快、对数据安全要求较高、异构平台应用的网络环境更能充分体现其价值。另外,NAS的性能价格比极高,广泛适合从小企业到大型企业的各种应用环境...
  • ASP.NET网页代码模型及生命周期

    热门讨论 2009-07-28 14:22:11
    Web开发不像软件开发,Web应用实际上是没有状态,这就说明Web应用程序不自动指示序列中的请求是否来自相同浏览器或客户端,也无法判断浏览器是否一直浏览一个页面或者一个站点,也无法判断用户执行了哪个操作...

空空如也

空空如也

1 2 3 4 5 6
收藏数 112
精华内容 44
关键字:

在实际工作中得到最广泛应用的是