2015年8月10日星期一

关于机器学习中规则与统计方法的思考 - 小胖NLP

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
关于机器学习中规则与统计方法的思考 - 小胖NLP  阅读原文»

最近工作了一段时间,今天跟大家讨论一下关于“规则与模型”的问题。
大家肯定都知道,机器学习方法主要分两类,一类是基于统计的方法,比如贝叶斯、KNN等,都是对数据的某种特征进行归类计算得到数据划分的依据的;另一类是基于规则的方法,比如,语义规则,语法规则或者业务规则等等,这些规则主要是根据数据本身的特征人为地对分类细节进行限定,没有什么太高深的理论,但是实用性很强。当然,我觉得还有第三种方法,就是基于统计与基于规则相结合的方法,比如关联规则,apriori方法,或者决策树方法。这些方法在分类或者求变量关系的时候本质上是基于规则分类,但是在训练过程中却是使用统计的方法的。比如apriori方法,该方法本身就是求规则的一种方法,但该方法训练的时候是需要对各种关联特征进行统计的。训练完毕后寻找强关联性的特征可以进行分类,因为我觉得找出哪些是强关联哪些不是强关联就是一个分类的过程。再比如决策树,同样的道理,决策树本身得到的那棵树就是一棵规则树,但是在寻找树的分裂属性上,无论是ID3还是C4.5,都是基于统计方法的。我认为这种通过训练出的规则进行统计分类的方法就是统计与规则相结合的方法。那么这三类方法哪些是比较有效的呢,或者说哪些是比较适合大部分数据的呢?
我的个人理解是,没有。我们在学校里写paper,最主要的任务有三:第一,提高算法性能;第二,提高算法对数据的匹配度;第三,提高数据对算法的匹配度。举个例子来说,我用SVM对新浪微博文本做情感分析,要么改进SVM核心算法,提高分类精度;要么对SVM选取特征的方法或空间构造的方法进行改进,提高分类精度;要么就是直接改进数据特征提取方式,提高数据对分类器的匹配度。但是,不管是哪一种方法,都要满足最小泛化阈值。也就是说,对训练数据之外的测试数据的分类准确度一定要满足最低要求。我们把训练数据和测试数据的概念扩大一下,如果我们把要训练的某类数据作为训练数据,把该类别之外的数据作为测试数据,情况就完全不一样了。比如,我把微博数据作为训练数据,把短信类短文本数据作为测试数据,虽然同样都属于短文本,但泛化值出奇的低。这是因为我们无论采用哪一种方法,数据都必须是封闭的,或者说是相对封闭的。我们用分类器或者基于统计的方法,其实主要就是为了提高泛化能力,因为统计一个词的个数和一个数的个数的意义是一样的。但是现在看来,好像基于统计的方法的泛化能力还是有限。
导致这种现象的原因是什么呢?我在刚开始学机器学习的时候就遇到一个很大的矛盾,既然SVM是最好的基于统计的分类方法,而基于统计的方法的目的就是为了提高泛化能力,为什么在使用SVM的时候还是需要去适应数据呢?在我理解,分类方法对数据适应的越多,规则成分就越多。我在最近做“技能词识别”的时候使用了各种规则,尝试了各种方法,然后我返现我犯了两个个错误,第一SVM是一种思想,不是一种具体的方法。思想本身无法使用,只有把它应用到实践才有价值;第二就是数据挖掘,或者机器学习的核心的重点永远是数据和思想的问题,没有方法的问题。因为我们选择的方法一定是要匹配数据的,目前来说这是根本;方法也是必须要符合分类某数据的核心思想的。由此我想出,无论是基于规则的方法还是基于统计的方法都是基础理论,单纯的使用基础理论是没有什么意义的,或者说只能满足很少一部分数据的。只有结合实际情况,结合多种基础理论,才能把机器学习运用到实际当中,因为我们的核心是数据,是实际情况。
所以说,如果们分类的时候发现基于统计的方法远远不如基于规则的方法,或者反过来,并不表明哪一种方法好,而是说明某一种方法更适合目前要分析的数据。对完全不同数据类型的数据进行泛化我觉得目前来说不太现实,因为对于真实的人来说让一个人根本不懂英语的中国人去理解英文那是不可能的。当然,以后会发展到什么程度我是难以预料的,我的眼光目前也比较短浅看不到很深远的东西。但我觉得,如果某一天这种泛化能力实现了,人类将走向灭绝。
对了,最后一点,我觉得将“基于统计的学习方法”和“基于规则的学习方法”改为“基于统计的学习思想”和“基于规则的学习思想”更好一些。
可能会有逻辑不对的地方,欢迎批评指正!

本文链接:关于机器学习中规则与统计方法的思考,转载请注明。

iOS开发-策略模式 - Fly_Elephant  阅读原文»

策略(Strategy)模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。看到策略模式的时候有的时候跟简单工厂相比较,其实有很大的迷惑性,都是继承多态感觉没有太大的差异性,简单工厂模式是对对象的管理,策略模式是对行为的封装。可以先简单的看一下结构图:

之前简单工厂是通过银行卡作为例子的简单工厂将不同的银行卡抽象出来,如果在策略模式中我们可以将每张银行卡的购物,吃饭,住房。。作为一个简单的消费策略抽象出来,也可以以操作系统类比,Windows,OS X,Linux可以作为简单的对象抽象,系统中都是有默认软件的,我们不需要管软件的安装,如果没有软件的话我们就需要自己下载,可以将软件的安装作为一个策略封装起来。

Strategy的抽象类:

@interface SoftWareStrategy : NSObject

-(void)installStrategy;

@end

继承Strategy的Xcode的策略类:

@implementation XcodeStrategy

-(void)installStrategy{
NSLog(@"Xcode安装成功");
}

@end

继承Strategy的QQ的策略类:

@implementation QQStrategy

-(void)installStrategy{
NSLog(@"QQ安装成功");
NSLog(@"原文地址:http://www.cnblogs.com/xiaofeixiang");
}

@end

Context类:

typedef NS_OPTIONS(NSInteger, StrategyType){
StrategyXcode,
strategyQQ
};

@interface SoftWareContext : NSObject

-(instancetype)initWithStrategyType:(StrategyType)strategyType;

-(void)installResult;

@end

Context的实现:

@interface SoftWareContext()

@property (strong,nonatomic) SoftWareStrategy *strategy;

@end
@implementation SoftWareContext

-(instancetype)initWithStrategyType:(StrategyType)strategyType{
self=[super init];
if (self) {
switch (strategyType) {
case StrategyXcode:
self.strategy=[[XcodeStrategy alloc]init];
break;
case strategyQQ:
self.strategy=[[QQStrategy alloc]init];
break;
}
}
return self;
}

-(void)installResult{
[self.strategy installStrategy];
}

@end

最终调用:

SoftWareContext *context=[[SoftWareContext alloc]initWithStrategyType:StrategyXcode];
[context installResult];

这里有三个概念需要再看一下应该就清晰多了:

环境(Context)角色:持有一个Strategy的引用;

抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口;

具体策略(ConcreteStrategy)角色:包装了相关的算法或行为;


本文链接:iOS开发-策略模式,转载请注明。

阅读更多内容

没有评论:

发表评论