精华内容
下载资源
问答
  • 【CSDN独家访谈】 做企业软件的技术人员们肯定深有体会:为客户做项目时,充分了解客户企业的...国内技术人员容易走上极端(下)   文章首发于CSDN新闻频道: http://news.csdn.net/n/20070524/104490.html
           【CSDN独家访谈】做企业软件的技术人员们肯定深有体会:为客户做项目时,充分了解客户企业的业务,对客户需求进行深入分析是一个至关重要的过程。而且如果为同一行业的很多客户企业都做过项目了,很自然会对这个行业的业务有了比较深的了解。那么,作为技术人员,是否可以更进一步去熟悉行业业务,而缓慢抛弃掉自己的技术功底和经验呢?
           我们提出一个新的概念——业务技术(business technology),即对行业业务的熟悉能力和在业务基础上进行技术分析和设计的技术能力的综合。由此引发的问题是:纯粹的技术人员是否可以转型为更为综合的业务技术人员?这样是否会在职场更具竞争力更有发展空间?为此我们CSDN特别访问了TIBCO中国研发中心高级研发工程师胡长城,他刚刚在我们CSDN的技术英雄会上获得大奖,其网名“银狐999”在网站也颇有名气。
           胡长城回答问题异常严谨认真,充分显示了技术人员的风格,很多话语都是自己的切身体验,直击目前国内一些软件企业的要害。相信这位同行的心声能给大家带来诸多启示。
     
    问:您怎么理解技术人员和业务技术人员的区别?结合最近火热的SOA来看,您觉得SOA使得技术和业务的关系发生了什么大的变化?
    答:我是这样理解技术人员和业务技术人员的区别的。技术人员更多的是指那些偏重于纯粹技术层面的开发人员,而业务技术人员更偏重于使用某些技术来解决客户所面对的业务性问题(更多的是基于某类产品或平台)。说得更直接一些,就是一个更偏技术,一个更偏业务。而业务技术人员并不能简单用“既懂技术又懂业务”来形容。存在很多偏业务型的技术人员,他们对业务理解比较深,可以在某些平台上构建出客户所需要的业务实现,但是对于真正实现层面的技术知识,却了解不是很多。
    所有的IT系统的发展,都是让业务更加与技术的具体实现脱离,或者说,让业务构建并不关心具体的技术实现。SOA是一种理念,也是遵循这个发展趋势和原则的,而且更进了一步。SOA为业务和技术之间的构架了一层“服务”和“模型”概念的桥梁。也就是说,业务并不关心其所依赖的IT系统的技术,只关心能提供支撑我某项业务实现的服务在哪里。
     
    问:您认为技术人员转向业务技术人员的价值提升主要体现在哪里?
    答:首先,我的观点是:我不认为技术人员就一定需要往业务技术人员上转。对任何开发人员来说,最重要的还是看你的兴趣,看你喜欢做什么。只有客户才是最关心业务的。
    如果一个开发人员,并不喜欢或者并不适合底层平台或底层技术的开发,那么转为业务技术人员这个职业规划应该是不错的。因为客户需要这样的业务型技术人员,帮助他们分析业务、理解业务、并且构建IT系统来支撑业务。
    业务技术人员的最大价值就是他们最清楚客户需要什么样的业务系统,并且了解构建什么特性的系统适合客户需求。
    所以,业务型技术人员,比纯粹的技术人员,更能够站在一个更高的角度看问题。我相信类似那种ARIS系统,SAP R3的系统模型,都是业务技术人员的总结结果。当然,这是一个Architect的能力范围了,单纯的普通的业务技术开发人员,是很难达到这种层面的。
     
    问:您企业的平台会帮助技术人员转变为业务技术人员吗?您认为哪方面的人才适合转变?
    答:TIBCO是一个“sell the Business integration and SOA solution”的公司,也就是说主要是提供一套产品,来服务客户企业的业务整合和提供一些解决方案型产品。这套产品本身就是面向业务技术人员的。我想“帮助”这个词值得推敲,任何平台性产品都是“强迫”其上面的开发人员最终成为业务技术人员。但是,最终直接面向客户开发的技术人员也都需要一个个适合的平台来辅助他们实现客户所期望的业务系统,这样他们可以把更多的精力放在如何把握业务上,而不是再为缓存、分布式、系统消息整合之类的基础性问题头疼。
    【CSDN/廖俊才】
     
     

    文章首发于CSDN新闻频道:http://news.csdn.net/n/20070524/104490.html

    展开全文
  • socket编程有个典型的接收发送方式:轮询方式和select侦听及管道中断方式。 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议...

    socket编程有两个典型的接收发送方式:轮询方式和select侦听及管道中断方式
    Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。而我们所说的socket编程指的是利用soket接口来实现自己的业务和协议。
    综上所述:Socke接口属于软件抽象层,而sokcket编程却是标准的应用层开发
    这里写图片描述
    OSI 七层模型通过七个层次化的结构模型(物理层,数据链路层,网络层,传输层,会话层,表示层,应用层)使不同的系统不同的网络之间实现可靠的通讯,因此其最主要的功能就是帮助不同类型的主机实现数据传输 。完成中继功能的节点通常称为中继系统。一个设备工作在哪一层,关键看它工作时利用哪一层的数据头部信息。网桥工作时,是以MAC头部来决定转发端口的,因此显然它是数据链路层的设备。
    表示层(Presentation Layer)是OSI模型的第六层,它对来自应用层的命令和数据进行解释,对各种语法赋予相应的含义,并按照一定的格式传送给会话层。其主要功能是“处理用户信息的表示问题,如编码、数据格式转换和加密解密”等。
    可以看到Socke接口处于OSI 七层模型的表示层。利用socket接口编程的代码处于应用层。
    应用层(Application Layer)是OSI参考模型的最高层,它是计算机用户,以及各种应用程序和网络之间的接口,其功能是直接向用户提供服务,完成用户希望在网络上完成的各种工作。它在其他6层工作的基础上,负责完成网络中应用程序与网络操作系统之间的联系,建立与结束使用者之间的联系,并完成网络用户提出的各种网络服务及 应用所需的监督、管理和服务等各种协议。此外,该层还负责协调各个应用程序间的工作。
    这里写图片描述
    TCP是面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于端到端的通讯。
    可以看到无论七层协议和四层协议的socket编程和TCP的三次握手都没有毛关系,都被 socket的接口函数connect一人搞定了,咱们只需要调用接口就可以了。哪些面试时经常问socket的三次握手协议是什么人都是外行。作为一个非底层的应用层开发人员,你对它知道的再清楚也没有用,只能考察面试人员的记忆能力而已。不用过于关注这些零碎的事,只要有印象就可以了,知道有这个事情就可以,具体问度娘。当然完全不知道也不好,有很多新技术并不是很难,而是最可怕的是根本一点不知道。若你有所了解,在开发时才向那方面想。所以软件开发重在接触的知识面,实际开发过项目,不是比谁记得准确。说实话我开发socket好几年,你让我背诵TCP的三次握手我也紧张,答不全。
    socket编程有两个典型的接收发送方式:

    1. 轮询方式。阻塞方式创建socket,快速轮询方式接收消息,不判断是否可写(不考虑网卡满的极端情况)直接发送消息。套接字工作流程结构图如下:
      这里写图片描述
      2.select侦听及管道中断方式。非阻塞方式建立socket,把本地管道文件描述符和socket可读文件描述符加入fd_set,用select函数侦听消息。当需要立即发送消息,通过本地管道写文件描述符写入消息。当服务器端发送过来消息或接收到本地管道消息,select立即结束等待并且返回是超时还是收到消息或socket异常。根据用函数FD_ISSET判断fd_set是管道消息还是socket消息。该种方式可以达到零延迟的效果,速度远比快速轮询方式省电和及时。第三方socket库基本都是使用的是快速轮询方式。可以看到自己写socket开发的优势很明显。
      注意:等需要长期通过select侦听消息时,不能把可写文件描述符加入fd_set由select函数监控。因为只要网卡不满,可写文件描述符号都处于可写状态,select立即结束等待,打不到等待消息的效果,当然你想发送消息时想判断网卡是否满了,就可以通过把可写文件描述符加入fd_set由select函数结合FD_ISSET来判断出来是否可写。
      这里写图片描述
      一般socket编程写出来都是一个死循环线程或进程,就是有始无终的线程或进程。所以大家也不用纠结为何服务端没有终止符号。客户端有终止符号也是在外部重新起了一个一样socket线程,让原来socket安乐死。在linux中尽量别强杀进程,不然很容易出现脏数据,尽量让它在完成所有工作进入退出入口后自然的死亡。
    展开全文
  • 不平衡学习是机器学习问题的一个重要子域,其主要关注于如何从类别分布不均衡的数据中学习数据的模式。在这篇文章中我们主要关注不平衡分类问题,特别地,我们主要关注类别极端不平衡...
        

    不平衡学习是机器学习问题的一个重要子域,其主要关注于如何从类别分布不均衡的数据中学习数据的模式。在这篇文章中我们主要关注不平衡分类问题,特别地,我们主要关注类别极端不平衡场景下的二分类问题所面临的困难。

    在这篇文章中我们将:

    • 描述类别不平衡的定义与实际应用场景

    • 给出不平衡场景下常用的评价指标

    • 讨论不平衡场景下分类器学习困难的来源

    • 概览已有的不平衡学习方法并分析其优劣

    • 给出一些直觉的可视化来帮助理解不平衡学习过程

    • 给出一些场景/模型选择中的个人经验

    为简洁起见,文中出现的Min代表少数类样本(正类,positive,y=1),Maj代表多数类样本(负类,negative,y=0)

    问题概述:

    当一个分类任务的数据集中来自不同类别的样本数目相差悬殊时,我们通常称该数据集为“类别不平衡”的。以一个现实任务为例:在点击率预估(click-through rate prediction)任务中,每条展示给用户的广告都产生一条新样本,而用户最终是否点击了这条广告决定了样本的标签。显然,只有很少一部分的用户会去点击网页里的嵌入广告,这就导致最终得到的训练数据集中正/负例样本的数量差距悬殊。同样的情况也发生在很多实际应用场景中,如金融欺诈检测(正常/欺诈),医疗辅助诊断(正常/患病),网络入侵检测(正常连接/攻击连接)等等[1,2,3]。 需要注意的是,尽管少数类的样本个数更少,表示的质量也更差,但其通常会携带更重要的信息,因此一般我们更关注模型正确分类少数类样本的能力。

    分类问题的一个underlying assumption是各个类别的数据都有自己的分布,当某类数据少到难以观察结构的时候,我们可以考虑抛弃该类数据,转而学习更为明显的多数类模式,而后将不符合多数类模式的样本判断为异常/少数类,某些时候会有更好的效果。此时该问题退化为异常检测(anomaly detection)问题。

    有关异常检测 (Anomaly detection)由于只关心多数类的分布,这些方法一般为unsupervised / weakly-supervised,只使用单类别数据训练。

    基本符号:

    在二元不平衡分类中,数据集中只存在两个类别:少数类,即样本数量较少的类,与多数类,即样本数量相对较多的类别。我们使用D来表示全部训练数据样本的集合,每一个样本用(x, y)表示,其中 y ∈ {0, 1}。在二分类条件下,y取值为1代表该样本属于正类(少数类),为0则代表该样本属于负类(多数类)。

    由此我们可以定义少数类集合:640?wx_fmt=svg ‘

    及多数类集合:

    640?wx_fmt=svg 

    从而有:

    640?wx_fmt=svg

    由此,对于(高度)不平衡的数据集我们有 640?wx_fmt=svg 。为了以统一的形式描述不同数据集的不平衡程度,我们定义不平衡比IR(Imbalance Ratio)为多数类样本数量与少数类样本数量的比值:

    640?wx_fmt=svg

    模型评价准则:

    对于一般的机器学习方法,最常见的评价指标无疑是分类准确度ACC (accuracy),ACC的含义非常直观并且在通常情况下都很有效。然而对于不平衡的分类任务,ACC并不能很好地反映分类器的性能。考虑以下情况:一个含有10000条样本的数据集,其中 640?wx_fmt=svg 。此时一个将所有样本都判断成多数类样本的分类器能够获得99%的分类准确率,这是一个相当高的分数,但给一个完全无法区分出少数类样本的分类器如此高的分数显然是不合理的。由于ACC等传统评价指标的特性,在数据分布不平衡时其往往会导致分类器的输出倾向于在数据集中占多数的类别:输出多数类会带来更高的分类准确率,但在我们所关注的少数类中表现不佳。

    类别不平衡问题有一些更加合理的评价准则,这些指标通常是基于真正例TP/真负例TF/假正例FP/假负例FN的个数计算的。在二分类场景下,上述四种样本的数量可以通过计算混淆矩阵得到(见下表)。

    640?wx_fmt=jpeg

    二分类问题的混淆矩阵(Confusion Matrix)

    基于混淆矩阵我们可以使用准确率(Precision)和召回率(Recall)来评价模型在不平衡数据上的分类精度。F-score(F1)和G-mean(GM)是准确率和召回率的调和平均值 [4,5]。MCC [6](Matthews correlation coefficient,即马修斯相关系数)考虑了各种样本的个数,是一个在类别平衡或不平衡下都可使用的评价指标。 AUCPRC [7](Area Under Curve of Precision-Recall Curve)指准确率-召回率曲线下的面积。这些评价准则不会被不同类别中样本的数量所影响,因此通常被认为是“无偏的”,可以在类别不平衡的场景下使用。

    • 640?wx_fmt=svg

    • 640?wx_fmt=svg

    • 640?wx_fmt=svg

    • 640?wx_fmt=svg

    • 640?wx_fmt=svg

    • 640?wx_fmt=svg

    需要注意的是一个常用的评价指标AUCROC(Area Under Receiver-Operator Characteristic curve)其实是有偏的,它不适用于不平衡场景下的模型评估[7]。

    Receiver Operator Characteristic (ROC) curves are commonly used to present results for binary decision problems in machine learning. However, when dealing with highly skewed datasets, Precision-Recall (PR) curves give a more informative picture of an algorithm's performance.

    -- Davis J, et al. The Relationship Between Precision-Recall and ROC Curves, ICML 2006

    不平衡场景下学习困难的来源:

    通常情况下,类别不平衡程度越高,数据集的分类难度越大。但在一些工作中,发现存在某些高度不平衡的数据集,在这些数据集上不加任何修改的标准学习模型(如,SVM,Decision Tree等)仍能得到很好的分类结果。显然,类别不平衡本身并不是分类困难的来源,其背后的原因需要对数据分布以及模型在训练过程中的行为进行更细致的观察。

    一些研究工作尝试说明不平衡数据集上分类困难的本质原因,这些工作认为分类困难的原因来自于数据分布中的一些本质因素。如,

    • 过多的少数类样本出现在多数类样本密集的区域 [8]

    • 类别之间的分布严重重叠(即不同类别的样本相对密集地出现在特征空间的同一区域)[8]

    • 数据中本身存在的噪声,尤其是少数类的噪声 [9]

    • 少数类分布的稀疏性(sparsity)以及稀疏性导致的拆分多个子概念(sub-concepts,可理解为子clusters)并且每个子概念仅含有较少的样本数量 [10]

    因素4又被称为small disjuncts问题。它导致分类困难的原因很直观:在同样的特征空间中,相比于只有一个cluster的简单少数类分布,具有多个子概念的少数类分布需要模型给出更复杂的决策边界来获得良好的预测。在模型复杂度不变的情况下,分类性能会因子概念个数的增多而变差。因此该问题的解决办法也较为简单:上更大容量的模型(DL: 更宽,更深,更强)。

    至于因素1、2、3,我个人认为尽管三者的成因不同,这三个因素为学习带来的困难本质上是一样的。抛开数据集本身所带有的噪声因素来考虑。因素2,类别之间的分布严重重叠,所造成的结果即过多的少数类样本出现在多数类样本密集的区域(因素3,这话反过来说也合理)。而这些嵌入在多数类样本密集区域的少数类样本即我们通常说的离群点。以我个人而言,在不平衡分类任务中,离群点和噪声点所起到的作用没有本质上的区别。因此我们将因素1、2、3都归因为一个因素:噪声。

    另外,在实际的工业应用当中,这些难度因素还会与其他实际问题一同出现,如特征中的缺失值,巨大的数据集规模等。

    640?wx_fmt=jpeg

    图1:在不同程度的类别不平衡下,分布重叠/不重叠的两个数据集。数据硬度指分类器训练完成后输出概率与ground truth label的残差(i.e., |F(x)-y|)

    最后在图1中我们给出一个直观的可视化来帮助理解类别不平衡比/类别分布重叠之间的关系:即使不平衡比相同,类别重叠/不重叠的数据集也会表现出极其不同的分类难度。深蓝色的点代表它们可以被模型很好地分类,而深红色的样本点代表模型完全无法正确分类这些数据点。

    在图1(a)中,数据集是用两个不重叠的的二维高斯分布生成的。我们可以观察到不平衡比的增长并不会影响分类该数据集的难度(图1(c))。而在图1(b)中,数据集由两个相互重叠的二维高斯混合分布生成。随着不平衡比的增加,它从一个相对简单的分类任务变成了一个极其困难的任务(图1(d))。

    已有的不平衡学习方法概览:

    标准机器学习算法假设属于不同类别的样本数量大致相似。因此类别的不均匀分布给在不平衡数据集上应用标准学习算法带来了困难:这些学习算法的设计背后隐含的优化目标是数据集上的分类准确度,而这会导致学习算法在不平衡数据上更偏向于含更多样本的多数类。多数不平衡学习(imbalance learning)算法都是为了解决这种“对多数类的偏好”而提出。

    我将已有的不平衡学习算法划分为3类:数据级方法,算法级方法以及集成方法

    • 数据级方法

    数据级方法是不平衡学习领域发展最早、影响力最大、使用最广泛的一类方法,也可称为重采样方法。该类方法关注于通过修改训练数据集以使得标准学习算法也能在其上有效训练。根据实现方式的不同,数据级方法可被进一步分类为:

    1. 从多数类别中删除样本的方法(欠采样,如RUS、NearMiss[11]、ENN[12]、Tomeklink[13]等)2. 为少数类别生成新样本的方法(过采样,如SMOTE[14],ADASYN[15],Borderline-SMOTE[16]等)3. 结合上述两种方案的混合类方法(过采样+欠采样去噪,如SMOTE+ENN[17]等)

    标准的随机重采样方法使用随机方法来选择用于预处理的目标样本。然而随机方法可能会导致丢弃含有重要信息的样本(随机欠采样)或者引入无意义的甚至有害的新样本(随机过采样),因此有一系列更高级的方法,试图根据根据数据的分布信息来在进行重采样的同时保持原有的数据结构。

    Strength: 1. 该类方法能够去除噪声/平衡类别分布在重采样后的数据集上训练可以提高某些分类器的分类性能。2. 欠采样方法减小数据集规模欠采样方法会去除一些多数类样本,从而可能降低模型训练时的计算开销。

    Weakness: 1. 采样过程计算效率低下这一系列的“高级”重采样方法通常使用基于距离的邻域关系(通常是k-最近邻方法)来提取数据分布信息。该方式的缺点是需要计算每个数据样本之间的距离,而计算距离需要的计算量随着数据集的大小呈平方级增长,因此在大规模数据集上应用这些方法可能会带来极低的计算效率。2. 易被噪声影响此外在具有高不平衡比且包含大量噪声的工业数据集中,少数类的结构可能并不能被样本的分布很好地表示。而被这些重采样方法用来提取分布信息的最近邻算法很容易被噪声干扰,因此可能无法得到准确的分布信息,从而导致不合理的重采样策略。3. 过采样方法生成过多数据当应用于大规模且高度不平衡的数据集时,过采样类的方法可能会生成大量的少数类样本以平衡数据集。这会进一步增大训练集的样本数量,增大计算开销,减慢训练速度,并可能导致过拟合。4. 不适用于无法计算距离的复杂数据集最重要的一点是这些重采样方法依赖于明确定义的距离度量,使得它们在某些数据集上不可用。在实际应用中,工业数据集经常会含有类别特征(即不分布在连续空间上的特征,如用户ID)或者缺失值,此外不同特征的取值范围可能会有巨大的差别。在这些数据集上定义合理的距离度量十分困难。

    • 算法级方法

    算法级方法专注于修改现有的标准机器学习算法以修正他们对多数类的偏好。在这类方法中最流行的分支是代价敏感学习[18,19](cost-sensitive learning),我们在此也只讨论该类算法。代价敏感学习给少数类样本分配较高的误分类代价,而给多数类样本分配较小的误分类代价。通过这种方式代价敏感学习在学习器的训练过程中人为提高了少数类别样本的重要性,以此减轻分类器对多数类的偏好。

    Strength: 1. 不增加训练复杂度使用该类算法魔改后的算法通常会有更好的表现,并且没有增加训练的计算复杂度。2. 可直接用于多分类问题该类算法通常只修改误分类代价,因此可直接扩展到多分类问题上。

    Weakness: 1. 需要领域先验知识必须注意的是,代价敏感学习中的代价矩阵(cost matrix)需要由领域专家根据任务的先验知识提供,这在许多现实问题中显然是不可用的。因此在实际应用时代价矩阵通常被直接设置为归一化的不同类别样本数量比。由于缺乏领域知识的指导,这种擅自设置的代价矩阵并不能保证得到最优的分类性能。2. 不能泛化到不同任务对于特定问题设计的代价矩阵只能用于该特定任务,在其他任务上使用时并不能保证良好的性能表现。3. 依赖于特定分类器另一方面,对于诸如神经网络的需要以批次训练(mini-batch training)方法训练的模型,少数类样本仅仅存在于在很少的批次中,而大部分批次中只含有多数类样本,这会给神经网络训练带来灾难性的后果:使用梯度下降更新的非凸优化过程会很快陷入局部极值点/鞍点(梯度为0),导致网络无法进行有效学习。使用敏感代价学习来给样本加权并不能解决这个问题。

    • 集成学习方法

    集成学习类方法专注于将一种数据级或算法级方法与集成学习相结合,以获得强大的集成分类器。由于其在类别不平衡任务中表现出色,在实际应用中集成学习越来越受欢迎。它们中的大多数基于某种特定的集成学习算法(例如,Adaptive Boosting [20])并在集成的过程中嵌入一种其他的不平衡学习方法(例如,SMOTE[14])。

    e.g., SMOTE+Boosting=SMOTEBoost [21]; SMOTE+Bagging=SMOTEBagging [22];

    另有一些集成学习方法的基学习器也是集成学习器(例如,EasyEnsemble,BalanceCascade[23])。因此最终的分类器是一个“集成的集成”。

    “集成的集成”并不代表一定会有更好的表现,作为基学习器的集成学习方法也会影响分类性能。如上述两种方法使用AdaBoost作为基分类器,Boosting类方法本身就对噪声敏感,加上BalanceCascade本身有相同的问题,因此使用非集成分类器可能效果反而更好(如直接使用C4.5)。PS,这两种方法使用AdaBoost做基学习器的原因大概率是为了蹭热点(2010年左右)。

    Strength: 1. 效果通常较好没有什么问题是ensemble不能解决的,如果有,再多加一个base learner。根据我的经验集成学习方法(魔改的)仍然是解决不平衡学习问题最有效的方法。2. 可使用迭代过程中的反馈进行动态调整极少数的集成方法具有了动态重采样的思想,如BalanceCascade会在每轮迭代中丢弃那些已经被当前分类器很好地分类的多数类样本(assumption是这些样本已经不含对模型有贡献的信息)。该方法在实际应用时也实现了相比于其他降采样方法更快的收敛速度,使其可以使用相对较少的分类器来得到更优的分类表现。

    Weakness: 1. 包含所使用的不平衡学习方法的缺点由于大多数不平衡集成学习方法仍然在其pipeline中使用了标准的数据级/算法级方法,因此上述两类方法的缺点也同样存在于使用他们的集成方法中。2. 过采样+集成进一步增大计算开销当应用于实际任务时,即便集成能够提升大部分方法的分类表现,这些数据级/算法级方法仍然存在计算效率低,适用性差并且易被噪声影响的缺点。例如,作为过采样方法的SMOTE在单独使用时已经引入了大量的新训练样本,使用SMOTE生成更多的训练数据集并训练更多的分类器只会使整个训练过程变得更慢。3. 对噪声不鲁棒BalanceCascade做出了非常有意义的探索,但其一味保留难以分类样本的策略可能导致在后期的迭代中过度拟合噪声/离群点,并最终恶化集成分类器的表现。换言之,其对噪声不鲁棒。

    训练过程可视化

    为了更直观地阐明上述对不平衡学习方法的分析,我构建了一个合成数据集用于可视化(图2):

    640?wx_fmt=jpeg

    图2:checkerboard数据集的示例。图(c)中的蓝色点代表多数类样本,红色点代表少数类样本

    在该数据集上测试下列五种方法:

    • RandUnder即随机降采样,它随机选取与少数类样本个数相同的多数类样本来组成一个平衡的训练集,并在其上训练一个分类器。

    • Clean指Neighborhood Cleaning Rule方法,它从数据集中移除那些最近邻都来自少数类的多数类样本。

    • SMOTE [14] 指少数类过采样技术(Synthetic Minority Over-sampling TechniquE),它根据最近邻关系向数据集中加入人工合成的少数类样本。

    • Easy [23] 指EasyEnsemble,它通过多次使用RandUnder来训练多个Adaptive Boosting [20] (AdaBoost)分类器并结合他们的输出得到一个集成分类器。需要注意的是AdaBoost本身也是一个集成分类器。

    • Cascade [23] 指BalanceCascade,它是EasyEnsemble的扩展。与Easy不同的是,它在每一轮迭代中都丢弃那些已经被当前基分类器很好地分类的多数类样本,以此减小采样空间并关注在更加难以分类的样本上。

    • 所有方法皆使用AdaBoost(基)分类器。

    640?wx_fmt=jpeg

    图3:5种不平衡学习方法在人工数据集上的可视化,包括3种重采样方法(i.e., RandUnder, Clean, SMOTE)以及两种重采样+集成方法(i.e., Easy, Cascade)

    图2展示了不同方法在checkerboard任务上的训练集(上列,蓝/红色点代表一个来自多数/少数类的样本)以及最终预测(下列,蓝/红色点代表分类器倾向于将一个样本分类为多数/少数类)。由于集成学习方法Easy以及Cascade使用多个不同的训练集训练基学习器,此处我们选择它们用于训练第5和第10个分类器的训练集用于可视化。

    从图中可以观察到RandUnder和Easy执行简单的随机欠采样,因此可能会丢失一些信息。Clean尝试清理被少数类数据点包围的多数类离群点,但是它保留了所有的背景样本,这导致分类器在训练时无法专注于那些含有更多信息的数据点。此外由于类别之间的重叠,SMOTE受到噪声影响过度泛化了少数类的空间分布。Cascade在后期迭代中只保留了一些多数类的离群点,强行拟合这些离群点最终导致了糟糕的泛化性能。

    需要强调为了可视化的效果,我们使用的该合成数据集含有相当多的噪声。在实际应用中BalanceCascade仍然是一种相当出色的不平衡学习方法。

    人生经验:

    总而言之,要根据问题性质的不同选择不同的方法,梳理一下

    • 欠采样一般是用来平衡数据集、去噪。平衡数据集的有随机欠采样/NearMiss,采样和训练速度都很快。随机欠采样在任何情况下都能用,但在数据集不平衡程度较高时会不可避免地丢弃大部分多数类样本造成信息损失。NearMiss对噪声极端敏感,有噪声基本就废掉。去噪方法有很多,如Tomeklink,AllKNN等,需要数据集上有良好定义的距离度量,在大规模数据集上计算量大。去噪之后对有的分类器有效,有的无效。

    • 过采样随机过采样任何情况下都不要用,及其容易造成过拟合。SMOTE、ADASYN在小规模数据上可以一试。当数据规模大且不平衡程度高时,过采样方法生成巨量的合成样本,需要很多额外计算资源。同时此类过采样基于少数类样本的结构信息,在少数类的表示质量很差时甚至会反向优化:过采样效果还不如直接训练。

    • 混合采样理论上加入了去噪类的欠采样算法来清洁过采样之后的数据集。实际使用起来我没感觉到有什么不同,唯一的区别是加了去噪方法之后更慢了。

    • Cost-sensitive在数据集不平衡程度不高时可用,训练分类器的效率跟使用原始数据训练没有什么区别。缺点是一般需要自己当“领域专家”来设置cost matrix(多了个参数要调),设的不好通常也会得到不理想的效果。此外在不平衡严重的时候,由于没有对数据集的修改,神经网络的训练会crash:连续数个mini-batch都是多数类样本,分分钟陷到local optimal/鞍点。

    • 集成随机降采样+集成,在不平衡比较高时需要较多的基学习器来达到较好的效果。注意Boosting容易被噪声影响,Bagging方法是真正的万金油,增加基学习器数量效果一般不会下降。高级降采样+集成,也可以尝试,运行会慢并且效果不能保证比随机方法好。高级过采样+集成,同上,数据规模大且不平衡程度高情况下,训练样本数量爆炸。尤其是集成方法还要训练好多个基学习器。BalanceCascade,信息利用效率高,只用很少的基学习器就能达到较好的效果,但对噪声不鲁棒。

    我们为了解决上述高度不平衡、含有较多噪声、且数据规模极大的不平衡分类问题做了一些微小的工作,并且与传统不平衡学习方法做了全面的比较实验,我们的方法计算开销更小,结果更优。过一阵时间可能会挂到arxiv上,届时敬请关注。

    BTW:

    一些经典综述:[3,24,25,26]

    一个包:imbalanced-learn python package(https://github.com/scikit-learn-contrib/imbalanced-learn

    这个包里实现的很多方法效果都不尽人意,(尤其是集成类方法:RUSBoost/EasyEnsemble/BalanceCascade等)发现不好用的话建议自己手写一个/用其他的实现。

    References

    [1] Gamberger D, Lavrac N, Groselj C. Experiments with noise filtering in a medical domain//ICML. 1999: 143-151.

    [2] Graepel T, Candela J Q, Borchert T, et al. Web-scale bayesian click-through rate prediction for sponsored search advertising in microsoft’s bing search engine// Omnipress, 2010.

    [3] Sun Y, Wong A K, Kamel M S. Classification of imbalanced data: A review. International Journal of Pattern Recognition and Artificial Intelligence, 2009, 23 (04):687-719.

    [4] Powers D M. Evaluation: from precision, recall and f-measure to roc, informed-ness, markedness and correlation. 2011.

    [5] Sokolova M, Japkowicz N, Szpakowicz S. Beyond accuracy, f-score and roc: a family of discriminant measures for performance evaluation//Australasian joint conference on artificial intelligence. Springer, 2006: 1015-1021.

    [6] Boughorbel S, Jarray F, El-Anbari M. Optimal classifier for imbalanced data using matthews correlation coefficient metric. PloS one, 2017, 12(6):e0177678.

    [7] Davis J, Goadrich M. The relationship between precision-recall and roc curves// Proceedings of the 23rd international conference on Machine learning. ACM, 2006: 233-240.

    [8] García V, Sánchez J, Mollineda R. An empirical study of the behavior of classifiers on imbalanced and overlapped data sets//Iberoamerican Congress on Pattern Recognition. Springer, 2007: 397-406.

    [9] Napierała K, Stefanowski J, Wilk S. Learning from imbalanced data in presence of noisy and borderline examples//International Conference on Rough Sets and Current Trends in Computing. Springer, 2010: 158-167.

    [10] Prati R C, Batista G E, Monard M C. Learning with class skews and small dis- juncts//Brazilian Symposium on Artificial Intelligence. Springer, 2004: 296-306.

    [11] Mani I, Zhang I. knn approach to unbalanced data distributions: a case study involving information extraction//Proceedings of workshop on learning from imbalanced datasets: volume 126. 2003.

    [12] Wilson D L. Asymptotic properties of nearest neighbor rules using edited data. IEEE Transactions on Systems, Man, and Cybernetics, 1972(3):408-421.

    [13]Tomek I. Two modifications of cnn. IEEE Trans. Systems, Man and Cybernetics, 1976, 6:769-772.

    [14] Chawla N V, Bowyer K W, Hall L O, et al. Smote: synthetic minority over-sampling technique. Journal of artificial intelligence research, 2002, 16:321-357.

    [15] He H, Bai Y, Garcia E A, et al. Adasyn: Adaptive synthetic sampling approach for imbalanced learning// 2008 IEEE International Joint Conference on Neural Networks (IEEE World Congress on Computational Intelligence). IEEE, 2008: 1322-1328.

    [16] Han H, Wang W Y, Mao B H. Borderline-smote: a new over-sampling method in imbalanced data sets learning//International conference on intelligent computing. Springer, 2005: 878-887.

    [17] Batista GE, Prati RC, Monard MC. A study of the behavior of several methods for balancing machine learning training data. ACM SIGKDD explorations newsletter, 2004, 6(1):20-29.

    [18] Elkan C. The foundations of cost-sensitive learning//International joint conference on artificial intelligence: volume 17. Lawrence Erlbaum Associates Ltd, 2001:973-978.

    [19] Liu X Y, Zhou Z H. The influence of class imbalance on cost-sensitive learning: An empirical study//Sixth International Conference on Data Mining (ICDM’06). IEEE, 2006: 970-974.

    [20] Freund Y, Schapire R E. A decision-theoretic generalization of on-line learning and an application to boosting. Journal of computer and system sciences, 1997,55(1):119-139.

    [21] Chawla N V, Lazarevic A, Hall L O, et al. Smoteboost: Improving prediction of the minority class in boosting//European conference on principles of data mining and knowledge discovery. Springer, 2003: 107-119.

    [22] Wang S, Yao X. Diversity analysis on imbalanced data sets by using ensemble models//2009 IEEE Symposium on Computational Intelligence and Data Mining. IEEE, 2009: 324-331.

    [23] Liu X Y, Wu J, Zhou Z H. Exploratory undersampling for class-imbalance learning. IEEE Transactions on Systems, Man, and Cybernetics, Part B (Cybernetics), 2009, 39(2):539-550.

    [24] He H, Garcia E A. Learning from imbalanced data. IEEE Transactions on Knowledge & Data Engineering, 2008(9):1263-1284.

    [25] He H, Ma Y. Imbalanced learning: foundations, algorithms, and applications. John Wiley & Sons, 2013.

    [26] Haixiang G,Yijing L,Shang J, et al. Learning from class-imbalanced data: Review of methods and applications. Expert Systems with Applications, 2017, 73:220-239

    [27] Lemaître G, Nogueira F, Aridas C K. Imbalanced-learn: A python toolbox to tackle the curse of imbalanced datasets in machine learning. Journal of Machine Learning Research, 2017, 18(17):1-5. jmlr.org/papers/v18/16-.

    文章知乎地址 : https://zhuanlan.zhihu.com/p/54199094

    640?wx_fmt=other

    展开全文
  • XGBoost(极端梯度提升)算法原理小结

    千次阅读 2019-04-08 21:31:05
    XGBoost(eXtreme Gradient Boosting)全名叫极端梯度提升,XGBoost是集成学习方法的王牌,在Kaggle数据挖掘比赛中,大部分获胜者用了XGBoost,XGBoost在绝大多数的回归和分类问题上表现的十分顶尖,本文较详细的...

    前言

    XGBoost(eXtreme Gradient Boosting)全名叫极端梯度提升,XGBoost是集成学习方法的王牌,在Kaggle数据挖掘比赛中,大部分获胜者用了XGBoost,XGBoost在绝大多数的回归和分类问题上表现的十分顶尖,本文较详细的介绍了XGBoost的算法原理。

    目录

    1. 最优模型的构建方法

    2. Boosting的回归思想

    3. XGBoost的目标函数推导

    4. XGBoost的回归树构建方法

    5. XGBoost与GDBT的区别

     

    最优模型的构建方法

    构建最优模型的一般方法是最小化训练数据的损失函数,我们用字母 L表示,如下式:

    式(1)称为经验风险最小化,训练得到的模型复杂度较高。当训练数据较小时,模型很容易出现过拟合问题。

    因此,为了降低模型的复杂度,常采用下式:

    其中J(f)为模型的复杂度,式(2)称为结构风险最小化,结构风险最小化的模型往往对训练数据以及未知的测试数据都有较好的预测 。

     

    应用:决策树的生成和剪枝分别对应了经验风险最小化和结构风险最小化,XGBoost的决策树生成是结构风险最小化的结果,后续会详细介绍。

    Boosting方法的回归思想

    Boosting法是结合多个弱学习器给出最终的学习结果,不管任务是分类或回归,我们都用回归任务的思想来构建最优Boosting模型 。

    回归思想:把每个弱学习器的输出结果当成连续值,这样做的目的是可以对每个弱学习器的结果进行累加处理,且能更好的利用损失函数来优化模型。

    假设

    是第 t 轮弱学习器的输出结果,

    是模型的输出结果,

    是实际输出结果,表达式如下:

    上面两式就是加法模型,都默认弱学习器的输出结果是连续值。因为回归任务的弱学习器本身是连续值,所以不做讨论,下面详细介绍分类任务的回归思想。

     

    分类任务的回归思想:

    根据2.1式的结果,得到最终的分类器:

    分类的损失函数一般选择指数函数或对数函数,这里假设损失函数为对数函数,学习器的损失函数是

    若实际输出结果yi=1,则:

    求(2.5)式对

    的梯度,得:

    负梯度方向是损失函数下降最快的方向,(2.6)式取反的值大于0,因此弱学习器是往增大

    的方向迭代的,图形表示为:

    如上图,当样本的实际标记 yi 是 1 时,模型输出结果

    随着迭代次数的增加而增加(红线箭头),模型的损失函数相应的减小;当样本的实际标记 yi 是 -1时,模型输出结果

    随着迭代次数的增加而减小(红线箭头),模型的损失函数相应的减小 。这就是加法模型的原理所在,通过多次的迭代达到减小损失函数的目的。

     

    小结:Boosting方法把每个弱学习器的输出看成是连续值,使得损失函数是个连续值,因此可以通过弱学习器的迭代达到优化模型的目的,这也是集成学习法加法模型的原理所在 。

    XGBoost算法的目标函数推导

    目标函数,即损失函数,通过最小化损失函数来构建最优模型,由第一节可知, 损失函数应加上表示模型复杂度的正则项,且XGBoost对应的模型包含了多个CART树,因此,模型的目标函数为:

    (3.1)式是正则化的损失函数,等式右边第一部分是模型的训练误差,第二部分是正则化项,这里的正则化项是K棵树的正则化项相加而来的。

     

    CART树的介绍:

    上图为第K棵CART树,确定一棵CART树需要确定两部分,第一部分就是树的结构,这个结构将输入样本映射到一个确定的叶子节点上,记为

    。第二部分就是各个叶子节点的值,q(x)表示输出的叶子节点序号,

    表示对应叶子节点序号的值。由定义得:

    树的复杂度定义

     

    XGBoost法对应的模型包含了多棵cart树,定义每棵树的复杂度:

    其中T为叶子节点的个数,||w||为叶子节点向量的模 。γ表示节点切分的难度,λ表示L2正则化系数。

    如下例树的复杂度表示:

     

    目标函数推导

    根据(3.1)式,共进行t次迭代的学习模型的目标函数为:

    泰勒公式的二阶导近似表示:

    为Δx,则(3.5)式的二阶近似展开:

    其中:

    表示前t-1棵树组成的学习模型的预测误差,gi和hi分别表示预测误差对当前模型的一阶导和二阶导 ,当前模型往预测误差减小的方向进行迭代。

     

    忽略(3.8)式常数项,并结合(3.4)式,得:

    通过(3.2)式简化(3.9)式:

    (3.10)式第一部分是对所有训练样本集进行累加,因为所有样本都是映射为树的叶子节点,我们换种思维,从叶子节点出发,对所有的叶子节点进行累加,得:

    Gj 表示映射为叶子节点 j 的所有输入样本的一阶导之和,同理,Hj表示二阶导之和。

    得:

    对于第 t 棵CART树的某一个确定结构(可用q(x)表示),其叶子节点是相互独立的,Gj和Hj是确定量,因此,(3.12)可以看成是关于叶子节点的一元二次函数 。最小化(3.12)式,得:

    得到最终的目标函数:

    (3.14)也称为打分函数(scoring function),它是衡量树结构好坏的标准,值越小,代表这样的结构越好 。我们用打分函数选择最佳切分点,从而构建CART树。

    CART回归树的构建方法

    上节推导得到的打分函数是衡量树结构好坏的标准,因此,可用打分函数来选择最佳切分点。首先确定样本特征的所有切分点,对每一个确定的切分点进行切分,切分好坏的标准如下:

    Gain表示单节点obj*与切分后的两个节点的树obj*之差,遍历所有特征的切分点,找到最大Gain的切分点即是最佳分裂点,根据这种方法继续切分节点,得到CART树。若 γ 值设置的过大,则Gain为负,表示不切分该节点,因为切分后的树结构变差了。γ值越大,表示对切分后obj下降幅度要求越严,这个值可以在XGBoost中设定。

    XGBoost与GDBT的区别

    1. XGBoost生成CART树考虑了树的复杂度,GDBT未考虑,GDBT在树的剪枝步骤中考虑了树的复杂度。

    2. XGBoost是拟合上一轮损失函数的二阶导展开,GDBT是拟合上一轮损失函数的一阶导展开,因此,XGBoost的准确性更高,且满足相同的训练效果,需要的迭代次数更少。

    3. XGBoost与GDBT都是逐次迭代来提高模型性能,但是XGBoost在选取最佳切分点时可以开启多线程进行,大大提高了运行速度。

    PS:本节只选取了与本文内容相关的几个区别。

    参考

    陈天奇 《XGBoost:A Scalable Tree Boosting System》

    李航 《统计学习方法》

    展开全文
  • 2012年真是极其艰难的一年!根据玛雅历法所推算的世界末日让全球忧心忡忡,但最后被证实是杞人忧天。但是这一年,全球的日子的确不好过:美国的干旱和热浪,英国、肯尼亚、...科学家一直在提醒,气候变化与灾难性极端
  • 集成学习算法本身不算一单独的机器学习算法,而是通过构建并结合多个机器学习器来完成学习任务。可以说是集百家之所长,能在机器学习算法中拥有较高的准确率,不足之处就是模型的训练过程可能比较复杂,效率不是很...
  • 周鸿祎:微创新要极端一点

    千次阅读 2012-06-29 17:31:19
    一个企业,不需要每个人都了解企业的战略,而应该让他们结合产品、流程上的细微之处,从用户角度出发提供创新的点子。  我们所有浏览器的产品改进,都不是在屋里想出来的,都是从用户抱怨中来。一次,一个用户打...
  • 1. 介绍     蛋白质和RNA相互...    本研究提出了一基于序列的方法,利用卷积神经网络(CNN)结合极端学习机器(ELM)分类器来预测RNA -蛋白质的相互作用。首先,将RNA和蛋白质序列转换成易于计算机处理的数字描
  • 结合mahout的数据挖掘算法介绍

    万次阅读 2014-09-03 08:25:43
    本文中结合mahout和小例子还解释这些算法。因此我们先介绍一下mahout。 准备工作:Mahout环境的搭建 初识mahout Hadoop是为了大数据而生的,在之前的学习中,我们也了解了Mapreduce程序的基本原理。但是,读者对...
  • 异步@Async + 事务@Transactional的结合

    千次阅读 2020-02-19 11:08:40
    每篇一句 将依赖做到精简是中间件岗位最基本的素养,美国童子军也有一条军规:让营地比你来时更干净。...本文不废话,分析一下他俩结合一起使用的case,因为据我了解很多人对结合一起使用时,心里还是打鼓...
  • 结合个人经历总结的前端入门方法

    万次阅读 多人点赞 2015-12-04 16:08:41
    结合个人经历总结的前端入门方法,总结从零基础到具备前端基本技能的道路、学习方法、资料。由于能力有限,不能保证面面俱到,只是作为入门参考,面向初学者,让初学者少走弯路。 互联网的快速发展和激烈竞争,用户...
  • 卷积神经网络是目前应用最为广泛之一的深度学习技术,它是一含特征提取器(由卷积层和混合池层组成)的深度神经网络,该网络流行于计算机视觉领域。计算机视觉非常直观且好理解,机器学习领域对其关注已久。人类自身...
  • java多线程总结:原理结合源码详细讲解 - 简单实用

    万次阅读 多人点赞 2018-08-09 11:14:57
    方法,我们定义一个计算个值大小的 Runnable : public class Task implements Runnable {  private int num;  private int num1;  public Task(int num, int num1) {  this.num = num;...
  • 数据可视化的爱好者Severino Ribecca,他在自己的网站上收录了 60 可视化图表样式以及它们分别适用于什么样的场景,并且推荐了相应的制作工具。 值得一看。 点阵图 点阵图表 (Dot Matrix Chart) 以点为单位...
  • 本文不废话,主要分析一下他俩结合一起使用的case,因为相对常见并且有人还搞不明白的情况,所以想用此篇文章来聊聊 相较于@Transactional的使用,关于@Async的一些使用case相对我估计还是陌生一点,所以文章开头先...
  • 显示两种因素间的关系。 例如:目标市场客户群分析、跨区域产品采用情况、按个人代表划分的销售线索。 另外可以考虑: 改变方块大小。 通过改变方块的大小,您可以借由热点图了解两个交叉因素的集中度,但是要...
  • 计算机系统的设计规则,性能评测

    千次阅读 2015-05-18 23:22:49
    控制流程的三种实现方式:全硬件,软硬结合,全软件 ... 适应性强,设计周期短理论上,由两种极端实现方法 1:全硬件机器:操作系统,高级语言,应用等 2:硬件只有1位加法和分支操作,其他都用
  • 游戏人工智能开发之6决策方法

    万次阅读 2015-09-09 07:37:17
    GOAP来源于STRIPS方法,这两种都是让AI创造他们自己的方法去解决问题,我们提供给它一系列可能的动作作为对这个世界的描述,和每个动作使用的先决条件,和行动带来的影响。AI拥有一个初始状态和他需要达到的目标。有...
  • 之所以用“Join into”,是因为Join有注入和连接两种含义:“注入”包含了本项目的基本目的,将区块链纳入法治轨道;“连接”是指在一些必要的点上建立连接,而不是全部的融入,这样的表达符合保持区块链自治、避免...
  • CRUD搬砖三年了,怎么阅读Spring源码?

    千次阅读 多人点赞 2021-07-26 07:36:58
    另外如果是接口实现的方式,那么直接可以通过 Bean 对象调用对应接口定义的方法即可,((InitializingBean) bean).afterPropertiesSet(),两种方式达到的效果是一样的。 除了在初始化做的操作外,destroy-method 和 ...
  • 本文自己提出的两种结构,分别为: ComNet-FC 和 ComNet-BiLSTM 。 Y/H_true: 假定信道已知的最大似然解,可以说是传统算法的最优了。 这里的一个小疑问在于作者使用了64-QAM而非 Power of deep learning for...
  • Raft 是一为了管理复制日志的一致性算法。它提供了和 Paxos 算法相同的功能和性能,但是它的算法结构和 Paxos 不同,使得 Raft 算法更加容易理解并且更容易构建实际的系统。为了提升可理解性,Raft 将一致性算法...
  • 解决这种刻意维护的团体意识的方法就是建立一种极端讲礼貌的文化,哪怕双方的意识形态不同,但彼此之间仍要保持彬彬有礼的。另外一种方法就是引进一些对团体意识持怀疑态度,而能力非常突出,能言善辩的人。 人的被...
  • 例如,假设在传统学科分类体系看来,人们已经创建的知识门类有1000,那么,将这1000知识门类两两结合,我们就可以得到1000000潜在的可能性,其中每一都有可能开创一个崭新的学术领域,引发一次技术或生产力...
  • 给出两种基本实现: /* 静态顺序存储线性表的基本实现 */ #include #include #include #define LIST_INITSIZE 100 #define ElemType int #define Status int #define OK 1 #define ERROR 0 typedef struct { ...
  • GAN之父在NIPS 2016上做的报告:个竞争网络的对抗(含译文全文PDF下载)作者:Ian Goodfellow翻译:七月在线DL翻译组译者:范诗剑 汪识瀚 李亚楠审校:管博士 寒小阳 加号责编:翟惠良声明:本译文仅供学习交流,...
  • xml的解析方式

    千次阅读 2016-06-10 17:49:18
    大致可以分为两种:一种是基于树结构处理的Dom解析,另外一种是基于事件模型的SAX解析 一、介绍及优缺点分析 1. DOM(Document Object Model)  DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准...
  • 基于 Erlang/OTP 搭建TCP服务器

    千次阅读 多人点赞 2013-10-22 21:50:29
    这两天在研究erlang如何构建TCP服务器,看到一篇文章,基于Erlang OTP构建一个TCP服务器,里面讲述了两种混合型Socket的实现方法,着实让人欢欣鼓舞。本文将结合这两篇文章,继续讨论Erlang/OTP 构建TCP服务器的具体...
  • 浅谈Activity的四启动模式

    千次阅读 2016-09-20 19:31:17
    本文主要聊聊Activity的四启动模式,请看文章!
  • 中文“预测”的含义在“英语”情境下则有两种含义:evaluate,“估算”,前文归因的方法中,是从因变量Y发现自变量X,也就是Y-->X,“估算”则是“归因”的逆操...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 41,311
精华内容 16,524
关键字:

两种极端的结合