精华内容
下载资源
问答
  • 51单片机之所以成为经典,成为易上手的单片机主要有以下特点:特性1、从内部的硬件到软件有一套完整的按位操作系统,称作位处理器,处理对象不是字或字节而是位。不但能对片内某些特殊功能寄存器的某位进行处理,如...
  • 块/文件/对象三种存储的优缺点

    千次阅读 2019-09-27 19:04:36
    从应用角度看块/文件/对象三种存储:http://www.talkwithtrend.com/Article/178247 对象存储从理论到实践:...对象存储、文件存储、块存储,从应用角度看有何不同?“狠角色”们是怎么搭配的?:h...

     从应用角度看块/文件/对象三种存储:http://www.talkwithtrend.com/Article/178247

    对象存储从理论到实践:https://baijiahao.baidu.com/s?id=1608194600020248113&wfr=spider&for=pc

    对象存储、文件存储、块存储,从应用角度看有何不同?“狠角色”们是怎么搭配的?:https://www.sohu.com/a/144775333_151779

     

    对象存储原理

     

    1 对象数据组成结构

    与块存储和文件存储管理数据的方式不同,对象存储是以对象的形式管理数据的。对象和文件最大的不同,就是在文件基础之上增加了元数据。一般情况下,对象分为三个部分:数据、元数据以及对象id。

    对象的数据通常是无结构的数据,比如:图片、视频或文档等;对象的元数据则指的是对象的相关描述,比如:图片的大小、文档的拥有者等;对象id则是一个全局的唯一标识符,用来区分对象的。

     

    从数据结构来看,这三种存储有着根本不同。块存储的数据结构是数组,而文件存储是二叉树(B,B-,B+,B*各种树),对象存储基本上都是哈希表。

    数组和二叉树都是老生常谈,没有太多值得说的,而对象存储使用的哈希表也就是常听说的键值(KeyVaule型)存储的核心数据结构,每个对象找一个UID(所谓的“键”KEY),算哈希值(所谓的“值Vaule”)以后和目标对应。找了一个哈希表例子如下:

    键值对应关系简单粗暴,毕竟算个hash值是很快的,这种扁平化组织形式可以做得非常大,避免了二叉树的深度,对于真·海量的数据存储和大规模访问都能给力支持。所以不仅是对象存储,很多NoSQL的分布式数据库都会使用它,比如Redis,MongoDB,Cassandra 还有Dynamo等等。

     

    2 对象访问方式

    对象存储,访问对象的方式很方便,是通过REST接口对对象进行操作,用HTTP动词(GET、POST、PUT、DELETE等)描述操作。除此之外,还有一种访问方式,就是使用各大云商提供的客户端去操作对象。比如:Amazon的s3cmd、阿里云的osscmd/ossutil、腾讯云的coscmd等。这些客户端都是各个云商开发出来,可以以命令行的形式在操作系统中操作对象的工具,各大云商都有详细的文档说明,在这就不一一赘述了。

     

    3 对象存储优缺点

    先说优点,之前大概也提了下:

    可扩展性高:对象存储能够扩展数十乃至数百EB的容量,能够充分利用高密度存储;效率高:扁平化结构,不受复杂目录系统对性能的影响;无需迁移:对象存储是一种横向扩展系统,随着容量的增加,数据根据算法自动分布于所有的对象存储节点;安全性高:对象存储通常凭借HTTP调用对象存储本身提供的认证密钥来提供数据访问;访问方便:不光支持HTTP(S)协议,采用REST的API方式调用和检索数据,同样增加了NFS和SMB支持;成本相对低:与块存储方式相比,对象存储是最具成本效益的数据存储类型,并且与云计算搭配,把对象存储的这一特性发挥的淋漓尽致。

    再提缺点:

    最终一致性:由于不同节点的位置不同,数据同步时可能会有一定时间的延迟或者错误;不易做数据库:对象存储比较适合存储那些变动不大甚至不变的文件,而对于像数据库这种需要直接与存储裸盘相互映射的应用,还是块存储更合适。

     

    产品和市场需求有各种相互影响的关系,但不管是哪一种,最终呈现都是产品和应用需求需要对应匹配。应用需求越多样化,市场也就划分得更加细,产品种类也就更加丰富。在存储行业,我们也可以从“应用适配”这个角度来聊聊各类存储。

    传统认知上来说,IT设备分为计算/存储/网络三大类,相互之间是有明显的楚河汉界的。计算大家都清楚,服务器,小型机,大型机;网络也就是路由器交换机;存储有内置存储和外置存储,最常见的就是磁盘阵列。在HCI(超融合)这个概念没被热炒之前,计算网络存储还都是泾渭分明,各担其责的。今天我们先不讨论超融合的情况,仅基于传统理解,看看存储的情况。

    从逻辑上存储通常分为块存储,文件存储,对象存储。这三类存储在实际应用中的适配环境还是有着明显的不同的。

    块存储(DAS/SAN)通常应用在某些专有的系统中,这类应用要求很高的随机读写性能和高可靠性,上面搭载的通常是Oracle/DB2这种传统数据库,连接通常是以FC光纤(8Gb/16Gb)为主,走光纤协议。如果要求稍低一些,也会出现基于千兆/万兆以太网的连接方式,MySQL这种数据库就可能会使用IP SAN,走iSCSI协议。通常使用块存储的都是系统而非用户,并发访问不会很多,经常出现一套存储只服务一个应用系统,例如如交易系统,计费系统。典型行业如金融,制造,能源,电信等。

    微信图片_20170524153052.png

    微信图片_20170524153052.png

     

    文件存储(NAS)相对来说就更能兼顾多个应用和更多用户访问,同时提供方便的数据共享手段。毕竟大部分的用户数据都是以文件的形式存放,在PC时代,数据共享也大多是用文件的形式,比如常见的的FTP服务,NFS服务,Samba共享这些都是属于典型的文件存储。几十个用户甚至上百用户的文件存储共享访问都可以用NAS存储加以解决。在中小企业市场,一两台NAS存储设备就能支撑整个IT部门了。CRM系统,SCM系统,OA系统,邮件系统都可以使用NAS存储统统搞定。甚至在公有云发展的早几年,用户规模没有上来时,云存储的底层硬件也有用几套NAS存储设备就解决的,甚至云主机的镜像也有放在NAS存储上的例子。文件存储的广泛兼容性和易用性,是这类存储的突出特点。但是从性能上来看,相对SAN就要低一些。NAS存储基本上是以太网访问模式,普通千兆网,走NFS/CIFS协议。

    2.png

    2.png

     

    对象存储概念出现得晚一些,存储标准化组织SINA早在2004年就给出了定义,但早期多出现在超大规模系统,所以并不为大众所熟知,相关产品一直也不温不火。一直到云计算和大数据的概念全民强推,才慢慢进入公众视野。前面说到的块存储和文件存储,基本上都还是在专有的局域网络内部使用,而对象存储的优势场景却是互联网或者公网,主要解决海量数据,海量并发访问的需求。基于互联网的应用才是对象存储的主要适配(当然这个条件同样适用于云计算,基于互联网的应用最容易迁移到云上,因为没出现云这个名词之前,他们已经在上面了),基本所有成熟的公有云都提供了对象存储产品,不管是国内还是国外。对象存储常见的适配应用如网盘、媒体娱乐,医疗PACS,气象,归档等数据量超大而又相对“冷数据”和非在线处理的应用类型。这类应用单个数据大,总量也大,适合对象存储海量和易扩展的特点。网盘类应用也差不多,数据总量很大,另外还有并发访问量也大,支持10万级用户访问这种需求就值得单列一个项目了(这方面的扫盲可以想想12306)。归档类应用只是数据量大的冷数据,并发访问的需求倒是不太突出。另外基于移动端的一些新兴应用也是适合的,智能手机和移动互联网普及的情况下,所谓UGD(用户产生的数据,手机的照片视频)总量和用户数都是很大挑战。毕竟直接使用HTTP get/put就能直接实现数据存取,对移动应用来说还是有一定吸引力的。对象存储的访问通常是在互联网,走HTTP协议,性能方面,单独看一个连接的是不高的(还要解决掉线断点续传之类的可靠性问题),主要强大的地方是支持的并发数量,聚合起来的性能带宽就非常可观了。

    3.png

    3.png

     

    从产品形态上来看,块存储和文件存储都是成熟产品,各种规格形态的硬件已经是琳琅满目了。但是对象存储通常你看到都是一堆服务器或者增强型服务器,毕竟这东西现在还是互联网行业用得多点,DIY风格。

    关于性能容量等方面,我做了个图,对三种存储做直观对比。

    4.png

    4.png

     

    块存储就像超跑,根本不在意能不能多载几个人,要的就是极限速度和高速下的稳定性和可靠性,各大厂商出新产品都要去纽北赛道刷个单圈最快纪录,千方百计就为提高一两秒,跑不进7分以内都看不到前三名。(块存储容量也不大,TB这个数量级,支持的应用和适用的环境也比较专业(FC+Oracle),在乎的都是IOPS的性能值,厂商出新产品也都想去刷个SPC-1,测得好的得意洋洋,测得不好自动忽略。)
    文件存储像集卡,普适各种场合,又能装数据(数百TB),而且兼容性好,只要你是文件,各种货物都能往里塞,在不超过性能载荷的前提下,能拉动常见的各种系统。标准POXIS接口,后车门打开就能装卸。卡车也不挑路,不像块存储非要上赛道才能开,普通的千兆公路就能畅通无阻。速度虽然没有块存储超跑那么块,但跑个80/100码还是稳稳当当.
    而对象存储就像海运货轮,应对的是"真.海量",几十上百PB的数据,以集装箱/container(桶/bucket)为单位码得整整齐齐,里面装满各种对象数据,十万客户发的货(数据),一条船就都处理得过来,按照键值(KeyVaule)记得清清楚楚。海运速度慢是慢点,有时候遇到点网络风暴还不稳定,但支持断点续传,最终还是能安全送达的,对大宗货物尤其是非结构化数据,整体上来看是最快捷便利的。

    从访问方式来说,块存储通常都是通过光纤网络连接,服务器/小机上配置FC光纤HBA卡,通过光纤交换机连接存储(IP SAN可以通过千兆以太网,以iSCSI客户端连接存储),主机端以逻辑卷(Volume)的方式访问。连接成功后,应用访问存储是按起始地址,偏移量Offset的方法来访问的。
    而NAS文件存储通常只要是局域网内,千兆/百兆的以太网环境皆可。网线连上,服务器端通过操作系统内置的NAS客户端,如NFS/CIFS/FTP客户端挂载存储成为一个本地的文件夹后访问,只要符合POXIS标准,应用就可以用标准的open,seek, write/read,close这些方法对其访问操作。
    对象存储不在乎网络,而且它的访问比较有特色,只能存取删(put/get/delete),不能打开修改存盘。只能取下来改好后上传,去覆盖原对象。//因为中间是不可靠的互联网啊,不能保证你在修改时候不掉线啊。所谓你在这头,对象在那头,所爱对象隔山海,山海不可平。

    另外再说一点分布式存储的问题,以上三种存储都可以和分布式概念结合,成为分布式文件系统,分布式块存储,还有天生分布式的对象存储。
    对象存储的定义就把元数据管理和数据存储访问分开在不同的节点上,多个节点应对多并发的访问,这自然就是一个分布式的存储产品。而分布式文件系统就很多了,各种开源闭源的产品数得出几十个,在不同的领域各有应用。至于分布式的块存储产品就比较少,也很难做好。我个人认为这个产品形态有点违和,分布式的思想和块存储的设计追求其实是冲突的。前面讲过,块存储主要是图快,一上分布式肯定严重拖后腿,既然都分布开了,节点之间的通信必然增加额外负担,再加上CAP,为了保持一致性牺牲响应速度,得到的好处就是扩展性。这就像把超跑弄个铁索连环,哪里还可能跑出高速?链条比车都重了,穿起来当火车开吗?
    而文件存储原来也就是集装箱货车,大家连起来扮火车还是有可行性的。

    转载于:https://www.cnblogs.com/sylar5/p/11520149.html

    展开全文
  • spring的优缺点

    千次阅读 2018-11-10 14:57:32
    再来看看Spring有哪些缺点 1.jsp中要写很多代码、控制器过于灵活,缺少一个公用控制器 2.Spring不支持分布式,这也是EJB仍然在用的原因之一。 首先Spring 是一个框架,使用Spring并不代表代码质量的提高,就像...

    大部分项目都少不了spring的身影,为什么大家对他如此青睐,而且对他的追捧丝毫没有减退之势呢

    我们看一个框架是否优秀,首先看这个框架是否是非侵入式的,其次是可扩展性,再次是解耦性和开发周期。

    Spring是什么?

    Spring是一个轻量级的DI和AOP容器框架。

    说它轻量级有一大部分原因是相对与EJB的(虽然本人从没有接触过EJB的应用),重要的是,Spring是非侵入式的(所谓非侵入式就是远程调试 而不植入,spring不再用new的方式来创建对象,而是使用依赖注入的方式),基于spring开发的应用一般不依赖于spring的类。

    DI:称作依赖注入(Dependency Injection),和控制反转一个概念,具体的讲,当一个角色需要另外一个角色协助的时候,在传统的程序设计中,通常有调用者来创建被调用者的实例。但是在spring中创建被调用者将不再有调用者完成,因此叫控制反转。创建被调用对象有Spring来完成,在容器实例化对象的时候主动的将被调用者(或者说它的依赖对象)注入给调用对象,因此又叫依赖注入。

    AOP:Spring对面向切面编程提供了强有力的支持,通过它让我们将业务逻辑从应用服务(如事务管理)中分离出来,实现了高内聚开发(所谓高内聚是指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则。),应用对象只关注业务逻辑,不再负责其它系统问题(如日志、事务等)。Spring支持用户自定义切面。

    面向切面编程是面向对象编程的有力补充。面向对象编程将程序分成各个层次的对象,面向切面的程序将运行过程分解成各个切面。AOP是从运行程序的角度去考虑程序的结构,提取业务处理过程的切面,OOP是静态的抽象,AOP是动态的抽象,是对应用执行过程的步骤进行抽象,从而获得步骤之间的逻辑划分。

    容器:Spring是个容器,因为它包含并且管理应用对象的生命周期和配置。如对象的创建、销毁、回调等。

    框架:Spring作为一个框架,提供了一些基础功能,(如事务管理,持久层集成等),使开发人员更专注于开发应用逻辑。

    看完了Spring是什么,再来看看Spring有哪些优点

    1.使用Spring的IOC容器,将对象之间的依赖关系交给Spring,降低组件之间的耦合性,让我们更专注于应用逻辑

    2.可以提供众多服务,事务管理,WS等。

    3.AOP的很好支持,方便面向切面编程。

    4.对主流的框架提供了很好的集成支持,如hibernate,Struts2,JPA等

    5.Spring DI机制降低了业务对象替换的复杂性。

    6.Spring属于低侵入,代码污染极低。

    7.Spring的高度可开放性,并不强制依赖于Spring,开发者可以自由选择Spring部分或全部

    再来看看Spring有哪些缺点

    1.jsp中要写很多代码、控制器过于灵活,缺少一个公用控制器

    2.Spring不支持分布式,这也是EJB仍然在用的原因之一。

    首先Spring 是一个框架,使用Spring并不代表代码质量的提高,就像盖房子选择用上海的地皮还是北京的地皮一样,房子质量与土地所在的城市无关,与房子的具体设计方案和选料有关。
    使用Spring 等框架可以简化很多基础性的工作,配置好后可以方便构建业务应用。

    框架使用多了会有局限的感觉,像小鸟被套在笼子里,无法飞出去,虽然在笼子里面吃喝不愁。目前编程的门槛越来越低,诸多开源框架广泛传播,几乎没有什么技术门槛,会配置就会编程,而一个好的DBA对软件性能会有很大提高,软件的核心逻辑最终会转移到对数据库的操作上,而且对目前从事的工作来讲,感觉技术的瓶颈越来越多的局限在对数据库的操作上,下一步要认真提高下了。

    Spring的优势不言而喻:

    1. 提供了一种管理对象的方法,可以把中间层对象有效地组织起来。一个完美的框架“黏合剂”。

    2. 采用了分层结构,可以增量引入到项目中。

    3. 有利于面向接口编程习惯的养成。

    4. 目的之一是为了写出易于测试的代码。

    5. 非侵入性,应用程序对Spring API的依赖可以减至最小限度。

    6. 一致的数据访问介面。

    6. 一个轻量级的架构解决方案。

    对Spring的理解

    Spring致力于使用POJOs来构建应用程序。由框架提供应用程序的基础设施,将只含有业务逻辑的POJOs作为组件来管理。从而在应用程序中形成两条相对独立发展的平行线,并且在各自的抽象层面上延长了各自的生命周期。

    Spring的工作基础是Ioc。Ioc将创建对象的职责从应用程序代码剥离到了框架中,通常2中注入方式:setter 和 ctor参数。

    每个Bean定义被当作一个POJO(通过类名和JavaBean的初始属性或构造方法参数两种方式定义的Bean)。

    Spring的核心在org.springframework.beans,更高抽象层面是BeanFactory. BeanFactory是一个非常轻量级的容器。

    关于可维护性的思考

    Spring之类的技术确实带来了应用系统的可维护性的提高吗?

    Ioc, AOP之类的技术,本质上都是将原本位于应用程序代码中"硬编码"逻辑,剥离出来放到了配置文件中(或者其他形式)。主流声音都是认为提高了应用程序的可维护性。

    但如果从以下方面观察,结合项目实际经验,个人感觉这些技术的应用大大降低了应用程序的可维护性,尤其是面对一个陌生的系统,或者项目人员变动频繁的时候。

    1. 中断了应用程序的逻辑,使代码变得不完整,不直观。此时单从Source无法完全把握应用的所有行为。

    2. 将原本应该代码化的逻辑配置化,增加了出错的机会以及额外的负担。

    3. 时光倒退,失去了IDE的支持。在目前IDE功能日益强大的时代,以往代码重构等让人头痛的举动越来越容易。而且IDE还提供了诸多强大的辅助功能,使得编程的门槛降低很多。通常来说,维护代码要比维护配置文件,或者配置文件+代码的混合体要容易的多。

    4. 调试阶段不直观,后期的bug对应阶段,不容易判断问题所在。

    首先Spring 是一个框架,使用Spring并不代表代码质量的提高,就像盖房子选择用上海的地皮还是北京的地皮一样,房子质量与土地所在的城市无关,与房子的具体设计方案和选料有关。
    使用Spring 等框架可以简化很多基础性的工作,配置好后可以方便构建业务应用。

    框架使用多了会有局限的感觉,像小鸟被套在笼子里,无法飞出去,虽然在笼子里面吃喝不愁。目前编程的门槛越来越低,诸多开源框架广泛传播,几乎没有什么技术门槛,会配置就会编程,而一个好的DBA对软件性能会有很大提高,软件的核心逻辑最终会转移到对数据库的操作上,而且对目前从事的工作来讲,感觉技术的瓶颈越来越多的局限在对数据库的操作上,下一步要认真提高下了。

    Spring的优势不言而喻:

    1. 提供了一种管理对象的方法,可以把中间层对象有效地组织起来。一个完美的框架“黏合剂”。

    2. 采用了分层结构,可以增量引入到项目中。

    3. 有利于面向接口编程习惯的养成。

    4. 目的之一是为了写出易于测试的代码。

    5. 非侵入性,应用程序对Spring API的依赖可以减至最小限度。

    6. 一致的数据访问介面。

    6. 一个轻量级的架构解决方案。

    对Spring的理解

    Spring致力于使用POJOs来构建应用程序。由框架提供应用程序的基础设施,将只含有业务逻辑的POJOs作为组件来管理。从而在应用程序中形成两条相对独立发展的平行线,并且在各自的抽象层面上延长了各自的生命周期。

    Spring的工作基础是Ioc。Ioc将创建对象的职责从应用程序代码剥离到了框架中,通常2中注入方式:setter 和 ctor参数。

    每个Bean定义被当作一个POJO(通过类名和JavaBean的初始属性或构造方法参数两种方式定义的Bean)。

    Spring的核心在org.springframework.beans,更高抽象层面是BeanFactory. BeanFactory是一个非常轻量级的容器。

    关于可维护性的思考

    Spring之类的技术确实带来了应用系统的可维护性的提高吗?

    Ioc, AOP之类的技术,本质上都是将原本位于应用程序代码中"硬编码"逻辑,剥离出来放到了配置文件中(或者其他形式)。主流声音都是认为提高了应用程序的可维护性。

    但如果从以下方面观察,结合项目实际经验,个人感觉这些技术的应用大大降低了应用程序的可维护性,尤其是面对一个陌生的系统,或者项目人员变动频繁的时候。

    1. 中断了应用程序的逻辑,使代码变得不完整,不直观。此时单从Source无法完全把握应用的所有行为。

    2. 将原本应该代码化的逻辑配置化,增加了出错的机会以及额外的负担。

    3. 时光倒退,失去了IDE的支持。在目前IDE功能日益强大的时代,以往代码重构等让人头痛的举动越来越容易。而且IDE还提供了诸多强大的辅助功能,使得编程的门槛降低很多。通常来说,维护代码要比维护配置文件,或者配置文件+代码的混合体要容易的多。

    4. 调试阶段不直观,后期的bug对应阶段,不容易判断问题所在。

    作者:痴情的稀饭
    来源:CSDN
    原文:https://blog.csdn.net/xingxiupaioxue/article/details/68943036
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • (2)对处理大数据集,该算法是相对可伸缩的和高效率的,因为它的复杂度大约是O(nkt),其中n是所有对象的数目,k是簇的数目,t是迭代的次数。通常k。这个算法通常局部收敛。 (3)算法尝试找出使平方误差函数值...

    https://www.toutiao.com/a6706432431647359491/

     

     

    2019-06-25 19:43:14

    朴素贝叶斯:

    1. 如果给出的特征向量长度可能不同,这是需要归一化为通长度的向量(这里以文本分类为例),比如说是句子单词的话,则长度为整个词汇量的长度,对应位置是该单词出现的次数。

    2. 计算公式如下:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

    其中一项条件概率可以通过朴素贝叶斯条件独立展开。要注意一点就是

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

    的计算方法,而由朴素贝叶斯的前提假设可知,

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

    =

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

    ,因此一般有两种,一种是在类别为ci的那些样本集中,找到wj出现次数的总和,然后除以该样本的总和;第二种方法是类别为ci的那些样本集中,找到wj出现次数的总和,然后除以该样本中所有特征出现次数的总和。

    3. 如果

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

    中的某一项为0,则其联合概率的乘积也可能为0,即2中公式的分子为0,为了避免这种现象出现,一般情况下会将这一项初始化为1,当然为了保证概率相等,分母应对应初始化为2(这里因为是2类,所以加2,如果是k类就需要加k,术语上叫做laplace光滑, 分母加k的原因是使之满足全概率公式)。

    朴素贝叶斯的优点:对小规模的数据表现很好,适合多分类任务,适合增量式训练。

    缺点:对输入数据的表达形式很敏感。

     

    决策树:决策树中很重要的一点就是选择一个属性进行分枝,因此要注意一下信息增益的计算公式,并深入理解它。

    信息熵的计算公式如下:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

    其中的n代表有n个分类类别(比如假设是2类问题,那么n=2)。分别计算这2类样本在总样本中出现的概率p1和p2,这样就可以计算出未选中属性分枝前的信息熵。

    现在选中一个属性xi用来进行分枝,此时分枝规则是:如果xi=vx的话,将样本分到树的一个分支;如果不相等则进入另一个分支。很显然,分支中的样本很有可能包括2个类别,分别计算这2个分支的熵H1和H2,计算出分枝后的总信息熵H’=p1*H1+p2*H2.,则此时的信息增益ΔH=H-H’。以信息增益为原则,把所有的属性都测试一边,选择一个使增益最大的属性作为本次分枝属性。

    决策树的优点:计算量简单,可解释性强,比较适合处理有缺失属性值的样本,能够处理不相关的特征;

    缺点:容易过拟合(后续出现了随机森林,减小了过拟合现象)。

     

    Logistic回归:Logistic是用来分类的,是一种线性分类器,需要注意的地方有:

    1. logistic函数表达式为:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

    其导数形式为:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

    2. logsitc回归方法主要是用最大似然估计来学习的,所以单个样本的后验概率为:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

    到整个样本的后验概率:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

    其中:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

    通过对数进一步化简为:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

     

    3. 其实它的loss function为-l(θ),因此我们需使loss function最小,可采用梯度下降法得到。梯度下降法公式为:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

    Logistic回归优点:

    1. 实现简单

    2. 分类时计算量非常小,速度很快,存储资源低;

    缺点:

    1. 容易欠拟合,一般准确度不太高

    2. 只能处理两分类问题(在此基础上衍生出来的softmax可以用于多分类),且必须线性可分;

     

    线性回归:

    线性回归才是真正用于回归的,而不像logistic回归是用于分类,其基本思想是用梯度下降法对最小二乘法形式的误差函数进行优化,当然也可以用normal equation直接求得参数的解,结果为:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

    而在LWLR(局部加权线性回归)中,参数的计算表达式为:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

    因为此时优化的是:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

    由此可见LWLR与LR不同,LWLR是一个非参数模型,因为每次进行回归计算都要遍历训练样本至少一次。

    线性回归优点:实现简单,计算简单;

    缺点:不能拟合非线性数据;

     

    KNN算法:KNN即最近邻算法,其主要过程为:

    1. 计算训练样本和测试样本中每个样本点的距离(常见的距离度量有欧式距离,马氏距离等);

    2. 对上面所有的距离值进行排序;

    3. 选前k个最小距离的样本;

    4. 根据这k个样本的标签进行投票,得到最后的分类类别;

    如何选择一个最佳的K值,这取决于数据。一般情况下,在分类时较大的K值能够减小噪声的影响。但会使类别之间的界限变得模糊。一个较好的K值可通过各种启发式技术来获取,比如,交叉验证。另外噪声和非相关性特征向量的存在会使K近邻算法的准确性减小。

    近邻算法具有较强的一致性结果。随着数据趋于无限,算法保证错误率不会超过贝叶斯算法错误率的两倍。对于一些好的K值,K近邻保证错误率不会超过贝叶斯理论误差率。

    注:马氏距离一定要先给出样本集的统计性质,比如均值向量,协方差矩阵等。关于马氏距离的介绍如下:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

     

    KNN算法的优点:

    1. 思想简单,理论成熟,既可以用来做分类也可以用来做回归;

    2. 可用于非线性分类;

    3. 训练时间复杂度为O(n);

    4. 准确度高,对数据没有假设,对outlier不敏感;

    缺点:

    1. 计算量大;

    2. 样本不平衡问题(即有些类别的样本数量很多,而其它样本的数量很少);

    3. 需要大量的内存;

     

    SVM:

    要学会如何使用libsvm以及一些参数的调节经验,另外需要理清楚svm算法的一些思路:

    1. svm中的最优分类面是对所有样本的几何裕量最大(为什么要选择最大间隔分类器,请从数学角度上说明?网易深度学习岗位面试过程中有被问到。答案就是几何间隔与样本的误分次数间存在关系:

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

    ,其中的分母就是样本到分类间隔距离,分子中的R是所有样本中的最长向量值),即:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

     

    经过一系列推导可得为优化下面原始目标:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

    2. 下面来看看拉格朗日理论:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

    可以将1中的优化目标转换为拉格朗日的形式(通过各种对偶优化,KKD条件),最后目标函数为:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

    我们只需要最小化上述目标函数,其中的α为原始优化问题中的不等式约束拉格朗日系数。

    3. 对2中最后的式子分别w和b求导可得:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

    由上面第1式子可以知道,如果我们优化出了α,则直接可以求出w了,即模型的参数搞定。而上面第2个式子可以作为后续优化的一个约束条件。

    4. 对2中最后一个目标函数用对偶优化理论可以转换为优化下面的目标函数:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

    而这个函数可以用常用的优化方法求得α,进而求得w和b。

    5. 按照道理,svm简单理论应该到此结束。不过还是要补充一点,即在预测时有:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

    那个尖括号我们可以用核函数代替,这也是svm经常和核函数扯在一起的原因。

    6. 最后是关于松弛变量的引入,因此原始的目标优化公式为:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

    此时对应的对偶优化公式为:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

    与前面的相比只是α多了个上界。

    SVM算法优点:

    1. 可用于线性/非线性分类,也可以用于回归;

    2. 低泛化误差;

    3. 容易解释;

    4. 计算复杂度较低;

    缺点:

    1. 对参数和核函数的选择比较敏感;

    2. 原始的SVM只比较擅长处理二分类问题;

     

    Boosting:

    主要以Adaboost为例,首先来看看Adaboost的流程图,如下:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

    从图中可以看到,在训练过程中我们需要训练出多个弱分类器(图中为3个),每个弱分类器是由不同权重的样本(图中为5个训练样本)训练得到(其中第一个弱分类器对应输入样本的权值是一样的),而每个弱分类器对最终分类结果的作用也不同,是通过加权平均输出的,权值见上图中三角形里面的数值。那么这些弱分类器和其对应的权值是怎样训练出来的呢?

    下面通过一个例子来简单说明,假设的是5个训练样本,每个训练样本的维度为2,在训练第一个分类器时5个样本的权重各为0.2. 注意这里样本的权值和最终训练的弱分类器组对应的权值α是不同的,样本的权重只在训练过程中用到,而α在训练过程和测试过程都有用到。

    现在假设弱分类器是带一个节点的简单决策树,该决策树会选择2个属性(假设只有2个属性)的一个,然后计算出这个属性中的最佳值用来分类。

    Adaboost的简单版本训练过程如下:

    1. 训练第一个分类器,样本的权值D为相同的均值。通过一个弱分类器,得到这5个样本(请对应书中的例子来看,依旧是machine learning in action)的分类预测标签。与给出的样本真实标签对比,就可能出现误差(即错误)。如果某个样本预测错误,则它对应的错误值为该样本的权重,如果分类正确,则错误值为0. 最后累加5个样本的错误率之和,记为ε。

    2. 通过ε来计算该弱分类器的权重α,公式如下:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

    3. 通过α来计算训练下一个弱分类器样本的权重D,如果对应样本分类正确,则减小该样本的权重,公式为:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

    如果样本分类错误,则增加该样本的权重,公式为:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

    4. 循环步骤1,2,3来继续训练多个分类器,只是其D值不同而已。

    测试过程如下:

    输入一个样本到训练好的每个弱分类中,则每个弱分类都对应一个输出标签,然后该标签乘以对应的α,最后求和得到值的符号即为预测标签值。

    Boosting算法的优点:

    1. 低泛化误差;

    2. 容易实现,分类准确率较高,没有太多参数可以调;

    3. 缺点:

    4. 对outlier比较敏感;

     

    聚类:

    根据聚类思想划分:

    1. 基于划分的聚类:

    K-means, k-medoids(每一个类别中找一个样本点来代表),CLARANS.

    k-means是使下面的表达式值最小:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

    k-means算法的优点:

    (1)k-means算法是解决聚类问题的一种经典算法,算法简单、快速。

    (2)对处理大数据集,该算法是相对可伸缩的和高效率的,因为它的复杂度大约是O(nkt),其中n是所有对象的数目,k是簇的数目,t是迭代的次数。通常k<<n。这个算法通常局部收敛。

    (3)算法尝试找出使平方误差函数值最小的k个划分。当簇是密集的、球状或团状的,且簇与簇之间区别明显时,聚类效果较好。

    缺点:

    (1)k-平均方法只有在簇的平均值被定义的情况下才能使用,且对有些分类属性的数据不适合。

    (2)要求用户必须事先给出要生成的簇的数目k。

    (3)对初值敏感,对于不同的初始值,可能会导致不同的聚类结果。

    (4)不适合于发现非凸面形状的簇,或者大小差别很大的簇。

    (5)对于"噪声"和孤立点数据敏感,少量的该类数据能够对平均值产生极大影响。

    2. 基于层次的聚类:

    自底向上的凝聚方法,比如AGNES。

    自上向下的分裂方法,比如DIANA。

    3. 基于密度的聚类:DBSACN,OPTICS,BIRCH(CF-Tree),CURE.

    4. 基于网格的方法:STING, WaveCluster.

    5. 基于模型的聚类:EM,SOM,COBWEB.

    推荐系统:推荐系统的实现主要分为两个方面:基于内容的实现和协同滤波的实现。

    基于内容的实现:不同人对不同电影的评分这个例子,可以看做是一个普通的回归问题,因此每部电影都需要提前提取出一个特征向量(即x值),然后针对每个用户建模,即每个用户打的分值作为y值,利用这些已有的分值y和电影特征值x就可以训练回归模型了(最常见的就是线性回归)。

    这样就可以预测那些用户没有评分的电影的分数。(值得注意的是需对每个用户都建立他自己的回归模型)

    从另一个角度来看,也可以是先给定每个用户对某种电影的喜好程度(即权值),然后学出每部电影的特征,最后采用回归来预测那些没有被评分的电影。

     

    当然还可以是同时优化得到每个用户对不同类型电影的热爱程度以及每部电影的特征。

    基于协同滤波的实现:协同滤波(CF)可以看做是一个分类问题,也可以看做是矩阵分解问题。协同滤波主要是基于每个人自己的喜好都类似这一特征,它不依赖于个人的基本信息。

    比如刚刚那个电影评分的例子中,预测那些没有被评分的电影的分数只依赖于已经打分的那些分数,并不需要去学习那些电影的特征。

    SVD将矩阵分解为三个矩阵的乘积,公式如下所示:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

    中间的矩阵sigma为对角矩阵,对角元素的值为Data矩阵的奇异值(注意奇异值和特征值是不同的),且已经从大到小排列好了。即使去掉特征值小的那些特征,依然可以很好的重构出原始矩阵。如下图所示:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

    其中更深的颜色代表去掉小特征值重构时的三个矩阵。

    果m代表商品的个数,n代表用户的个数,则U矩阵的每一行代表商品的属性,现在通过降维U矩阵(取深色部分)后,每一个商品的属性可以用更低的维度表示(假设为k维)。这样当新来一个用户的商品推荐向量X,则可以根据公式X'*U1*inv(S1)得到一个k维的向量,然后在V’中寻找最相似的那一个用户(相似度测量可用余弦公式等),根据这个用户的评分来推荐(主要是推荐新用户未打分的那些商品)。

     

    pLSA:由LSA发展过来,而早期LSA的实现主要是通过SVD分解。pLSA的模型图如下

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

    公式中的意义如下:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

     

    LDA主题模型,概率图如下:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

    和pLSA不同的是LDA中假设了很多先验分布,且一般参数的先验分布都假设为Dirichlet分布,其原因是共轭分布时先验概率和后验概率的形式相同。

     

    GDBT:GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),好像在阿里内部用得比较多(所以阿里算法岗位面试时可能会问到),它是一种迭代的决策树算法,该算法由多棵决策树组成,所有树的输出结果累加起来就是最终答案。

    它在被提出之初就和SVM一起被认为是泛化能力(generalization)较强的算法。近些年更因为被用于搜索排序的机器学习模型而引起大家关注。

    GBDT是回归树,不是分类树。其核心就在于,每一棵树是从之前所有树的残差中来学习的。为了防止过拟合,和Adaboosting一样,也加入了boosting这一项。

     

    Regularization作用是

    1. 数值上更容易求解;

    2. 特征数目太大时更稳定;

    3. 控制模型的复杂度,光滑性。复杂性越小且越光滑的目标函数泛化能力越强。而加入规则项能使目标函数复杂度减小,且更光滑。

    4. 减小参数空间;参数空间越小,复杂度越低。

    5. 系数越小,模型越简单,而模型越简单则泛化能力越强(Ng宏观上给出的解释)。

    6. 可以看成是权值的高斯先验。

     

    异常检测:可以估计样本的密度函数,对于新样本直接计算其密度,如果密度值小于某一阈值,则表示该样本异常。而密度函数一般采用多维的高斯分布。

    如果样本有n维,则每一维的特征都可以看作是符合高斯分布的,即使这些特征可视化出来不太符合高斯分布,也可以对该特征进行数学转换让其看起来像高斯分布,比如说x=log(x+c), x=x^(1/c)等。异常检测的算法流程如下:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

    其中的ε也是通过交叉验证得到的,也就是说在进行异常检测时,前面的p(x)的学习是用的无监督,后面的参数ε学习是用的有监督。那么为什么不全部使用普通有监督的方法来学习呢(即把它看做是一个普通的二分类问题)?

    主要是因为在异常检测中,异常的样本数量非常少而正常样本数量非常多,因此不足以学习到好的异常行为模型的参数,因为后面新来的异常样本可能完全是与训练样本中的模式不同。

     

    EM算法:有时候因为样本的产生和隐含变量有关(隐含变量是不能观察的),而求模型的参数时一般采用最大似然估计,由于含有了隐含变量,所以对似然函数参数求导是求不出来的,这时可以采用EM算法来求模型的参数的(对应模型参数个数可能有多个),

    EM算法一般分为2步:

    E步:选取一组参数,求出在该参数下隐含变量的条件概率值;

    M步:结合E步求出的隐含变量条件概率,求出似然函数下界函数(本质上是某个期望函数)的最大值。

    重复上面2步直至收敛,公式如下所示:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

     

    M步公式中下界函数的推导过程:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

    EM算法一个常见的例子就是GMM模型,每个样本都有可能由k个高斯产生,只不过由每个高斯产生的概率不同而已,因此每个样本都有对应的高斯分布(k个中的某一个),此时的隐含变量就是每个样本对应的某个高斯分布。

    GMM的E步公式如下(计算每个样本对应每个高斯的概率):

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

     

    更具体的计算公式为:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

     

    M步公式如下(计算每个高斯的比重,均值,方差这3个参数):

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

     

    Apriori是关联分析中比较早的一种方法,主要用来挖掘那些频繁项集合。其思想是:

    1. 如果一个项目集合不是频繁集合,那么任何包含它的项目集合也一定不是频繁集合;

    2. 如果一个项目集合是频繁集合,那么它的任何非空子集也是频繁集合;

    Aprioir需要扫描项目表多遍,从一个项目开始扫描,舍去掉那些不是频繁的项目,得到的集合称为L,然后对L中的每个元素进行自组合,生成比上次扫描多一个项目的集合,该集合称为C,接着又扫描去掉那些非频繁的项目,重复…

    看下面这个例子,元素项目表格:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

     

    如果每个步骤不去掉非频繁项目集,则其扫描过程的树形结构如下:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

    在其中某个过程中,可能出现非频繁的项目集,将其去掉(用阴影表示)为:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

     

    FP Growth是一种比Apriori更高效的频繁项挖掘方法,它只需要扫描项目表2次。其中第1次扫描获得当个项目的频率,去掉不符合支持度要求的项,并对剩下的项排序。第2遍扫描是建立一颗FP-Tree(frequent-patten tree)。

    接下来的工作就是在FP-Tree上进行挖掘,比如说有下表:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

    它所对应的FP_Tree如下:

     

    「收藏」人工智能中常见机器学习算法优缺点有哪些?

     

     

    然后从频率最小的单项P开始,找出P的条件模式基,用构造FP_Tree同样的方法来构造P的条件模式基的FP_Tree,在这棵树上找出包含P的频繁项集。

    依次从m,b,a,c,f的条件模式基上挖掘频繁项集,有些项需要递归的去挖掘,比较麻烦,比如m节点。

    展开全文
  •  缺点:没有面向对象易维护、易复用、易扩展   面向对象   优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护 
    面向过程 
    

      优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。 

      缺点:没有面向对象易维护、易复用、易扩展 

       面向对象 

      优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护 

      缺点:性能比面向过程低 

       面向对象程序设计的一些显著的特性包括: 

      .程序设计的重点在于数据而不是过程; 

      .程序被划分为所谓的对象; 

      .数据结构为表现对象的特性而设计; 

      .函数作为对某个对象数据的操作,与数据结构紧密的结合在一起; 

      .数据被隐藏起来,不能为外部函数访问; 

      .对象之间可以通过函数沟通; 

      .新的数据和函数可以在需要的时候轻而易举的添加进来; 

      .在程序设计过程中遵循由下至上(bottom-up)的设计方法。 

      面向对象程序设计在程序设计模式中是一个新的概念,对于不同的人可能意味着不同的内容。我们对面向对象程序设计的定义是"面向对象程序设计是一种方法,这种方法为数据和函数提供共同的独立内存空间,这些数据和函数可以作为模板以便在需要时创建类似模块的拷贝。这样的程序设计方法称为面向对象程序设计。" 

      从以上定义可以看到,一个对象被认为是计算机内存中的一个独立区间,在这个区间中保存着数据和能够访问数据的一组操作。因为内存区间是相互独立的,所以对象可以不经修改就应用于多个不同的程序中。 

       什么是面向对象程序设计? 

      面向对象程序设计(OOP)技术汲取了结构化程序设计中好的思想,并将这些思想与一些新的、强大的理念相结合,从而给你的程序设计工作提供了一种全新的方法。通常,在面向对象的程序设计风格中,你会将一个问题分解为一些相互关联的子集,每个子集内部都包含了相关的数据和函数。同时,你会以某种方式将这些子集分为不同等级,而一个对象就是已定义的某个类型的变量。当你定义了一个对象,你就隐含的创建了一个新的数据类型。 

       对象 

      在一个面向对象的系统中,对象是运行期的基本实体。它可以用来表示一个人或者说一个银行帐户,一张数据表格,或者其它什么需要被程序处理的东西。它也可以用来表示用户定义的数据,例如一个向量,时间或者列表。在面向对象程序设计中,问题的分析一般以对象及对象间的自然联系为依据。如前所述,对象在内存中占有一定空间,并且具有一个与之关联的地址,就像Pascal中的record和 C中的结构一样。 

      当一个程序运行时,对象之间通过互发消息来相互作用。例如,程序中包含一个"customer"对象和一个 "account"对象,而customer对象可能会向account对象发送一个消息,查询其银行帐目。每个对象都包含数据以及操作这些数据的代码。即使不了解彼此的数据和代码的细节,对象之间依然可以相互作用,所要了解的只是对象能够接受的消息的类型,以及对象返回的响应的类型,虽然不同的人会以不同的方法实现它们。 

       类 

      我们刚才提到,对象包含数据以及操作这些数据的代码。一个对象所包含的所有数据和代码可以通过类来构成一个用户定义的数据类型。事实上,对象就是类类型(class type)的变量。一旦定义了一个类,我们就可以创建这个类的多个对象,每个对象与一组数据相关,而这组数据的类型在类中定义。因此,一个类就是具有相同类型的对象的抽象。例如,芒果、苹果和桔子都是fruit类的对象。类是用户定义的数据类型,但在一个程序设计语言中,它和内建的数据类型行为相同。比如创建一个类对象的语法和创建一个整数对象的语法一模一样。 

       数据抽象和封装 

      把数据和函数包装在一个单独的单元(称为类)的行为称为封装。数据封装是类的最典型特点。数据不能被外界访问,只能被封装在同一个类中的函数访问。这些函数提供了对象数据和程序之间的接口。避免数据被程序直接访问的概念被称为"数据隐藏"。 

      抽象指仅表现核心的特性而不描述背景细节的行为。类使用了抽象的概念,并且被定义为一系列抽象的属性如尺寸、重量和价格,以及操作这些属性的函数。类封装了将要被创建的对象的所有核心属性。因为类使用了数据抽象的概念,所以它们被称为抽象数据类型(ADT)。 

      封装 


      封装机制将数据和代码捆绑到一起,避免了外界的干扰和不确定性。它同样允许创建对象。简单的说,一个对象就是一个封装了数据和操作这些数据的代码的逻辑实体。 

      在一个对象内部,某些代码和(或)某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。 

       继承 

      继承是可以让某个类型的对象获得另一个类型的对象的属性的方法。它支持按级分类的概念。例如,知更鸟属于飞鸟类,也属于鸟类。这种分类的原则是,每一个子类都具有父类的公共特性。 

      在 OOP中,继承的概念很好的支持了代码的重用性(reusability),也就是说,我们可以向一个已经存在的类中添加新的特性,而不必改变这个类。这可以通过从这个已存在的类派生一个新类来实现。这个新的类将具有原来那个类的特性,以及新的特性。而继承机制的魅力和强大就在于它允许程序员利用已经存在的类(接近需要,而不是完全符合需要的类),并且可以以某种方式修改这个类,而不会影响其它的东西。 

      注意,每个子类只定义那些这个类所特有的特性。而如果没有按级分类,每类都必须显式的定义它所有的特性。 

       多态 

      多态是OOP的另一个重要概念。多态的意思是事物具有不同形式的能力。举个例子,对于不同的实例,某个操作可能会有不同的行为。这个行为依赖于所要操作数据的类型。比如说加法操作,如果操作的数据是数,它对两个数求和。如果操作的数据是字符串,则它将连接两个字符串。 

      多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。多态在实现继承的过程中被广泛应用。 

      面向对象程序设计语言支持多态,术语称之为"on e interface multiple method(一个接口,多个实现)"。简单来说,多态机制允许通过相同的接口引发一组相关但不相同的动作,通过这种方式,可以减少代码的复杂度。在某个特定的情况下应该作出怎样的动作,这由编译器决定,而不需要程序员手工干预。 

      在多函数程序中,许多重要的数据被声明为全局变量,这样它们才可以被所有的函数访问。每个函数又可以具有它自己的局部变量。全局变量很容易被某个函数不经意之间改变。而在一个大程序中,很难分辨每个函数都使用了哪些变量。如果我们需要修改某个外部数据的结构,我们就要修改所有访问这个数据的函数。这很容易导致bug的产生。 

      在结构化程序设计中,另一个严重的缺陷是不能很好的模拟真实世界的问题。这是因为函数都是面向过程的,而不是真正的对应于问题中的各个元素。 

       面向过程的程序设计的一些特点如下  

      .强调做(算法); 

      .大程序被分隔为许多小程序,这些小程序称为函数; 

      .大多数函数共享全局数据; 

      .数据开放的由一个函数流向另一个函数。函数把数据从一种形式转换为另一种形式。 

      采用由上至下的程序设计方法。 

       动态绑定 

      绑定指的是将一个过程调用与相应代码链接起来的行为。动态绑定的意思是,与给定的过程调用相关联的代码只有在运行期才可知。它与多态和继承的联系极为紧密。一个多态引用的函数调用决定于这个引用的动态类型。 

       消息传递 

      一个面向对象的程序由许多对象组成,这些对象之间需要相互沟通。因此,在面向对象程序设计语言中,程序设计的主要步骤如下: 

      1、创建类,这些类定义了对象及其行为; 

      2、由类定义创建对象; 

      3、建立对象之间的通讯。 

      对象之间通过收发信息相互沟通,这一点类似于人与人之间的信息传递。信息传递的概念使得真实世界的直接模拟更易于和建立系统交流。 

      对于某个特定对象来说,消息就是请求执行某个过程,因此,消息的接收对象会调用一个函数(过程),以产生预期的结果。传递的消息的内容包括接收消息的对象的名字,需要调用的函数的名字,以及必要的信息。 

      对象就有一个生命周期。它们可以被创建和销毁。只要对象正处于其生存期,就可以与其进行通讯。 

       OOP的优点 

      OOP具有许多优点,无论是对于程序设计者或者用户来说都是如此。面向对象为软件产品扩展和质量保证中的许多问题提供了解决办法。这项技术能够大大提高程序员的生产力,并可提高软件的质量以及降低其维护费用。其主要的优点陈列于下: 

      1、通过继承,我们可以大幅减少多余的代码,并扩展现有代码的用途; 

      2、我们可以在标准的模块上(这里所谓的"标准"指程序员之间彼此达成的协议)构建我们的程序,而不必一切从头开始。这可以减少软件开发时间并提高生产效率; 

      3、数据隐藏的概念帮助程序员们保护程序免受外部代码的侵袭; 

      4、允许一个对象的多个实例同时存在,而且彼此之间不会相互干扰; 

      5、允许将问题空间中的对象直接映射到程序中; 

      6、基于对象的工程可以很容易的分割为独立的部分; 

      7、以数据为中心的设计方法允许我们抓住可实现模型的更多细节; 

      8、面向对象的系统很容易从小到大逐步升级; 

      9、对象间通讯所使用的消息传递技术与外部系统接口部分的描述更简单; 

      10、更便于控制软件复杂度。 

      当需要将以上所说的所有特性有机的结合于一个面向对象系统中,它们之间的相对重要性就取决于工程的类型和程序员的喜好。为了获得上述的某些优势,必须考虑很多事情。例如,对象库必须可以被重用。技术还在不停的发展,现有的产品也会很快的更新换代。如果重用没有能够实现,那么就需要进行严格的控制和管理。 

      易于使用的开发软件往往难以编写。面向对象程序设计工具有望解决这个问题。 

       面向对象程序设计语言 

      面向对象技术并不是某个特定语言的特权。如同结构化程序设计一样,OOP概念可以在很多语言比如C和Pascal中实现。但是,当程序越来越大时,程序设计工作会变得拙劣而混乱。而一个支持OOP概念的程序设计语言则可以让一切变得简单。 

      一个语言必须支持几个主要的OOP概念才能称其是面向对象的。根据所支持的OOP特性,语言可以分为以下两类: 

      1、基于对象的程序设计语言; 

      2、面向对象的程序设计语言。 

      基于对象的程序设计语言仅支持封装和对象辨识。 

      一个面向对象的程序设计语言所要支持的重要特性如下: 

      .数据封装 

      .数据隐藏和访问机制 

      .对象的自动初始化和清除 

      .操作符重载 

      支持对象风格程序设计的语言称为基于对象的程序设计语言。它们不支持继承和动态绑定。 

      Ada就是一个典型的基于对象的程序设计语言。 

      面向对象的程序设计不仅仅包含基于对象程序设计的特性,还支持继承和动态绑定。 

      OOP的应用 

       OOP最有前途的应用领域如下 : 

      1、实时系统; 

      2、仿真和建模; 

      3、面相对象数据库; 

      4、超文本、超媒体和扩展文本; 

      5、AI和专家系统; 

      6、神经网络和并行程序设计; 

      7、决策支持和 办公 自动化系统; 

      8、CIM/CAM/CAD系统。 

      Via 

      业务逻辑比较简单的适合用面向过程,例如统计当前在线用户数,一条SQL语句就可以搞定的没有多大必要用面向对象,也没有必要用什么设计模式,那样就是简单问题复杂化了。 

      业务逻辑比较复杂的适合用面向对象,这样当需求有变化时,维护起来会比较方便。 

      面向对象的局部是面向过程的,比如某个类里面某个方法里面实际就是面向过程的,而面向过程会借用面向对象的一些优点来进行优化。 

       网上发现了一篇文章,说了一下OP与OO的不同,并且打了一个比喻,通俗易懂。 

      有人这么形容OP和OO的不同:用面向过程的方法写出来的程序是一份蛋炒饭,而用面向对象写出来的程序是一份盖浇饭。所谓盖浇饭,北京叫盖饭,东北叫烩饭,广东叫碟头饭,就是在一碗白米饭上面浇上一份盖菜,你喜欢什么菜,你就浇上什么菜。我觉得这个比喻还是比较贴切的。 

      蛋炒饭制作的细节,我不太清楚,因为我没当过厨师,也不会做饭,但最后的一道工序肯定是把米饭和鸡蛋混在一起炒匀。盖浇饭呢,则是把米饭和盖菜分别做好,你如果要一份红烧肉盖饭呢,就给你浇一份红烧肉;如果要一份青椒土豆盖浇饭,就给浇一份青椒土豆丝。 

      蛋炒饭的好处就是入味均匀,吃起来香。如果恰巧你不爱吃鸡蛋,只爱吃青菜的话,那么唯一的办法就是全部倒掉,重新做一份青菜炒饭了。盖浇饭就没这么多麻烦,你只需要把上面的盖菜拨掉,更换一份盖菜就可以了。盖浇饭的缺点是入味不均,可能没有蛋炒饭那么香。 

      到底是蛋炒饭好还是盖浇饭好呢?其实这类问题都很难回答,非要比个上下高低的话,就必须设定一个场景,否则只能说是各有所长。如果大家都不是美食家,没那么多讲究,那么从饭馆角度来讲的话,做盖浇饭显然比蛋炒饭更有优势,他可以组合出来任意多的组合,而且不会浪费。 

      盖浇饭的好处就是"菜""饭"分离,从而提高了制作盖浇饭的灵活性。饭不满意就换饭,菜不满意换菜。用软件工程的专业术语就是"可维护性"比较好,"饭" 和"菜"的耦合度比较低。蛋炒饭将"蛋""饭"搅和在一起,想换"蛋""饭"中任何一种都很困难,耦合度很高,以至于"可维护性"比较差。软件工程追求的目标之一就是可维护性,可维护性主要表现在3个方面:可理解性、可测试性和可修改性。面向对象的好处之一就是显著的改善了软件系统的可维护性。
    展开全文
  • Java知识体系最强总结(2021版)

    万次阅读 多人点赞 2019-12-18 10:09:56
    GCJ02火星坐标系,BD09百度坐标系简介与转换 https://thinkwon.blog.csdn.net/article/details/101392187 3 Lombok简介、使用、工作原理、优缺点 https://thinkwon.blog.csdn.net/article/details/101392808 4 Java...
  • C++发展概述、优缺点及应用领域

    千次阅读 2019-08-06 17:43:20
    个人观点(C++虽功能...C++是一门以C为基础发展而来的一门面向对象的高级程序设计语言,从1983年由Bjarne Stroustrup教授在贝尔实验室创立开始至今,已有30多个年头。C++从最初的C with class,经历了从C++98、C+...
  • 面向对象编程的优缺点

    千次阅读 2008-08-04 08:35:00
    如果你是程序员,在面试的时候90%的项目leader都会问你"你是怎么认识 面向对象编程 面向对象编程的优缺点能否说说"先看看 别人是怎么说的======================别人 oop的理解================================面向...
  • 今天再次与人探讨到网站图片存放话题,于是乎想起了经典的图片存放的虚拟应用程序。也就是IIS发布时候的“添加虚拟目录...此功能如今在图片共享用途上已经逐步被对象存储服务所替代。 这个功能在传统架...
  • 及其优缺点。 计算机语言发展史 第一代:计算机语言01010100010111000 第二代:汇编语⾔00000011写成汇编语⾔就是 ADD,只要还原成⼆进制, 汇编语⾔就可以被 CPU 直接执⾏,所以它是最底层的低级语⾔。 第三代:⾼...
  • 面向对象数据库和关系数据库系统之间的争论不同于70年代关系数据库和网状数据库的争论,那时的争论是在同一主要领域(即商业事务应用)中究竟是谁代替谁的问题。现在是肯定关系数据库系统基本适合商业事务处理的前提...
  • C#语言基础原理及优缺点

    万次阅读 2014-11-08 17:01:01
    C#是专门为.net程序框架而创造的语言。 .net框架有ms的.netFramework, Mono的.NetFramework。 net程序编译和执行过程中的流程图: 优点: 缺点: 总结:
  • vue和react的优缺点

    千次阅读 2020-07-24 20:30:34
    不断发展: React得到了Facebook专业开发人员的支持,他们不断寻找改进方法。 Web或移动平台: React提供React Native平台,可通过相同的React组件模型为iOS和Android开发本机呈现的应用程序。 缺点: 陡峭的学习...
  • javascript优缺点

    千次阅读 2017-06-27 11:12:08
    JavaScript是一种基于对象(Object)和事件驱动(Event Driven)并具有相对安全性的客户端脚本语言。同时也是一种广泛用于客户端Web开发的脚本语言,常用来给HTML网页添加动态功能,比如响应用户的各种操作。它最初...
  • 浅谈JPA优缺点

    万次阅读 2019-11-13 23:31:26
    ORM映射元数据,JPA支持XML和JDK 5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中; JPA的API,用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的...
  • jdbc开发优缺点

    千次阅读 2016-04-18 16:47:15
    2)缺点:代码繁琐,难以写出高质量的代码(例如:资源的释放,SQL注入安全性等) 开发者既要写业务逻辑,又要写对象的创建和销毁,必须管底层具体数据库的语法 (例如:分页)。 3)适合于超大批量数据的操作,...
  • 软件开发模型和优缺点

    万次阅读 2018-04-05 16:30:27
    因此复用性更高 喷泉模型(Fountain-Model) 以用户需求为动力,以对象为驱动的模型,主要用于采用对象技术的软件开发项目 喷泉模型与传统的结构化生存期比较,具有更多的增量和迭代性质,生存期的各个阶段可以相互...
  • Angularjs优缺点

    千次阅读 2018-09-10 14:25:17
    所有的方法和指令都在这个实例上,一个页面上可以有多个vue实例,但是angularJS的对象只能有一个; 5、angularJS是由google开发和维护的,vueJS是由个人维护的; 6、vueJS一般用于移动端的开发,而angularJS一般...
  • 机器学习常见算法优缺点汇总

    千次阅读 2018-05-20 18:50:03
    深度学习算法是对人工神经网络的发展。 在近期赢得了很多关注, 特别是百度也开始发力深度学习后, 更是在国内引起了很多关注。 在计算能力变得日益廉价的今天,深度学习试图建立大得多也复杂得多的神经网络。很多...
  • Java的设计初衷就是需要适应不断发展的环境,我们可以在类库中自由的加入新的方法,这并不会影响用户程序的执行,并且Java是通过接口来支持多重继承,比严格的类继承更具有灵活性和可扩展性。 Python的可扩展性和...
  • 客观评价golang的优缺点

    千次阅读 2019-05-21 18:19:10
    Go 语言的优点,缺点和令人厌恶的设计 Donng·2018-05-06 22:44:53· 14289 次点击 ·预计阅读时间 31 分钟·大约5小时之前开始浏览 https://studygolang.com/articles/12907?fr=sidebar 这是一个创建于2018-05-...
  • 机器学习常见算法分类,算法优缺点汇总

    万次阅读 多人点赞 2017-04-14 12:08:13
    深度学习算法是对人工神经网络的发展。 在近期赢得了很多关注, 特别是 百度也开始发力深度学习后 , 更是在国内引起了很多关注。 在计算能力变得日益廉价的今天,深度学习试图建立大得多也复杂得多的神经网络。很多...
  • C语言的缺点主要是表现在数据的封装性 上,这一点使得C在数据的安全性上做的有 很大缺陷,这也是C和 C++ 的一大区别。 2. C语言的语法限制不太严格,对变量的类 型约束不严格,影响程序的安全性,对数组 下标...
  • 各种流行编程语言的优缺点

    千次阅读 2019-04-17 20:33:00
    python作为一门高级编程语言,它的诞生虽然很偶然,但是它得到程序员的喜爱却是必然之路,以下是Python与其他编程语言的优缺点对比: 1. Python 优势:简单易学,能够把用其他语言制作的各种模块很轻松地联结在...
  • 软件体系结构表示系统的框架结构,用于从较高的层次上来描述各部分之间的关系和接口,主要包括构件、构件性质和构件之间的关系。 通过使用软件体系结构,可以有效地分析用户需求,方便系统的修改,以及减小程序构造...
  • 你知道Docker有哪些优缺点嘛?

    千次阅读 2020-05-07 23:01:22
    Docker 主要解决环境配置问题,它是一种虚拟化技术,对进程进行隔离,被隔离的进程独立于宿主操作系统和其它隔离的进程。使用 Docker 可以不修改应用程序代码,不需要开发人员学习特定环境下的技术,就能够将现有的...
  • 数据库视图、索引、存储过程优缺点 1.视图 (1).什么是视图? 视图(View)作为一种数据库对象,为用户提供了一个可以检索数据表中的数据方式。用户通过视图来浏览数据表中感兴趣的部分或全部数据,而数据的物理...
  • 分布式存储与传统存储对比优缺点

    千次阅读 2020-07-24 16:55:45
    实际上,传统阵列存储也在向软硬件分离方向发展,也是一种软件定义的存储方式,在新的方式下,统一的存储不再需要额外的添加NAS机头,用软件方式来实现。 分布式存储方面,以对象存储、软件定义存储、云存储、超...
  • Mock测试-优缺点分析

    万次阅读 2018-06-04 10:57:20
    3、Mock的优缺点分析 4、具体如何使用mock 1、什么是Mock ? 用一句通俗的语言来说: mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。  Mock ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 37,675
精华内容 15,070
关键字:

发展对象主要优缺点