精华内容
下载资源
问答
  • 常用数据库排名及分类介绍

    万次阅读 多人点赞 2019-07-10 21:46:20
    DB-Engines:2019年6月全球数据库排行 DB-Engines 数据库流行度排行榜 6 月更新已发布,排名前二十如下:总体排名和上个月相比基本一致,其中排名前三的Oracle、MySQL 和 Microsoft SQL Server...一、数据库的分类...

    DB-Engines:2019年6月全球数据库排行

            DB-Engines 数据库流行度排行榜 6 月更新已发布,排名前二十如下:总体排名和上个月相比基本一致,其中排名前三的 Oracle、MySQL 和 Microsoft SQL Server 也是分数增加最多的三个数据库,增加的分数分别为 13.67、4.67 和 15.57,三者的总分也均已超过一千。

    一、数据库的分类

         按照早期的数据库理论,比较流行的数据库模型有三种,分别为层次式数据库、网状数据库和关系型数据库。而在当今的互联网中,最常见的数据库模型主要是两种,即SQL关系型数据库NoSQL非关系型数据库

    二、关系型数据库介绍

    关系数据库前 10 名如下:

    1、关系型数据库的由来

    虽然网状数据库和层次数据库已经很好的解决了数据的集中和共享问题,但是在数据库独立性和抽象级别上扔有很大欠缺。用户在对这两种数据库进行存取时,仍然需要明确数据的存储结构,指出存取路径。而关系型数据库就可以较好的解决这些问题。

    2、关系型数据库介绍

    关系型数据库模型是把复杂的数据结构归结为简单的二元关系(即二维表格形式)。在关系型数据库中,对数据的操作几乎全部建立在一个或多个关系表格上,通过对这些关联的表格分类、合并、连接或选取等运算来实现数据库的管理。

    关系型数据库诞生40多年了,从理论产生发展到现实产品,例如:OracleMySQL,Oracle在数据库领域上升到霸主地位,形成每年高达数百亿美元的庞大产业市场。

    传统关系数据库:OracleMySQLMicrosoft SQL ServerPostgreSQL

    大数据常见数据库HiveImpalaPrestoClickHouse

    三、非关系型数据库介绍

    1、非关系型数据库诞生背景

    NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSql数据库在特定的场景下可以发挥出难以想象的高效率和高性能,它是作为对传统关系型数据库的一个有效的补充。

    NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。

    2、非关系型数据库种类
    (1)键值(Key-Value)存储数据库

    键值数据库就类似传统语言中使用的哈希表。可以通过key来添加、查询或者删除数据库,因为使用key主键访问,所以会获得很高的性能及扩展性。

    键值数据库主要使用一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。Key/value模型对于IT系统来说的优势在于简单、易部署、高并发。

    典型产品:Memcached、Redis、Ehcache

    (2)列存储(Column-oriented)数据库

    列存储数据库将数据存储在列族中,一个列族存储经常被一起查询的相关数据,比如人类,我们经常会查询某个人的姓名和年龄,而不是薪资。这种情况下姓名和年龄会被放到一个列族中,薪资会被放到另一个列族中。

    这种数据库通常用来应对分布式存储海量数据

    典型产品:Cassandra(AP)、HBase(CP)

    (3)面向文档(Document-Oriented)数据库

    文档型数据库的灵感是来自于Lotus Notes办公软件,而且它同第一种键值数据库类似。该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高

    面向文档数据库会将数据以文档形式存储。每个文档都是自包含的数据单元,是一系列数据项的集合。每个数据项都有一个名词与对应值,值既可以是简单的数据类型,如字符串、数字和日期等;也可以是复杂的类型,如有序列表和关联对象。数据存储的最小单位是文档,同一个表中存储的文档属性可以是不同的,数据可以使用XML、JSON或JSONB等多种形式存储。

    典型产品:MongoDB、CouchDB

    (4)图形数据库

    图形数据库允许我们将数据以图的方式存储。实体会被作为顶点,而实体之间的关系则会被作为边。比如我们有三个实体,Steve Jobs、Apple和Next,则会有两个“Founded by”的边将Apple和Next连接到Steve Jobs。

    典型产品:Neo4J、InforGrid

    (5)时序数据库

    2017年时序数据库忽然火了起来。开年2月Facebook开源了beringei时序数据库;到了4月基于PostgreSQL打造的时序数据库TimeScaleDB也开源了,而早在2016年7月,百度云在其天工物联网平台上发布了国内首个多租户的分布式时序数据库产品TSDB,成为支持其发展制造,交通,能源,智慧城市等产业领域的核心产品,同时也成为百度战略发展产业物联网的标志性事件。时序数据库作为物联网方向一个非常重要的服务,业界的频频发声,正说明各家企业已经迫不及待的拥抱物联网时代的到来。

    时序数据是基于时间的一系列的数据。在有时间的坐标中将这些数据点连成线,往过去看可以做成多纬度报表,揭示其趋势性、规律性、异常性;往未来看可以做大数据分析,机器学习,实现预测和预警。

    时序数据库就是存放时序数据的数据库,并且需要支持时序数据的快速写入、持久化、多纬度的聚合查询等基本功能。

           对比传统数据库仅仅记录了数据的当前值,时序数据库则记录了所有的历史数据。同时时序数据的查询也总是会带上时间作为过滤条件。

    典型产品:InfluxDB、Prometheus(普罗米修斯)、OpenTSDB(底层基于HBase)

    (6)搜索引擎存储

    搜索引擎存储:搜索引擎数据库最近比较火的包括Solr和Elasticsearch等。Solr是Apache 的一个开源项目,基于业界大名鼎鼎的java开源搜索引擎Lucene。在过去的十年里,solr发展壮大,拥有广泛的用户群体。solr提供分布式索引、分片、副本集、负载均衡和自动故障转移和恢复功能。如果正确部署,良好管理,solr就能够成为一个高可靠、可扩展和高容错的搜索引擎。

    Elasticsearch构建在Apache Lucene库之上,同是开源搜索引擎。Elasticsearch在Solr推出几年后才面世的,通过REST和schema-free的JSON文档提供分布式、多租户全文搜索引擎。并且官方提供Java,Groovy,PHP,Ruby,Perl,Python,.NET和Javascript客户端。目前Elasticsearch与Logstash和Kibana配合,部署成日志采集和分析,简称ELK,它们都是开源软件。最近新增了一个FileBeat,它是一个轻量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash。

    典型产品:Elasticsearch、Solr

    (7)其他

    类型部分代表特点

    对象存储

    db4o、Versant

    通过类似面向对象语言的语法操作数据库,通过对象的方式存取数据。

    xml数据库

    Berkeley DB XML、BaseX

    高效的存储XML数据,并支持XML的内部查询语法,比如XQuery,Xpath。

    展开全文
  • Mysql中MyISAM、InnoDB两种表类型的区别

    千次阅读 2013-10-04 10:30:54
    InnoDB和MyISAM是许多人在使用MySQL时最常用表类型,这表类型优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度...

    InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。

      以下是一些细节和具体实现的差别:

      ◆1.InnoDB不支持FULLTEXT类型的索引。

      ◆2.InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的。

      ◆3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。

      ◆4.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。

      ◆5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。

      另外,InnoDB表的行锁也不是绝对的,假如在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”

      两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁.而MyISAM不支持.所以MyISAM往往就容易被人认为只适合在小项目中使用。

      我作为使用MySQL的用户角度出发,Innodb和MyISAM都是比较喜欢的,但是从我目前运维的数据库平台要达到需求:99.9%的稳定性,方便的扩展性和高可用性来说的话,MyISAM绝对是我的首选。

      原因如下:

      1、首先我目前平台上承载的大部分项目是读多写少的项目,而MyISAM的读性能是比Innodb强不少的。

      2、MyISAM的索引和数据是分开的,并且索引是有压缩的,内存使用率就对应提高了不少。能加载更多索引,而Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会造成Innodb比MyISAM体积庞大不小。

      3、从平台角度来说,经常隔1,2个月就会发生应用开发人员不小心update一个表where写的范围不对,导致这个表没法正常用了,这个时候MyISAM的优越性就体现出来了,随便从当天拷贝的压缩包取出对应表的文件,随便放到一个数据库目录下,然后dump成sql再导回到主库,并把对应的binlog补上。如果是Innodb,恐怕不可能有这么快速度,别和我说让Innodb定期用导出xxx.sql机制备份,因为我平台上最小的一个数据库实例的数据量基本都是几十G大小。

      4、从我接触的应用逻辑来说,select count(*) 和order by 是最频繁的,大概能占了整个sql总语句的60%以上的操作,而这种操作Innodb其实也是会锁表的,很多人以为Innodb是行级锁,那个只是where对它主键是有效,非主键的都会锁全表的。

      5、还有就是经常有很多应用部门需要我给他们定期某些表的数据,MyISAM的话很方便,只要发给他们对应那表的frm.MYD,MYI的文件,让他们自己在对应版本的数据库启动就行,而Innodb就需要导出xxx.sql了,因为光给别人文件,受字典数据文件的影响,对方是无法使用的。

      6、如果和MyISAM比insert写操作的话,Innodb还达不到MyISAM的写性能,如果是针对基于索引的update操作,虽然MyISAM可能会逊色Innodb,但是那么高并发的写,从库能否追的上也是一个问题,还不如通过多实例分库分表架构来解决。

      7、如果是用MyISAM的话,merge引擎可以大大加快应用部门的开发速度,他们只要对这个merge表做一些select count(*)操作,非常适合大项目总量约几亿的rows某一类型(如日志,调查统计)的业务表。

      当然Innodb也不是绝对不用,用事务的项目如模拟炒股项目,我就是用Innodb的,活跃用户20多万时候,也是很轻松应付了,因此我个人也是很喜欢Innodb的,只是如果从数据库平台应用出发,我还是会首选MyISAM。

      另外,可能有人会说你MyISAM无法抗太多写操作,但是我可以通过架构来弥补,说个我现有用的数据库平台容量:主从数据总量在几百T以上,每天十多亿 pv的动态页面,还有几个大项目是通过数据接口方式调用未算进pv总数,(其中包括一个大项目因为初期memcached没部署,导致单台数据库每天处理 9千万的查询)。而我的整体数据库服务器平均负载都在0.5-1左右。

    展开全文
  • 二极管的分类常用方法

    万次阅读 多人点赞 2017-09-13 16:23:26
    目前市场上常见的肖特基管最高结温100℃、125℃、150%、175℃几(结温越高表示产品抗高温特性越好,即工作在此温度以下不会引起失效)。 6.反向漏电流比较大,所以没法做成高压的二极管。 1.5肖特基二极管应用 ...

    前言:

    为了方便查看博客,特意申请了一个公众号,附上二维码,有兴趣的朋友可以关注,和我一起讨论学习,一起享受技术,一起成长。

    在这里插入图片描述


    前面调试一个板子,半天没搞清楚啥问题,直接USB供电正常运行,使用电池供电就发生3.3V和GND“短接”,各种测试濒临崩溃,最后发现是一个二极管加工时焊接错误,导致电池供电时在二极管上的压降太大,更改成肖特基低压差二极管,完美解决。所以借此总结一下二极管的常见使用方法。


    1.肖特基二极管

    1.1概念

    一般的PN结二极管是利用N型半导体与P型半导体形成的PN结制作而成。

    肖特基二极管(SBD)不是利用P型半导体与N型半导体接触形成PN结原理制作的,而是利用金属与半导体接触形成的金属-半导体结(肖特基势垒)原理制作的。因此,SBD也称为金属-半导体(接触)二极管或表面势垒二极管,它是一种热载流子二极管。组成如下图:

    这里写图片描述

    肖特基二极管的Schottky barriers(肖特基势垒)小于一般的PN结型二极管,所以正向导通所需的电压很低(0.2~0.5V)。肖特基二极管的反向恢复时间(trr)非常快,因为其不存在少数载流子的寿命问题,反向恢复电荷非常少,所以其开关频率特别高,可达100GHz。这些特性使得肖特基二极管在高频应用领域占有重要位置。

    1.2肖特基二极管的原理

    Schottky diode 是用**贵金属作为正极,N型半导体作为负极。**在N型半导体中掺杂了磷、砷等元素,所以N型半导体的多子为自由电子(Electronics),少子为空穴(Hole)。而贵金属中的自由电子较少,所以电子(Electronics)由N型半导体向金属扩散。因为金属中没有空穴(Hole)的存在,所以当电子不断向金属扩散,N型半导体得不到空穴补充所以带正电,贵金属端由于多了自由电子所以带负电。Schottky diode 就形成了一个从N型半导体指向贵金属端的内电场。如下图所示:

    这里写图片描述

    在内电场的作用下,贵金属端的电子漂移至N型半导体。随着漂移运动,内电场又逐渐被削弱,扩散运动增加。最后扩散运动与漂移运动达到平衡,在N型半导体与贵金属之间形成了Schottky barriers(肖特基势垒)。如下图。

    这里写图片描述

    施加正向电压: 当对肖特基二极管施加正向电压时,中间的空间电荷区减少,加剧扩散运动。如下图。

    这里写图片描述

    施加反向电压时:

    当对肖特基二极管施加反向电压时,在反向电压与内电场的共同作用下空间电荷区增加,扩散运动受抑。少量电子在外加电压与内电场的共同作用下从贵金属端漂移至N型半导体。N型半导体的电子因为空间电荷区的增大以及外加电场与内电场共同的影响无法穿过空间电荷区到达贵金属端,形成反向截止。

    这里写图片描述

    1.4肖特基二极管特性

    肖特基二极管(SBD)的主要参数有:IF(IO)正向电流(A)、VRRM反向耐压(V)、IFSM峰值瞬态浪涌电流(A)、IF测试电流(A)、VF正向压降(V)、IR反向漏电流(uA)。肖特基二极管属于低功耗、超高速的半导体器件。

    1.肖特基二极管的正向压降比快恢复二极管正向压降低很多,所以自身功耗较小,效率高。

    2.由于反向电荷恢复时间极短,所以适宜工作在高频状态下。

    3.能耐受高浪涌电流。

    4.以前的肖特基管反向耐压一般在200V以下,但现在最新技术可以做到高达1000V的产品,市场应用前景十分广阔。

    5.目前市场上常见的肖特基管最高结温分100℃、125℃、150%、175℃几种(结温越高表示产品抗高温特性越好,即工作在此温度以下不会引起失效)。

    6.反向漏电流比较大,所以没法做成高压的二极管。

    1.5肖特基二极管应用

    肖特基二极管一般用在电源次级输出整流上面。 作用还是整流,其优势是正向压降低,反向恢复时间快,所以整体损耗会比其他的二极管低很多。

    肖特基二极管被广泛应用于变频器、开关电源、驱动器等电路,作为低压、高频、大电流整流二极管、保护二极管、续流二极管等使用,肖特基二极管在微波通信等电路中作整流二极管、小信号检波二极管使用。

    2.快恢复二极管

    2.1概念

    能够迅速由导通状态过渡到关断状态的PN结整流二极管,称为快恢复二极管。快恢复二极管(简称FRD),是一种具有开关特性好、反向恢复时间短特点的半导体二极管,工艺上多采用掺金措施,结构上有采用PN结型结构,有的采用改进的PIN结构。其正向压降高于普通二极管(1-2V),反向耐压多在1200V以下,从性能上可分为快恢复和超快恢复两个等级。前者反向恢复时间为数百纳秒或更长,后者则在100纳秒以下。 主要应用于开关电源、PWM脉宽调制器、变频器等电子电路中,作为高频整流二极管、续流二极管或阻尼二极管使用。

    快恢复二极管的内部结构与普通PN结二极管不同,它属于PIN结型二极管,即在P型硅材料与N型硅材料中间增加了基区I,构成PIN硅片。因基区很薄,其反向恢复电荷很小,所以快恢复二极管的反向恢复时间较短,正向压降较低,反向击穿电压较高。快恢复二极管有0.8-1.1V的正向导通压降,35-85ns的反向恢复时间,在导通和截止之间迅速转换,提高了器件的使用频率并改善了波形。

    2.2特点

    反向恢复时间trr的定义是: 电流通过零点由正向转换到规定低值的时间间隔。它是衡量高频续流及整流器件性能的重要技术指标。

    快速恢复二极管主要特点是这种二极管由导通转到截止所需要的时间非常短,这个时间称为反向恢复时间,反向恢复时间比较小的管子可明显降低开关时的功耗。此外还常常被用来产生快速上升的脉冲信号。高电平过渡到低电平,或者是从低电平过渡到高电平。

    2.3应用

    快速恢复二极管是介于肖特基和普通二极管之间的,它既有肖特基二极管的导通压降低(没有肖特基低),速度快,又有比较高的耐压(肖特基一般耐压很低),快恢复主要用于频率较高的场合做整流,比如开关电源的二次整流,用于市电的整流,逆变电源中做整流元件。快速恢复二极管的PN结较普通整流管要薄,在过瞬间大电流的能力较普通的为弱,尤其是在滤波电容过大的情况下,管子最大电流选择不当会在一瞬间烧毁快恢复的PN结。

    3.整流二极管

    3.1概念

    整流二极管(rectifier diode)一种用于将交流电转变为直流电的半导体器件。二极管最重要的特性就是单方向导电性。在电路中,电流只能从二极管的正极流入,负极流出。通常它包含一个PN结,有正极和负极两个端子。其结构如图所示。P区的载流子是空穴,N区的载流子是电子,在P区和N区间形成一定的位垒。外加电压使P区相对N区为正的电压时,位垒降低,位垒两侧附近产生储存载流子,能通过大电流,具有低的电压降(典型值为0.7V),称为正向导通状态。若加相反的电压,使位垒增加,可承受高的反向电压(从25V到3000V),流过很小的反向电流(称反向漏电流),称为反向阻断状态。整流二极管具有明显的单向导电性。整流二极管可用半导体锗或硅等材料制造。硅整流二极管的击穿电压高,反向漏电流小,高温性能良好。通常高压大功率整流二极管都用高纯单晶硅制造(掺杂较多时容易反向击穿)。这种器件的结面积较大,能通过较大电流(可达上千安),但工作频率不高,一般在几十千赫以下。整流二极管主要用于各种低频半波整流电路,如需达到全波整流需连成整流桥使用。

    这里写图片描述

    3.2整流二极管的常用参数

    (1)最大平均整流电流IF:

    指二极管长期工作时允许通过的最大正向平均电流。该电流由PN结的结面积和散热条件决定。使用时应注意通过二极管的平均电流不能大于此值,并要满足散热条件。例如1N4000系列二极管的IF为1A。

    (2)最高反向工作电压VR:

    指二极管两端允许施加的最大反向电压。若大于此值,则反向电流(IR)剧增,二极管的单向导电性被破坏,从而 引起反向击穿。通常取反向击穿电压(VB)的一半作为(VR)。例如1N4001的VR为50V,1N4007的VR为1000V。

    (3)最大反向电流IR:

    它是二极管在最高反向工作电压下允许流过的反向电流,此参数反映了二极管单向导电性能的好坏。因此这个电流值越小,表明二极管质量越好。

    (4)击穿电压VR:

    指二极管反向伏安特性曲线急剧弯曲点的电压值。反向为软特性时,则指给定反向漏电流条件下的电压值。

    (5)最高工作频率fm:

    它是二极管在正常情况下的最高工作频率。主要由PN结的结电容及扩散电容决定,若工作频率超过fm,则二极管的单向导电性能将不能很好地体现。例如1N4000系列二极管的fm为3kHz。

    (6)反向恢复时间tre:

    指在规定的负载、正向电流及最大反向瞬态电压下的反向恢复时间。

    (7)零偏压电容CO:

    指二极管两端电压为零时,扩散电容及结电容的容量之和。值得注意的是,由于制造工艺的限制,即使同一型号的二极管其 参数的离散性也很大。手册中给出的参数往往是一个范围,若测试条件改变,则相应的参数也会发生变化,例如在25°C时测得1N5200系列硅塑封整流二极 管的IR小于10uA,而在100°C时IR则变为小于500uA。

    3.3整流电路

    二极管电路中整流二极管的应用最为普遍。所谓整流二极管就是专门用于电源电路中将交流电转换成单向脉动直流电的二极管,由整流二极管构成的电路称为二极管整流电路。

    这里写图片描述

    4.TVS二极管

    4.1概念

    又称为瞬态抑制二极管,是普遍使用的一种新型高效电路保护器件,它具有极快的响应时间(亚纳秒级)和相当高的浪涌吸收能力。当它的两端经受瞬间的高能量冲击时,TVS能以极高的速度把两端间的阻抗值由高阻抗变为低阻抗,以吸收一个瞬间大电流,把它的两端电压箝制在一个预定的数值上,从而保护后面的电路元件不受瞬态高压尖峰脉冲的冲击。

    这里写图片描述

    5.续流二极管

    5.1概念

    续流二极管由于在电路中起到续流的作用而得名,一般选择快速恢复二极管或者肖特基二极管来作为“续流二极管”,它在电路中一般用来保护元件不被感应电压击穿或烧坏,以并联的方式接到产生感应电动势的元件两端,并与其形成回路,使其产生的高电动势在回路以续电流方式消耗,从而起到保护电路中的元件不被损坏的作用。

    5.2作用

    **续流二极管经常和储能元件一起使用,防止电压电流突变,提供通路。**电感可以经过它给负载提供持续的电流,以免负载电流突变,起到平滑电流的作用。在开关电源中,就能见到一个由二极管和电阻串连起来构成的的续流电路。这个电路续流二极管与变压器原边并联。当开关管关断时,续流电路可以释放掉变压器线圈中储存的能量,防止感应电压过高,击穿开关管。可见“续流二极管”并不是一个实质的元件,它只不过在电路中起到的作用称做“续流”。

    这里写图片描述

    6.防反接二极管

    通常情况下直流电源输入防反接保护电路是利用二极管的单向导电性来实现防反接保护。

    这里写图片描述

    可以直接串接一个压降低的二极管(肖特基二极管)。

    这里写图片描述

    图片地址:http://blog.163.com/fimnl_332804338/blog/static/22754406020139273537847/


    以后再继续总结…

    参考:

    1.肖特基二极管原理

    2.肖特基二极管原理和应用

    3.快恢复二极管在使用上有哪些优势

    4.快恢复二极管的作用分析

    5. 肖特基二极管和快恢复二极管又什么区别

    6.整流二极管

    7.常见的二极管整流电路

    8.续流二极管

    9.二极管基本知识

    展开全文
  • 种常用的特征选择方法

    万次阅读 多人点赞 2017-11-03 16:42:41
    种常用的特征选择方法 转载 2016年12月14日 16:33:38 标签:特征选择 6084 结合Scikit-learn介绍几种常用的特征选择方法 原文 http://dataunion.org/14072.html 主题 特征选择...

    几种常用的特征选择方法

    转载  2016年12月14日 16:33:38

    结合Scikit-learn介绍几种常用的特征选择方法

    特征选择(排序)对于数据科学家、机器学习从业者来说非常重要。好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点、底层结构,这对进一步改善模型、算法都有着重要作用。

    特征选择主要有两个功能:

    1. 减少特征数量、降维,使模型泛化能力更强,减少过拟合
    2. 增强对特征和特征值之间的理解

    拿到数据集,一个特征选择方法,往往很难同时完成这两个目的。通常情况下,我们经常不管三七二十一,选择一种自己最熟悉或者最方便的特征选择方法(往往目的是降维,而忽略了对特征和数据理解的目的)。

    在许多机器学习相关的书里,很难找到关于特征选择的内容,因为特征选择要解决的问题往往被视为机器学习的一种副作用,一般不会单独拿出来讨论。

    本文将结合 Scikit-learn提供的例子 介绍几种常用的特征选择方法,它们各自的优缺点和问题。

    1 去掉取值变化小的特征 Removing features with low variance

    这应该是最简单的特征选择方法了:假设某特征的特征值只有0和1,并且在所有输入样本中,95%的实例的该特征取值都是1,那就可以认为这个特征作用不大。如果100%都是1,那这个特征就没意义了。当特征值都是离散型变量的时候这种方法才能用,如果是连续型变量,就需要将连续变量离散化之后才能用,而且实际当中,一般不太会有95%以上都取某个值的特征存在,所以这种方法虽然简单但是不太好用。可以把它作为特征选择的预处理,先去掉那些取值变化小的特征,然后再从接下来提到的的特征选择方法中选择合适的进行进一步的特征选择。

    2 单变量特征选择 Univariate feature selection

    单变量特征选择能够对每一个特征进行测试,衡量该特征和响应变量之间的关系,根据得分扔掉不好的特征。对于回归和分类问题可以采用卡方检验等方式对特征进行测试。

    这种方法比较简单,易于运行,易于理解,通常对于理解数据有较好的效果(但对特征优化、提高泛化能力来说不一定有效);这种方法有许多改进的版本、变种。

    2.1 Pearson相关系数 Pearson Correlation

    皮尔森相关系数是一种最简单的,能帮助理解特征和响应变量之间关系的方法,该方法衡量的是变量之间的线性相关性,结果的取值区间为[-1,1],-1表示完全的负相关(这个变量下降,那个就会上升),+1表示完全的正相关,0表示没有线性相关。

    Pearson Correlation速度快、易于计算,经常在拿到数据(经过清洗和特征提取之后的)之后第一时间就执行。Scipy的 pearsonr 方法能够同时计算相关系数和p-value,

    import numpy as np
    from scipy.stats import pearsonr
    np.random.seed(0)
    size = 300
    x = np.random.normal(0, 1, size)
    print "Lower noise", pearsonr(x, x + np.random.normal(0, 1, size))
    print "Higher noise", pearsonr(x, x + np.random.normal(0, 10, size))

    Lower noise (0.71824836862138386, 7.3240173129992273e-49)Higher noise (0.057964292079338148, 0.31700993885324746)

    这个例子中,我们比较了变量在加入噪音之前和之后的差异。当噪音比较小的时候,相关性很强,p-value很低。

    Scikit-learn提供的 f_regrssion 方法能够批量计算特征的p-value,非常方便,参考sklearn的 pipeline

    Pearson相关系数的一个明显缺陷是,作为特征排序机制,他只对线性关系敏感。如果关系是非线性的,即便两个变量具有一一对应的关系,Pearson相关性也可能会接近0。

    x = np.random.uniform(-1, 1, 100000)
    print pearsonr(x, x**2)[0]

    -0.00230804707612

    更多类似的例子参考 sample plots 。另外,如果仅仅根据相关系数这个值来判断的话,有时候会具有很强的误导性,如 Anscombe’s quartet ,最好把数据可视化出来,以免得出错误的结论。

    2.2 互信息和最大信息系数 Mutual information and maximal information coefficient (MIC)

    以上就是经典的互信息公式了。想把互信息直接用于特征选择其实不是太方便:1、它不属于度量方式,也没有办法归一化,在不同数据及上的结果无法做比较;2、对于连续变量的计算不是很方便(X和Y都是集合,x,y都是离散的取值),通常变量需要先离散化,而互信息的结果对离散化的方式很敏感。

    最大信息系数克服了这两个问题。它首先寻找一种最优的离散化方式,然后把互信息取值转换成一种度量方式,取值区间在[0,1]。 minepy 提供了MIC功能。

    反过头来看y=x^2这个例子,MIC算出来的互信息值为1(最大的取值)。

    from minepy import MINE
    m = MINE()
    x = np.random.uniform(-1, 1, 10000)
    m.compute_score(x, x**2)
    print m.mic()

    1.0

    MIC的统计能力遭到了 一些质疑 ,当零假设不成立时,MIC的统计就会受到影响。在有的数据集上不存在这个问题,但有的数据集上就存在这个问题。

    2.3 距离相关系数 (Distance correlation)

    距离相关系数是为了克服Pearson相关系数的弱点而生的。在x和x^2这个例子中,即便Pearson相关系数是0,我们也不能断定这两个变量是独立的(有可能是非线性相关);但如果距离相关系数是0,那么我们就可以说这两个变量是独立的。

    R的 energy 包里提供了距离相关系数的实现,另外这是 Python gist 的实现。

    #R-code
    > x = runif (1000, -1, 1)
    > dcor(x, x**2)
    [1] 0.4943864

    尽管有MIC和距离相关系数在了,但当变量之间的关系接近线性相关的时候,Pearson相关系数仍然是不可替代的。第一、Pearson相关系数计算速度快,这在处理大规模数据的时候很重要。第二、Pearson相关系数的取值区间是[-1,1],而MIC和距离相关系数都是[0,1]。这个特点使得Pearson相关系数能够表征更丰富的关系,符号表示关系的正负,绝对值能够表示强度。当然,Pearson相关性有效的前提是两个变量的变化关系是单调的。

    2.4 基于学习模型的特征排序 (Model based ranking)

    这种方法的思路是直接使用你要用的机器学习算法,针对每个单独的特征和响应变量建立预测模型。其实Pearson相关系数等价于线性回归里的标准化回归系数。假如某个特征和响应变量之间的关系是非线性的,可以用基于树的方法(决策树、随机森林)、或者扩展的线性模型等。基于树的方法比较易于使用,因为他们对非线性关系的建模比较好,并且不需要太多的调试。但要注意过拟合问题,因此树的深度最好不要太大,再就是运用交叉验证。

    在 波士顿房价数据集 上使用sklearn的 随机森林回归 给出一个单变量选择的例子:

    from sklearn.cross_validation import cross_val_score, ShuffleSplit
    from sklearn.datasets import load_boston
    from sklearn.ensemble import RandomForestRegressor
    
    #Load boston housing dataset as an example
    boston = load_boston()
    X = boston["data"]
    Y = boston["target"]
    names = boston["feature_names"]
    
    rf = RandomForestRegressor(n_estimators=20, max_depth=4)
    scores = []
    for i in range(X.shape[1]):
         score = cross_val_score(rf, X[:, i:i+1], Y, scoring="r2",
                                  cv=ShuffleSplit(len(X), 3, .3))
         scores.append((round(np.mean(score), 3), names[i]))
    print sorted(scores, reverse=True)

    [(0.636, ‘LSTAT’), (0.59, ‘RM’), (0.472, ‘NOX’), (0.369, ‘INDUS’), (0.311, ‘PTRATIO’), (0.24, ‘TAX’), (0.24, ‘CRIM’), (0.185, ‘RAD’), (0.16, ‘ZN’), (0.087, ‘B’), (0.062, ‘DIS’), (0.036, ‘CHAS’), (0.027, ‘AGE’)]

    3 线性模型和正则化

    单变量特征选择方法独立的衡量每个特征与响应变量之间的关系,另一种主流的特征选择方法是基于机器学习模型的方法。有些机器学习方法本身就具有对特征进行打分的机制,或者很容易将其运用到特征选择任务中,例如回归模型,SVM,决策树,随机森林等等。说句题外话,这种方法好像在一些地方叫做wrapper类型,大概意思是说,特征排序模型和机器学习模型是耦盒在一起的,对应的非wrapper类型的特征选择方法叫做filter类型。

    下面将介绍如何用回归模型的系数来选择特征。越是重要的特征在模型中对应的系数就会越大,而跟输出变量越是无关的特征对应的系数就会越接近于0。在噪音不多的数据上,或者是数据量远远大于特征数的数据上,如果特征之间相对来说是比较独立的,那么即便是运用最简单的线性回归模型也一样能取得非常好的效果。

    from sklearn.linear_model import LinearRegression
    import numpy as np
    np.random.seed(0)
    size = 5000
    #A dataset with 3 features
    X = np.random.normal(0, 1, (size, 3))
    #Y = X0 + 2*X1 + noise
    Y = X[:,0] + 2*X[:,1] + np.random.normal(0, 2, size)
    lr = LinearRegression()
    lr.fit(X, Y)
    #A helper method for pretty-printing linear models
    def pretty_print_linear(coefs, names = None, sort = False):
    	if names == None:
    		names = ["X%s" % x for x in range(len(coefs))]
    	lst = zip(coefs, names)
    	if sort:
    		lst = sorted(lst,  key = lambda x:-np.abs(x[0]))
    	return " + ".join("%s * %s" % (round(coef, 3), name)
    								   for coef, name in lst)
    print "Linear model:", pretty_print_linear(lr.coef_)
    

    Linear model: 0.984 * X0 + 1.995 * X1 + -0.041 * X2

    在这个例子当中,尽管数据中存在一些噪音,但这种特征选择模型仍然能够很好的体现出数据的底层结构。当然这也是因为例子中的这个问题非常适合用线性模型来解:特征和响应变量之间全都是线性关系,并且特征之间均是独立的。

    在很多实际的数据当中,往往存在多个互相关联的特征,这时候模型就会变得不稳定,数据中细微的变化就可能导致模型的巨大变化(模型的变化本质上是系数,或者叫参数,可以理解成W),这会让模型的预测变得困难,这种现象也称为多重共线性。例如,假设我们有个数据集,它的真实模型应该是Y=X1+X2,当我们观察的时候,发现Y’=X1+X2+e,e是噪音。如果X1和X2之间存在线性关系,例如X1约等于X2,这个时候由于噪音e的存在,我们学到的模型可能就不是Y=X1+X2了,有可能是Y=2X1,或者Y=-X1+3X2。

    下边这个例子当中,在同一个数据上加入了一些噪音,用随机森林算法进行特征选择。

    from sklearn.linear_model import LinearRegression
    
    size = 100
    np.random.seed(seed=5)
    
    X_seed = np.random.normal(0, 1, size)
    X1 = X_seed + np.random.normal(0, .1, size)
    X2 = X_seed + np.random.normal(0, .1, size)
    X3 = X_seed + np.random.normal(0, .1, size)
    
    Y = X1 + X2 + X3 + np.random.normal(0,1, size)
    X = np.array([X1, X2, X3]).T
    
    lr = LinearRegression()
    lr.fit(X,Y)
    print "Linear model:", pretty_print_linear(lr.coef_)

    Linear model: -1.291 * X0 + 1.591 * X1 + 2.747 * X2

    系数之和接近3,基本上和上上个例子的结果一致,应该说学到的模型对于预测来说还是不错的。但是,如果从系数的字面意思上去解释特征的重要性的话,X3对于输出变量来说具有很强的正面影响,而X1具有负面影响,而实际上所有特征与输出变量之间的影响是均等的。

    同样的方法和套路可以用到类似的线性模型上,比如逻辑回归。

    3.1 正则化模型

    正则化就是把额外的约束或者惩罚项加到已有模型(损失函数)上,以防止过拟合并提高泛化能力。损失函数由原来的E(X,Y)变为E(X,Y)+alpha||w||,w是模型系数组成的向量(有些地方也叫参数parameter,coefficients),||·||一般是L1或者L2范数,alpha是一个可调的参数,控制着正则化的强度。当用在线性模型上时,L1正则化和L2正则化也称为Lasso和Ridge。

    3.2 L1正则化/Lasso

    L1正则化将系数w的l1范数作为惩罚项加到损失函数上,由于正则项非零,这就迫使那些弱的特征所对应的系数变成0。因此L1正则化往往会使学到的模型很稀疏(系数w经常为0),这个特性使得L1正则化成为一种很好的特征选择方法。

    Scikit-learn为线性回归提供了Lasso,为分类提供了L1逻辑回归。

    下面的例子在波士顿房价数据上运行了Lasso,其中参数alpha是通过grid search进行优化的。

    from sklearn.linear_model import Lasso
    from sklearn.preprocessing import StandardScaler
    from sklearn.datasets import load_boston
    
    boston = load_boston()
    scaler = StandardScaler()
    X = scaler.fit_transform(boston["data"])
    Y = boston["target"]
    names = boston["feature_names"]
    
    lasso = Lasso(alpha=.3)
    lasso.fit(X, Y)
    
    print "Lasso model: ", pretty_print_linear(lasso.coef_, names, sort = True)

    Lasso model: -3.707 * LSTAT + 2.992 * RM + -1.757 * PTRATIO + -1.081 * DIS + -0.7 * NOX + 0.631 * B + 0.54 * CHAS + -0.236 * CRIM + 0.081 * ZN + -0.0 * INDUS + -0.0 * AGE + 0.0 * RAD + -0.0 * TAX

    可以看到,很多特征的系数都是0。如果继续增加alpha的值,得到的模型就会越来越稀疏,即越来越多的特征系数会变成0。

    然而,L1正则化像非正则化线性模型一样也是不稳定的,如果特征集合中具有相关联的特征,当数据发生细微变化时也有可能导致很大的模型差异。

    3.3 L2正则化/Ridge regression

    L2正则化将系数向量的L2范数添加到了损失函数中。由于L2惩罚项中系数是二次方的,这使得L2和L1有着诸多差异,最明显的一点就是,L2正则化会让系数的取值变得平均。对于关联特征,这意味着他们能够获得更相近的对应系数。还是以Y=X1+X2为例,假设X1和X2具有很强的关联,如果用L1正则化,不论学到的模型是Y=X1+X2还是Y=2X1,惩罚都是一样的,都是2 alpha。但是对于L2来说,第一个模型的惩罚项是2 alpha,但第二个模型的是4*alpha。可以看出,系数之和为常数时,各系数相等时惩罚是最小的,所以才有了L2会让各个系数趋于相同的特点。

    可以看出,L2正则化对于特征选择来说一种稳定的模型,不像L1正则化那样,系数会因为细微的数据变化而波动。所以L2正则化和L1正则化提供的价值是不同的,L2正则化对于特征理解来说更加有用:表示能力强的特征对应的系数是非零。

    回过头来看看3个互相关联的特征的例子,分别以10个不同的种子随机初始化运行10次,来观察L1和L2正则化的稳定性。

    from sklearn.linear_model import Ridge
    from sklearn.metrics import r2_score
    size = 100
    #We run the method 10 times with different random seeds
    for i in range(10):
    	print "Random seed %s" % i
    	np.random.seed(seed=i)
    	X_seed = np.random.normal(0, 1, size)
    	X1 = X_seed + np.random.normal(0, .1, size)
    	X2 = X_seed + np.random.normal(0, .1, size)
    	X3 = X_seed + np.random.normal(0, .1, size)
    	Y = X1 + X2 + X3 + np.random.normal(0, 1, size)
    	X = np.array([X1, X2, X3]).T
    	lr = LinearRegression()
    	lr.fit(X,Y)
    	print "Linear model:", pretty_print_linear(lr.coef_)
    	ridge = Ridge(alpha=10)
    	ridge.fit(X,Y)
    	print "Ridge model:", pretty_print_linear(ridge.coef_)
    	print
    

    Random seed 0 Linear model: 0.728 * X0 + 2.309 * X1 + -0.082 * X2 Ridge model: 0.938 * X0 + 1.059 * X1 + 0.877 * X2

    Random seed 1 Linear model: 1.152 * X0 + 2.366 * X1 + -0.599 * X2 Ridge model: 0.984 * X0 + 1.068 * X1 + 0.759 * X2

    Random seed 2 Linear model: 0.697 * X0 + 0.322 * X1 + 2.086 * X2 Ridge model: 0.972 * X0 + 0.943 * X1 + 1.085 * X2

    Random seed 3 Linear model: 0.287 * X0 + 1.254 * X1 + 1.491 * X2 Ridge model: 0.919 * X0 + 1.005 * X1 + 1.033 * X2

    Random seed 4 Linear model: 0.187 * X0 + 0.772 * X1 + 2.189 * X2 Ridge model: 0.964 * X0 + 0.982 * X1 + 1.098 * X2

    Random seed 5 Linear model: -1.291 * X0 + 1.591 * X1 + 2.747 * X2 Ridge model: 0.758 * X0 + 1.011 * X1 + 1.139 * X2

    Random seed 6 Linear model: 1.199 * X0 + -0.031 * X1 + 1.915 * X2 Ridge model: 1.016 * X0 + 0.89 * X1 + 1.091 * X2

    Random seed 7 Linear model: 1.474 * X0 + 1.762 * X1 + -0.151 * X2 Ridge model: 1.018 * X0 + 1.039 * X1 + 0.901 * X2

    Random seed 8 Linear model: 0.084 * X0 + 1.88 * X1 + 1.107 * X2 Ridge model: 0.907 * X0 + 1.071 * X1 + 1.008 * X2

    Random seed 9 Linear model: 0.714 * X0 + 0.776 * X1 + 1.364 * X2 Ridge model: 0.896 * X0 + 0.903 * X1 + 0.98 * X2

    可以看出,不同的数据上线性回归得到的模型(系数)相差甚远,但对于L2正则化模型来说,结果中的系数非常的稳定,差别较小,都比较接近于1,能够反映出数据的内在结构。

    4 随机森林

    随机森林具有准确率高、鲁棒性好、易于使用等优点,这使得它成为了目前最流行的机器学习算法之一。随机森林提供了两种特征选择的方法:mean decrease impurity和mean decrease accuracy。

    4.1 平均不纯度减少 mean decrease impurity

    随机森林由多个决策树构成。决策树中的每一个节点都是关于某个特征的条件,为的是将数据集按照不同的响应变量一分为二。利用不纯度可以确定节点(最优条件),对于分类问题,通常采用 基尼不纯度 或者 信息增益 ,对于回归问题,通常采用的是 方差 或者最小二乘拟合。当训练决策树的时候,可以计算出每个特征减少了多少树的不纯度。对于一个决策树森林来说,可以算出每个特征平均减少了多少不纯度,并把它平均减少的不纯度作为特征选择的值。

    下边的例子是sklearn中基于随机森林的特征重要度度量方法:

    from sklearn.datasets import load_boston
    from sklearn.ensemble import RandomForestRegressor
    import numpy as np
    #Load boston housing dataset as an example
    boston = load_boston()
    X = boston["data"]
    Y = boston["target"]
    names = boston["feature_names"]
    rf = RandomForestRegressor()
    rf.fit(X, Y)
    print "Features sorted by their score:"
    print sorted(zip(map(lambda x: round(x, 4), rf.feature_importances_), names), 
                 reverse=True)

    Features sorted by their score: [(0.5298, ‘LSTAT’), (0.4116, ‘RM’), (0.0252, ‘DIS’), (0.0172, ‘CRIM’), (0.0065, ‘NOX’), (0.0035, ‘PTRATIO’), (0.0021, ‘TAX’), (0.0017, ‘AGE’), (0.0012, ‘B’), (0.0008, ‘INDUS’), (0.0004, ‘RAD’), (0.0001, ‘CHAS’), (0.0, ‘ZN’)]

    这里特征得分实际上采用的是 Gini Importance 。使用基于不纯度的方法的时候,要记住:1、这种方法存在 偏向 ,对具有更多类别的变量会更有利;2、对于存在关联的多个特征,其中任意一个都可以作为指示器(优秀的特征),并且一旦某个特征被选择之后,其他特征的重要度就会急剧下降,因为不纯度已经被选中的那个特征降下来了,其他的特征就很难再降低那么多不纯度了,这样一来,只有先被选中的那个特征重要度很高,其他的关联特征重要度往往较低。在理解数据时,这就会造成误解,导致错误的认为先被选中的特征是很重要的,而其余的特征是不重要的,但实际上这些特征对响应变量的作用确实非常接近的(这跟Lasso是很像的)。

    特征随机选择 方法稍微缓解了这个问题,但总的来说并没有完全解决。下面的例子中,X0、X1、X2是三个互相关联的变量,在没有噪音的情况下,输出变量是三者之和。

    size = 10000
    np.random.seed(seed=10)
    X_seed = np.random.normal(0, 1, size)
    X0 = X_seed + np.random.normal(0, .1, size)
    X1 = X_seed + np.random.normal(0, .1, size)
    X2 = X_seed + np.random.normal(0, .1, size)
    X = np.array([X0, X1, X2]).T
    Y = X0 + X1 + X2
    
    rf = RandomForestRegressor(n_estimators=20, max_features=2)
    rf.fit(X, Y);
    print "Scores for X0, X1, X2:", map(lambda x:round (x,3),
                                        rf.feature_importances_)

    Scores for X0, X1, X2: [0.278, 0.66, 0.062]

    当计算特征重要性时,可以看到X1的重要度比X2的重要度要高出10倍,但实际上他们真正的重要度是一样的。尽管数据量已经很大且没有噪音,且用了20棵树来做随机选择,但这个问题还是会存在。

    需要注意的一点是,关联特征的打分存在不稳定的现象,这不仅仅是随机森林特有的,大多数基于模型的特征选择方法都存在这个问题。

    4.2 平均精确率减少 Mean decrease accuracy

    另一种常用的特征选择方法就是直接度量每个特征对模型精确率的影响。主要思路是打乱每个特征的特征值顺序,并且度量顺序变动对模型的精确率的影响。很明显,对于不重要的变量来说,打乱顺序对模型的精确率影响不会太大,但是对于重要的变量来说,打乱顺序就会降低模型的精确率。

    这个方法sklearn中没有直接提供,但是很容易实现,下面继续在波士顿房价数据集上进行实现。

    from sklearn.cross_validation import ShuffleSplit
    from sklearn.metrics import r2_score
    from collections import defaultdict
    X = boston["data"]
    Y = boston["target"]
    rf = RandomForestRegressor()
    scores = defaultdict(list)
    #crossvalidate the scores on a number of different random splits of the data
    for train_idx, test_idx in ShuffleSplit(len(X), 100, .3):
    	X_train, X_test = X[train_idx], X[test_idx]
    	Y_train, Y_test = Y[train_idx], Y[test_idx]
    	r = rf.fit(X_train, Y_train)
    	acc = r2_score(Y_test, rf.predict(X_test))
    	for i in range(X.shape[1]):
    		X_t = X_test.copy()
    		np.random.shuffle(X_t[:, i])
    		shuff_acc = r2_score(Y_test, rf.predict(X_t))
    		scores[names[i]].append((acc-shuff_acc)/acc)
    print "Features sorted by their score:"
    print sorted([(round(np.mean(score), 4), feat) for
    			  feat, score in scores.items()], reverse=True)
    

    Features sorted by their score: [(0.7276, ‘LSTAT’), (0.5675, ‘RM’), (0.0867, ‘DIS’), (0.0407, ‘NOX’), (0.0351, ‘CRIM’), (0.0233, ‘PTRATIO’), (0.0168, ‘TAX’), (0.0122, ‘AGE’), (0.005, ‘B’), (0.0048, ‘INDUS’), (0.0043, ‘RAD’), (0.0004, ‘ZN’), (0.0001, ‘CHAS’)]

    在这个例子当中,LSTAT和RM这两个特征对模型的性能有着很大的影响,打乱这两个特征的特征值使得模型的性能下降了73%和57%。注意,尽管这些我们是在所有特征上进行了训练得到了模型,然后才得到了每个特征的重要性测试,这并不意味着我们扔掉某个或者某些重要特征后模型的性能就一定会下降很多,因为即便某个特征删掉之后,其关联特征一样可以发挥作用,让模型性能基本上不变。

    5 两种顶层特征选择算法

    之所以叫做顶层,是因为他们都是建立在基于模型的特征选择方法基础之上的,例如回归和SVM,在不同的子集上建立模型,然后汇总最终确定特征得分。

    5.1 稳定性选择 Stability selection

    稳定性选择是一种基于二次抽样和选择算法相结合较新的方法,选择算法可以是回归、SVM或其他类似的方法。它的主要思想是在不同的数据子集和特征子集上运行特征选择算法,不断的重复,最终汇总特征选择结果,比如可以统计某个特征被认为是重要特征的频率(被选为重要特征的次数除以它所在的子集被测试的次数)。理想情况下,重要特征的得分会接近100%。稍微弱一点的特征得分会是非0的数,而最无用的特征得分将会接近于0。

    sklearn在 随机lasso 和 随机逻辑回归 中有对稳定性选择的实现。

    from sklearn.linear_model import RandomizedLasso
    from sklearn.datasets import load_boston
    boston = load_boston()
    
    #using the Boston housing data. 
    #Data gets scaled automatically by sklearn's implementation
    X = boston["data"]
    Y = boston["target"]
    names = boston["feature_names"]
    
    rlasso = RandomizedLasso(alpha=0.025)
    rlasso.fit(X, Y)
    
    print "Features sorted by their score:"
    print sorted(zip(map(lambda x: round(x, 4), rlasso.scores_), 
                     names), reverse=True)

    Features sorted by their score: [(1.0, ‘RM’), (1.0, ‘PTRATIO’), (1.0, ‘LSTAT’), (0.62, ‘CHAS’), (0.595, ‘B’), (0.39, ‘TAX’), (0.385, ‘CRIM’), (0.25, ‘DIS’), (0.22, ‘NOX’), (0.125, ‘INDUS’), (0.045, ‘ZN’), (0.02, ‘RAD’), (0.015, ‘AGE’)]

    在上边这个例子当中,最高的3个特征得分是1.0,这表示他们总会被选作有用的特征(当然,得分会收到正则化参数alpha的影响,但是sklearn的随机lasso能够自动选择最优的alpha)。接下来的几个特征得分就开始下降,但是下降的不是特别急剧,这跟纯lasso的方法和随机森林的结果不一样。能够看出稳定性选择对于克服过拟合和对数据理解来说都是有帮助的:总的来说,好的特征不会因为有相似的特征、关联特征而得分为0,这跟Lasso是不同的。对于特征选择任务,在许多数据集和环境下,稳定性选择往往是性能最好的方法之一。

    5.2 递归特征消除 Recursive feature elimination (RFE)

    递归特征消除的主要思想是反复的构建模型(如SVM或者回归模型)然后选出最好的(或者最差的)的特征(可以根据系数来选),把选出来的特征放到一遍,然后在剩余的特征上重复这个过程,直到所有特征都遍历了。这个过程中特征被消除的次序就是特征的排序。因此,这是一种寻找最优特征子集的贪心算法。

    RFE的稳定性很大程度上取决于在迭代的时候底层用哪种模型。例如,假如RFE采用的普通的回归,没有经过正则化的回归是不稳定的,那么RFE就是不稳定的;假如采用的是Ridge,而用Ridge正则化的回归是稳定的,那么RFE就是稳定的。

    Sklearn提供了 RFE 包,可以用于特征消除,还提供了 RFECV ,可以通过交叉验证来对的特征进行排序。

    from sklearn.feature_selection import RFE
    from sklearn.linear_model import LinearRegression
    
    boston = load_boston()
    X = boston["data"]
    Y = boston["target"]
    names = boston["feature_names"]
    
    #use linear regression as the model
    lr = LinearRegression()
    #rank all features, i.e continue the elimination until the last one
    rfe = RFE(lr, n_features_to_select=1)
    rfe.fit(X,Y)
    
    print "Features sorted by their rank:"
    print sorted(zip(map(lambda x: round(x, 4), rfe.ranking_), names))

    Features sorted by their rank: [(1.0, ‘NOX’), (2.0, ‘RM’), (3.0, ‘CHAS’), (4.0, ‘PTRATIO’), (5.0, ‘DIS’), (6.0, ‘LSTAT’), (7.0, ‘RAD’), (8.0, ‘CRIM’), (9.0, ‘INDUS’), (10.0, ‘ZN’), (11.0, ‘TAX’), (12.0, ‘B’), (13.0, ‘AGE’)]

    6 一个完整的例子

    下面将本文所有提到的方法进行实验对比,数据集采用Friedman #1 回归数据( 这篇论文 中的数据)。数据是用这个公式产生的:

    X1到X5是由 单变量分布 生成的,e是 标准正态变量 N(0,1)。另外,原始的数据集中含有5个噪音变量 X5,…,X10,跟响应变量是独立的。我们增加了4个额外的变量X11,…X14,分别是X1,…,X4的关联变量,通过f(x)=x+N(0,0.01)生成,这将产生大于0.999的关联系数。这样生成的数据能够体现出不同的特征排序方法应对关联特征时的表现。

    接下来将会在上述数据上运行所有的特征选择方法,并且将每种方法给出的得分进行归一化,让取值都落在0-1之间。对于RFE来说,由于它给出的是顺序而不是得分,我们将最好的5个的得分定为1,其他的特征的得分均匀的分布在0-1之间。

    from sklearn.datasets import load_boston
    from sklearn.linear_model import (LinearRegression, Ridge, 
    								  Lasso, RandomizedLasso)
    from sklearn.feature_selection import RFE, f_regression
    from sklearn.preprocessing import MinMaxScaler
    from sklearn.ensemble import RandomForestRegressor
    import numpy as np
    from minepy import MINE
    np.random.seed(0)
    size = 750
    X = np.random.uniform(0, 1, (size, 14))
    #"Friedamn #1” regression problem
    Y = (10 * np.sin(np.pi*X[:,0]*X[:,1]) + 20*(X[:,2] - .5)**2 +
    	 10*X[:,3] + 5*X[:,4] + np.random.normal(0,1))
    #Add 3 additional correlated variables (correlated with X1-X3)
    X[:,10:] = X[:,:4] + np.random.normal(0, .025, (size,4))
    names = ["x%s" % i for i in range(1,15)]
    ranks = {}
    def rank_to_dict(ranks, names, order=1):
    	minmax = MinMaxScaler()
    	ranks = minmax.fit_transform(order*np.array([ranks]).T).T[0]
    	ranks = map(lambda x: round(x, 2), ranks)
    	return dict(zip(names, ranks ))
    lr = LinearRegression(normalize=True)
    lr.fit(X, Y)
    ranks["Linear reg"] = rank_to_dict(np.abs(lr.coef_), names)
    ridge = Ridge(alpha=7)
    ridge.fit(X, Y)
    ranks["Ridge"] = rank_to_dict(np.abs(ridge.coef_), names)
    lasso = Lasso(alpha=.05)
    lasso.fit(X, Y)
    ranks["Lasso"] = rank_to_dict(np.abs(lasso.coef_), names)
    rlasso = RandomizedLasso(alpha=0.04)
    rlasso.fit(X, Y)
    ranks["Stability"] = rank_to_dict(np.abs(rlasso.scores_), names)
    #stop the search when 5 features are left (they will get equal scores)
    rfe = RFE(lr, n_features_to_select=5)
    rfe.fit(X,Y)
    ranks["RFE"] = rank_to_dict(map(float, rfe.ranking_), names, order=-1)
    rf = RandomForestRegressor()
    rf.fit(X,Y)
    ranks["RF"] = rank_to_dict(rf.feature_importances_, names)
    f, pval  = f_regression(X, Y, center=True)
    ranks["Corr."] = rank_to_dict(f, names)
    mine = MINE()
    mic_scores = []
    for i in range(X.shape[1]):
    	mine.compute_score(X[:,i], Y)
    	m = mine.mic()
    	mic_scores.append(m)
    ranks["MIC"] = rank_to_dict(mic_scores, names)
    r = {}
    for name in names:
    	r[name] = round(np.mean([ranks[method][name] 
    							 for method in ranks.keys()]), 2)
    methods = sorted(ranks.keys())
    ranks["Mean"] = r
    methods.append("Mean")
    print "\t%s" % "\t".join(methods)
    for name in names:
    	print "%s\t%s" % (name, "\t".join(map(str, 
    						 [ranks[method][name] for method in methods])))
    

    从以上结果中可以找到一些有趣的发现:

    特征之间存在 线性关联 关系,每个特征都是独立评价的,因此X1,…X4的得分和X11,…X14的得分非常接近,而噪音特征X5,…,X10正如预期的那样和响应变量之间几乎没有关系。由于变量X3是二次的,因此X3和响应变量之间看不出有关系(除了MIC之外,其他方法都找不到关系)。这种方法能够衡量出特征和响应变量之间的线性关系,但若想选出优质特征来提升模型的泛化能力,这种方法就不是特别给力了,因为所有的优质特征都不可避免的会被挑出来两次。

    Lasso能够挑出一些优质特征,同时让其他特征的系数趋于0。当如需要减少特征数的时候它很有用,但是对于数据理解来说不是很好用。(例如在结果表中,X11,X12,X13的得分都是0,好像他们跟输出变量之间没有很强的联系,但实际上不是这样的)

    MIC对特征一视同仁,这一点上和关联系数有点像,另外,它能够找出X3和响应变量之间的非线性关系。

    随机森林基于不纯度的排序结果非常鲜明,在得分最高的几个特征之后的特征,得分急剧的下降。从表中可以看到,得分第三的特征比第一的小4倍。而其他的特征选择算法就没有下降的这么剧烈。

    Ridge将回归系数均匀的分摊到各个关联变量上,从表中可以看出,X11,…,X14和X1,…,X4的得分非常接近。

    稳定性选择常常是一种既能够有助于理解数据又能够挑出优质特征的这种选择,在结果表中就能很好的看出。像Lasso一样,它能找到那些性能比较好的特征(X1,X2,X4,X5),同时,与这些特征关联度很强的变量也得到了较高的得分。

    总结

    1. 对于理解数据、数据的结构、特点来说,单变量特征选择是个非常好的选择。尽管可以用它对特征进行排序来优化模型,但由于它不能发现冗余(例如假如一个特征子集,其中的特征之间具有很强的关联,那么从中选择最优的特征时就很难考虑到冗余的问题)。
    2. 正则化的线性模型对于特征理解和特征选择来说是非常强大的工具。L1正则化能够生成稀疏的模型,对于选择特征子集来说非常有用;相比起L1正则化,L2正则化的表现更加稳定,由于有用的特征往往对应系数非零,因此L2正则化对于数据的理解来说很合适。由于响应变量和特征之间往往是非线性关系,可以采用basis expansion的方式将特征转换到一个更加合适的空间当中,在此基础上再考虑运用简单的线性模型。
    3. 随机森林是一种非常流行的特征选择方法,它易于使用,一般不需要feature engineering、调参等繁琐的步骤,并且很多工具包都提供了平均不纯度下降方法。它的两个主要问题,1是重要的特征有可能得分很低(关联特征问题),2是这种方法对特征变量类别多的特征越有利(偏向问题)。尽管如此,这种方法仍然非常值得在你的应用中试一试。
    4. 特征选择在很多机器学习和数据挖掘场景中都是非常有用的。在使用的时候要弄清楚自己的目标是什么,然后找到哪种方法适用于自己的任务。当选择最优特征以提升模型性能的时候,可以采用交叉验证的方法来验证某种方法是否比其他方法要好。当用特征选择的方法来理解数据的时候要留心,特征选择模型的稳定性非常重要,稳定性差的模型很容易就会导致错误的结论。对数据进行二次采样然后在子集上运行特征选择算法能够有所帮助,如果在各个子集上的结果是一致的,那就可以说在这个数据集上得出来的结论是可信的,可以用这种特征选择模型的结果来理解数据。

    Tips

    什么是 卡方检验 ?用方差来衡量某个观测频率和理论频率之间差异性的方法

    什么是 皮尔森卡方检验 ?这是一种最常用的卡方检验方法,它有两个用途:1是计算某个变量对某种分布的拟合程度,2是根据两个观测变量的 Contingency table 来计算这两个变量是否是独立的。主要有三个步骤:第一步用方差和的方式来计算观测频率和理论频率之间卡方值;第二步算出卡方检验的自由度(行数-1乘以列数-1);第三步比较卡方值和对应自由度的卡方分布,判断显著性。

    什么是 p-value ?简单地说,p-value就是为了验证假设和实际之间一致性的统计学意义的值,即假设检验。有些地方叫右尾概率,根据卡方值和自由度可以算出一个固定的p-value,

    什么是 响应变量(response value) ?简单地说,模型的输入叫做explanatroy variables,模型的输出叫做response variables,其实就是要验证该特征对结果造成了什么样的影响

    什么是 统计能力(statistical power) ?

    什么是 度量(metric) ?

    什么是 零假设(null hypothesis) ?在相关性检验中,一般会取“两者之间无关联”作为零假设,而在独立性检验中,一般会取“两者之间是独立”作为零假设。与零假设相对的是备择假设(对立假设),即希望证明是正确的另一种可能。

    什么是 多重共线性 ?

    什么是 grid search ?

    That’s it

    References

    1. http://blog.datadive.net/selecting-good-features-part-i-univariate-selection/
    2. http://blog.datadive.net/selecting-good-features-part-ii-linear-models-and-regularization/
    3. http://scikit-learn.org/stable/modules/feature_selection.html#univariate-feature-selection
    4. http://www.quora.com/What-are-some-feature-selection-methods
    5. http://www.quora.com/What-are-some-feature-selection-algorithms
    6. http://www.quora.com/What-are-some-feature-selection-methods-for-SVMs
    7. http://www.quora.com/What-is-the-difference-between-principal-component-analysis-PCA-and-feature-selection-in-machine-learning-Is-PCA-a-means-of-feature-selection

    文章出处: http://chaoslog.com/te-zheng-xuan-ze.html

     

    相关文章推荐

    特征选择方法学习笔记

    一直以来,笔者在实际工作中,对于特征变量的选取,往往是基于业务经验,根据一定的指标口径加工出一个个指标后,即投入到建模过程。而这些指标的好坏、计算口径是否恰当,较少有进行科学地分析与深入思考。与此同时...

    递归算法的特点

    递归算法解决问题的特点:                 1)递归就是方法里调用自身。                 ...

    程序员求职面试时,应该注意什么?

    不要再喝"是金子总会发光"的鸡汤了!!这张免费的求职经验分享入场券请查收!

    机器学习中的特征——特征选择的方法以及注意点

    转载自:http://blog.csdn.net/google19890102/article/details/40019271 关于机器学习中的特征我有话要说   在这次校园招聘的过程中,我学到了...

    特征选择之支持向量机递归特征消除(SVM-RFE)

    支持向量机递归特征消除(下文简称SVM-RFE)是由Guyon等人在对癌症分类时提出来的,最初只能对两类数据进行特征提取。它是一种基于Embedded方法。支持向量机支持向量机广泛用于模式识别,机器学...

    特征抽取与特征选择

    特征抽取:特征抽取后的新特征是原来特征的一个映射 特征选择:特征选择后的特征是原来特征的一个子集 特征抽取的方法主要是通过属性间的关系,如组合不同的属性得到新的属性,这样就改变了原来的特征...

    结合Scikit-learn介绍几种常用的特征选择方法

    特征选择(排序)对于数据科学家、机器学习从业者来说非常重要。好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点、底层结构,这对进一步改善模型、算法都有着重要作用。 特征选择主要有两个功能: ...

    [数字图像处理]灰度变换——反转,对数变换,伽马变换,灰度拉伸,灰度切割,位图切割

    灰度变换,属于一个非常重要的概念。这里主要参考《Digital Image Processing》 Rafael C. Gonzalez / Richard E. Woods 的第三章。书中所有的实验...

    特征选择--scikit-learn

    特征选择(Feature Selection):choosing a subset of all the features(the ones more informative)。最终得到的特征选是原来...

    机器学习中的范数规则化之(一)L0、L1与L2范数

    机器学习中的范数规则化之(一)L0、L1与L2范数zouxy09@qq.comhttp://blog.csdn.net/zouxy09        今天我们聊聊机器学习中出现的非常频繁的问题:过拟合...

    结合Scikit-learn介绍几种常用的特征选择方法

    作者: Edwin Jarvis 特征选择(排序)对于数据科学家、机器学习从业者来说非常重要。好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点、底层结构,这对进一步改善模型、算法都...

    结合Scikit-learn介绍几种常用的特征选择方法

    转载自:http://www.cnblogs.com/hhh5460/p/5186226.html 结合Scikit-learn介绍几种常用的特征选择方法 作者:Edwin...

    结合Scikit-learn介绍几种常用的特征选择方法

    参考http://www.cnblogs.com/hhh5460/p/5186226.html 未完,占坑后续填写 目标构成一套成型的自动特征选择的多方案集成输出

    结合Scikit-learn介绍几种常用的特征选择方法

    链接http://blog.csdn.net/key_v/article/details/48008725 此文系转载,原文地址:http://chaoslog.com/te-zheng-xuan-...

    结合Scikit-learn介绍几种常用的特征选择方法

    作者:Edwin Jarvis 特征选择(排序)对于数据科学家、机器学习从业者来说非常重要。好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点、底层结构,这对进一步改善模型、算法都有着重要...

    [转]干货:结合Scikit-learn介绍几种常用的特征选择方法

    > 文章 > 技术专区 > 干货:结合Scikit-learn介绍几种常用的特征选择方法 干货:结合Scikit-learn介绍几种常用的特征...

    工程中常用的特征选择方法

    当数据预处理完成后,我们需要选择有意义的特征输入机器学习的算法和模型进行训练。 为什么? (1)降低维度,选择重要的特征,避免维度灾难,降低计算成本 (2)去除不相关的冗余特征(噪声)来降低...

    特征选择常用算法综述

    • 2016-02-27 17:14
    • 808KB
    • 下载

    [机器学习]特征选择常用算法综述

    1 综述 (1) 什么是特征选择 特征选择 ( Feature Selection )也称特征子集选择( Feature Subset Selection , FSS ) ,或属性选择( Attr...
    展开全文
  • fastText原理和文本分类实战,看这一篇就够了

    万次阅读 多人点赞 2019-03-19 11:19:48
    fastText是一个快速文本分类算法,与基于神经网络的分类算法相比有两大优点: 1、fastText在保持高精度的情况下加快了训练速度和测试速度 2、fastText不需要预训练好的词向量,fastText会自己训练词向量 3、fastText...
  • 常用数据库的字段类型及大小

    千次阅读 2014-12-26 18:42:13
    常用数据库的字段类型及大小 http://blog.163.com/along007_yes@yeah/blog/static/105357154201282833218936/  2012-09-28 15:32:18| 分类: mysql|举报|字号 订阅 .SYBASE的字段类型如下:   ...
  • PostgreSQL 常用命令速查表

    千次阅读 多人点赞 2020-09-21 22:33:01
    本文为大家精心整理了 PostgreSQL 数据库中最常用的语句和命令,并且制作了 PDF 版本的命令速查表。具体内容包括 psql 工具连接服务器和基本使用,角色、用户和组以及权限管理,数据库和模式管理,数据,索引,...
  • 常见芯片封装有哪

    千次阅读 2014-09-05 15:21:37
    采用DIP封装的CPU芯片有两排引脚,需要插入到具有DIP结构的芯片插座上。当然,也可以直接插在相同焊孔数和几何排列的电路板上进行焊接。DIP封装的芯片在从芯片插座上插拔时应特别小心,以免损坏引
  • mysql中的两种引擎 innoDB IsAM 的区别

    千次阅读 2015-05-18 15:02:50
     InnoDB和MyISAM是许多人在使用MySQL时最常用表类型,这表类型优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数...
  • 本节包含的详细练习将引导您完成与在数据视图中生成一些常用图表类型有关的步骤。所有练习都使用 Tableau Desktop 附带的 “Sample - Superstore” 数据源。为堆叠条添加合计将合计添加到图表中条形的顶部有时就像...
  • 常用光纤接头类型

    万次阅读 2006-11-20 11:46:00
    常用光纤接头类型 连接器种类:国内常见的连接器包括:FC-PC,FC-APC,SC-PC,SC-APC,ST等。最新的连接器则:LC,MU,MT-RJ等 FC型:金属双重配合螺旋终止型结构;ST型:金属圆型卡口式结构;SC型:矩形塑料插拔...
  • hashmap两种遍历总结!

    千次阅读 2016-07-27 20:06:21
    1.hashmap两种遍历效率1:2----entry----单个遍历两次 public class HashMapTest { public static void main(String[] args) { HashMap keySetMap = new HashMap(); HashMap entrySetMap = n
  • 单元格类型定义了在单元格中呈现的信息的类型,以及这种信息如何...用户可以使用两种不同的单元格类型对表单中的单元格进行设置: 一种是可以简单地关联于单元格的文本格式,另一种就是显示控件或者图形化信息。我们在
  • - 低耦合集成TabBarController,最低只需传个数组即可完成主流App框架搭建. samurai-native - 是一个基于浏览器内核通过HTML+CSS 开发原生移动应用的iOS框架. HHRouter - 一言以蔽之,URL Router 即将 ...
  • 爬虫大概分类

    千次阅读 2018-11-02 21:49:57
    网络爬虫按照系统结构和实现技术,大致可以分为以下几种类型:通用网络爬虫(General Purpose Web Crawler)、聚焦网络爬虫(Focused Web Crawler)、增量式网络爬虫(Incremental Web Crawler)、深层网络爬虫...
  • 库分表是现在应对大量数据常用的手段,使用库分表主要考虑: 1、数据容量单是否超过1000W 2、单容量到了1000W以上基本上稍微复杂一点的SQL都需要仔细优化,这时候的SQL耗时主要集中在磁盘IO上,数据命中缓存...
  • 图像分类

    万次阅读 多人点赞 2018-01-21 15:31:47
    图像物体分类与检测算法综述 ...图像物体分类与检测是计算机视觉研究中的个重要的基本问题,也是图像分割、物体跟踪、行为分析等其他高层视觉任务的基础。 本文从物体分类与检测问题的基本定义出发,首先从实例
  • ASP.NET程序中常用的三十三代码 1. 打开新的窗口并传送参数:  传送参数: response.write("<script>window.open(’*.aspx?id="+this.DropDownList1.SelectIndex+"&id1="+...+"’)</script>")  接收参数...
  • Python的字符串格式化有两种方式: 百分号方式、format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存。
  • 文本分类入门

    千次阅读 热门讨论 2012-03-04 02:08:57
    最近要做文本分类相关的课程project,因此上网找了一下文本分类的资料,下面这个感觉比较通俗易懂,收录在这里。 来源 http://www.blogjava.net/zhenandaci/category/31868.html?Show=All 文本分类入 门(一)文本...
  • 现在人脸识别最好的算法是哪种

    千次阅读 2020-07-23 08:30:22
    但从学术的角度来讲,“最好”是一个谨慎的词语,深度学习从以往不被认可逐渐成长为机器学习的主流,同样,也难保未来会其它方法会取代深度学习。 1、对于许多应用程序,使用更简单的算法像逻辑回归和支持向量...
  • 随机森林模型有着惊人的准确性,可以替代一般线性模型(线性回归、方差分析等)和广义线性模型(逻辑斯蒂回归、泊松回归等)等等。   我2012年在人民大学组织的R...以后不时人给我写信交流模型使用心得,索
  • MySQL大优化方案

    千次阅读 2018-09-12 19:38:58
    除非单数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑、部署、运维的各种复杂度,一般以整型值为主的在千万级以下,字符串为主的在五万以下是没有太大问题的。而事实上很多时候MySQL单...
  • 基于深度学习的遥感图像分类总概

    万次阅读 多人点赞 2018-08-04 20:21:18
    传统的分类方法分两种:监督分类和非监督分类。监督分类要求对所要分类的地区必须要先验的类别知识,即先要从所研究地区中选择出所有要区分的各类地物的训练区,用于建立判别函数。常用的监督分类方法:K近邻法...
  • 常用调度算法总结

    千次阅读 2018-06-08 15:18:27
    )[+]先来先服务队列最短优先优先队列高优先权优先调度算法优先权调度算法的类型高响应比优先调度算法基于时间片的轮转调度算法时间片轮转法多级反馈队列调度算法电梯调度算法调度算法是指:根据系统的资源分配策略所...
  • 常用数据分析方法总结

    千次阅读 2019-11-02 14:06:23
    最近优化一个画像产品,用到一些数据分析方法,这里总结一下。 ... 一、描述统计 描述统计是通过图表或数学方法,对数据资料进行整理、分析,并对数据的分布状态、数字特征和随机变量之间关系进行估计和...集中趋势...
  • Sql Server2005定义数据类型分类

    千次阅读 2010-11-11 13:20:00
    SQL-sever数据类型分类:整数数据类型 INT或INTEGER SMALLINT TINYINT BIGINT 浮点数据类型 REAL FLOAT DECIMAL NUMERIC 二进制数据类型 BINARY VARBINARY 逻辑数据类型 BIT 字符数据类型 CHAR NCHAR ...
  • 编者按 ClickHouse自从2016年开源以来,在数据分析(OLAP)领域火热,...本文是结合百分点在前期设计中的经验对ClickHouse做的整理,其中百分点最佳实践部分是基于我们的业务场景以及数据规模,经过大量的测试及总...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 53,326
精华内容 21,330
关键字:

常用百分表的类型有哪两种