显示标签为“据挖掘与机器学习算法”的博文。显示所有博文
显示标签为“据挖掘与机器学习算法”的博文。显示所有博文

2012年11月17日星期六

博客:http://xccds1977.blogspot.com/,提供R语言资料下载链接



博客:http://xccds1977.blogspot.com/,提供R语言资料下载链接:

最近在Box.net上获得了50G的空间,于是将自己收罗的R语言资料上传与各位共享,希望共同学习交流,推动R语言在中国的传播。这些教材基本都是英文教程,部分资料的评论看这里

初学入门


经典统计与回归


计量与时间序列分析


数据挖掘与机器学习


多元分析


金融计算


科学计算与编程


综合参考


绘图

其它

从Java里调用R – 使用Rserve


从Java里调用R – 使用Rserve

简介

前段时间介绍了在Java中设置与使用JRI的方法。这种方式有一些弊端:
  • R需要与JVM运行在同一台机器上,当R需要运行大型计算时,会耗用大量CPU与内存,因此会影响到JVM的性能
  • JRI的设置需要本地库的支持,运行的时候还是有些麻烦的
Rserve可以解决这两个问题,同时也有JRI一样的易用性。它的原理是提供以HTTP方式连接的R语言接口, 因此可以让专门一台机器来运行RServe,然后让Java或其它语言的客户端来进行连接。额外的好处是,可以支持Java在内的多种客户端。
Rserve推荐在Linux下使用,因为在Windows平台上还很不完善(下面会介绍)。但由于多数程序员还是习惯于在Windows环境下进行开发,还是有必要找到在Windows上进行它的办法。这篇文章主要介绍这个环境的话题。

安装RServe

以下以Windows平台为例介绍安装的方法。Rserve可以从其网站下载单独安装,但更方便的方式是从R中直接进行安装,只需运行
install.packages(‘Rserve’)
然后,需要手动复制$R_HOME/library/rserve/Rserve*.exe到bin/i386里(视平台而定)。
运行时,在命令行输入:
R CMD Rserve
你会得到它成功运行的提示。
要想关闭服务,最好的方法是从任务管理器里直接杀死rserve.exe进程。我发现在命令行窗口按Ctrl-C似乎有时并不能成功关闭服务, 这个很奇怪。

使用与局限

Windows上运行Rserve还是有很大的局限性的。
最大的问题是,所有的连接都会在一个工作空间内运行。所以当客户端是多线程程序时,可能会造成线程间互相干扰。我们需要在客户端做一些额外的工作,使它能够以线程安全的方式运行。Java端可以通过使用synchronize使得同一时间只有一个线程使用R服务。
Rserve的另一个缺点是,它的错误处理过于简单化,如果R端出现错误,它抛出的异常对于找到问题的根源几乎没有任何用处。所以我建议R端的程序一定要多写LOG,或以统一的方式处理异常。
其次,开发中需要注意的是,Rserve同时只允许一个客户端连接。因此,如果第二个线程试图连接时,它就会一直处在等待状态。另外,如果要更新R包,也需要关闭并重新启动Rserve。所以,如果发现客户端连接时出现异常情况,查看一下任务管理器,看是不是有多个Rserve的线程在运行,或者你的服务有没有重启,往往可以帮助解决问题。
以下源码是一个使用Rserve实现线程安全的R服务的Java客户端。包含了用Spring配置的RService对象, 以及相关的TestNG的测试。下载后需要做一些配置和修改才能使用,不过东西比较简单,主要是演示这个idea。
源码下载:RService.zip

示例

以下Java代码演示了使用上面zip包中的R服务对象来调用R语言来生成图形的方法。
RService rService = new RService();
RConnection re = rService.startTransaction(); //开始独占工作空间
 
double[][] xx = ...; //生成两个二维数组
double[][] yy = ...;
 
File tempFile = null;
try {
    re.assign("x", xx); //给R的变量赋值
    re.assign("y", yy);
    tempFile = File.createTempFile("test-", ".jpg"); //把图像生成到文件
    String filePath = tempFile.getAbsolutePath();
    logger.info("Plot file to be produced:" + filePath);
    re.eval("jpeg('" + StringEscapeUtils.escapeJava(filePath) + "')");
    re.eval("qqplot(x,y)"); //绘图
    re.eval("dev.off()");
} catch (IOException e) {
    logger.warn("Failed to create temp file", e);
} finally {
    this.rService.endTransaction(); //退出时一定要关闭此工作空间
}
Rserve网站已经移到RForge上:http://www.rforge.net/Rserve/
About Fan
从事软件行业多年,关心软件工程与技术、项目管理、数据统计与分析、BI、Java软件开发。


概念化”增强学习”(一)


概念化”增强学习”(一)

增强学习同时是一个心理学及机器学习的概念。我们很多知识的习得都是通过增强学习的机制完成的,其最基本的形态无异于你训练小狗帮你捡回扔出的网球时所采取的形式。正如很多机器学习理论都从生物认知系统或群体系统中获得启发一样,增强学习也从中汲取了营养并发展成一个独立的分支。但是跟其它机器学习领域不一样的地方在于,它更多的是一类问题(而非一些技术)的集合。
可以用增强学习领域里一些常用的名词来非严格地定义它:一个agent,处于一个变化的环境中,通过试错与环境发生交互,慢慢适应环境并使得自己从环境获得的收益最大化的过程。

基本模型

描绘这个定义最贴切的图如下:
图1
图1
图1描述的是一个agent与环境发生交互的过程:agent通过感知函数I和R来获得环境的输入,并依此从自己的行为集合B中选择操作a反馈给环境;环境依据当前的状态s与操作a,通过一个状态转移函数T(s,a,s’)跃迁到一个新的状态s’。至此完成了一步迭代。通过一步又一步的迭代,agent会慢慢学习到环境的分布或规则,从而得到一个策略——对于每种状态,都能给出收益最优的操作。是不是很像某些AI视频里小机器人在一个陌生环境里通过行走学习找到正确路径的场景。这里之所以存在一个输入函数I,而不是直接获取环境输入,是因为在某些场景里,agent对环境信息的输入感知是不充分的,如局部的、带噪音之类的,不过这里的讨论中I会是一个无差的函数。R是收益函数,简单的情景下它输出为:有(1)或无(0)。

基本假设

这个模型有两个基本的假设:1、环境是非确定性的,即状态转移函数T输出的是一个概率值,S×A->S是一种概率映射;2、环境是平稳的(状态转移函数T的输出概率分布是稳定的),或至少是短时平稳或变化缓慢的。

增强学习 vs. 有监督学习

增强学习面临的问题跟有监督学习不一样,它没有一批预先准备好的input/output数据集可供学习,它考虑的是在一个全新的、几乎没有什么信息可供参考的环境里,如何通过试错的方式来获得环境反馈的学习。因为没有离线的数据可作依据,所以,在线的实时的评估对于增强学习而言是极其重要的,这是一类一边学习一边评估的系统。

问题的求解

对于这个基本模型下的学习问题,即如何给出收益最大的行为输出,有两种求解的途径,一是通过遗传算法、遗传规划或其它搜索策略在求解空间中搜索问题的局部最优解;二是使用统计或动态规划的方法去估计在不同状态下采用不同操作所能获得的期望收益,并由此直接或间接的得到统计最优的行为输出。

优化目标

增强学习最终输出的是一个最优的行为策略,所以归根到底还是个优化问题,优化的目标函数通常有如下三种:
左式是一种有限视野的优化,它只考虑最近h步的收益期望,这个比较符合人做判断的方式,比如下象棋时的走一想三就是考虑了后续几步收益所给出的最优走法。中式应用比较广泛,是一种带衰减的无穷视野收益期望,无限的情况存在于理论的世界里,离当前时间点越远其重要性越低的假设既符合主观认识又能保证数学上的收敛,所以用于做理论推导是很合适的。右式是无穷视野的另一个版本。选择不同的优化目标函数能得到完全不同的行为策略。

Exploration vs. Exploitation

在Reinforcement Learning这个范畴里讨论学习问题通常都绕不开这个tradeoff问题,通俗地说这等同于每朝的太祖都会面临的问题:稳守江山还是开疆辟土。用一个k-arm bandit可以很形象的说明这个问题的普遍性。所谓1-arm bandit即我们常说的老虎机(水果机、赌博机),投一个硬币,按一下按钮或扳一下手柄,根据机器滚动组合的三个图案来决定你获得奖励或两手空空。k-arm bandit就是这次你面临k台老虎机,并且它们获奖的概率是不一样的,至于概率是多少,就需要你自己去试了。我们简化一下问题,假设你不用投硬币,但你只有n次玩的机会,每次玩你会获得1或0个奖励,那么为了你的收益最大化,你应该采用什么样的策略?

策略分析

直观的说,如果你已经预先知道了各台机器的获奖概率,你应该完全采用Exploitation式的策略,集中投注于概率最大的那台机器。在你完全没有一点关于概率的信息时,你应该先采用Exploration的方式去对各台机器做探索性的测试,以期获得足够的信息让你化归到最简单的Exploitation式策略。从算法的角度上去求解这个问题,通常有两种途径,一种是规范化的方法,把一些成熟的模型引入进来解决问题,如动态规划,学习自动机。另一种是特定性的方法,它们多是一些启发式的算法,如贪心算法,波尔兹曼搜索等等。
其实,k-arm bandit同时还是符合RL模型的最简单的形态:单状态的RL模型——你永远都只会面临同一种状态,以及k种操作的行为集,并且环境是稳定但非确定的。这个简单的模型在很多的机器学习和应用数学的领域都有讨论。
参考文献:
【1】Reinforcement learning: A survey;  Kaelbling, L.P. and Littman, M.L. and Moore, A.W.; Arxiv preprint cs/9605103; 1996

广告投放与推荐系统-如何将两者有机的结合是个问题。


广告投放与推荐系统

好吧,我得承认,昨天下午百度商务搜索部来到公司访问交流正是处于风口浪尖之际,但我们今天不谈这个。

从一个做推荐的人来说,他们做的主题广告推广(类似于google adsense在广告联盟里投放广告)的事情,我倒有一些自己的想法。他们若是希望做一个针面向于终端用户的个性化广告投放,我们都觉得这不太现实,无论是从数据量的庞大程度,还是用户数据获取的难度(这两个因素又会带来数据的稀疏问题)来说,这都不乐观。相反,基于从寻找这个工作与豆瓣推荐系统的相似度来说,我觉得他们可以改变一下自己问题中“用户”这个对象的代表身份。简单来说,就是豆瓣推荐面对的用户是实实在在的人,因为我们拥有这些登录用户很完备的兴趣爱好的数据,所以能够得到比较令人满意的推荐;而百度主题推广的一个用户,应该定义为某一类型的页面(下面称为页类),这样的“用户”百度才有可能存储足够量且可靠的数据,进行个性化的推荐(这里的个性化推荐就演变为对页类进行有针对性的广告投放了)。至于怎么对海量的网页划分出不同的网页类型,这应该是他们的强项(为了使得结果更有分众的效果,这样的网页类型可以有很多,因为推荐系统中的用户数量也很庞大)。

这样进行类比,每一个页类就对应于推荐系统的一个user,每一个广告就对应于推荐系统的一个item,页类对广告的评分可以用在该页类中投放该广告时的点击情况来进行计算,这样就构成了通常推荐系统所必须的user-item-rating的矩阵,接下来就可以自由运用经典或改进的各种协同过滤算法来对页类进行广告推荐(投放),也即利用推荐系统的思想来解决这个广告投放的问题,而不是传统的基于上下文的方法。当然,实际应用中会有一些问题,其中一部分来自于推荐系统自身的弊病,另一部分来自于推荐系统应用于广告投放这个新领域会面对的新问题。前者如协同过滤面临的冷启动问题(新条目推荐需要额外考虑),后者如广告投放需要重视的广告库存率等等。另外,这种思想并没有完全放弃文本的因素,实际上在进行页类划分时(可以认为是个user identification过程),文本会是个主要的考虑因素,但在广告投放的决策过程里,文本相关可以被协同过滤方法所取代,文本由一个决定性因素转变为一个预处理模块的因素。

不管如何,如果真能把推荐系统、协同过滤中利用群体智能的思想引入到在线广告投放领域,肯定是一件激动人心的事情。

另外从对分网络的角度来看,豆瓣推荐系统网络中的两类结点是用户和条目,但对于其它系统则未必如此,应该根据实际的数据与需求情况合理地定义这两类相互发生关系的结点,使得网络中的稀疏性较小、结点间的关系比较可靠,才能从这个关系网络中挖掘中令人满意的结果。

可惜的是对方对自己的技术与算法提及得太少,其实基本是没有什么提及,所以也没法进行更为深入和有效的探讨。
关于作者
阿稳, 豆瓣, 算法工程师
推荐系统;数据挖掘;算法架构及实现的可扩展性;R环境编程
如果你的问题已经能从我的博客中得到解答,就最好不过了: