最近在看一些在线机器学习的东西,看到了trident-ml, 觉得比较有意思,就翻译了一下,方便有兴趣的读者学习。

本文为作者(掰棒子熊)翻译自https://github.com/pmerienne/trident-ml的关于trident-ml的一个文档。可以转载,但是请注明出处。

Trident-ML 是一个实时的在线机器学习库. 它运行你通过可伸缩的在线学习算法创建实时预测特征。

这个库基于Storm, 后者是一个分布式流处理系统,运行于计算机集群之上,支持横向扩展。

这个库中所包含的算法设计用于有限的内存和有限的计算时间的场景,但是不适用于分布式计算。

Trident-ML 目前支持 :

  • 线性分类 (Perceptron, Passive-Aggresive, Winnow, AROW)
  • 线性回归 (Perceptron, Passive-Aggresive)
  • 聚类 (KMeans)
  • 特征缩放 (standardization, normalization)
  • 文本特征提取
  • 流统计 (mean, variance)
  • 经过训练的 Twitter 情绪分类器

API 概览

Trident-ML 基于 Trident, 后者是一个用于实时计算的高层次抽象。

如果你熟悉Pig, Cascading等高层次的捆处理(batch processing)工具,你会很熟悉Trident的概念。

推荐阅读 Storm 和 Trident 文档.

创建实例

Trident-ML 的处理对象是由 Instance 或者 TextInstance这些无限集合实现的无限数据流。

创建预测工具的第一步就是创建实例。

Trident-ML 提供 Trident 函数 来将Trident元组(tuples)转换为实例:

TridentTopology toppology = new TridentTopology();

toppology
// 发射带有两个随机特征 (即 x0 和 x1) 的元组 以及一个相关联的布尔标签 (即label)
.newStream("randomFeatures", new RandomFeaturesSpout()) // 将 trident tuple 转换为 instance
.each(new Fields("label", "x0", "x1"), new InstanceCreator<Boolean>(), new Fields("instance"));
TridentTopology toppology = new TridentTopology();

toppology
// 发射带有文本和相关联的标签的元组
.newStream("reuters", new ReutersBatchSpout()) // 将 trident tuple 转换为 text instance
.each(new Fields("label", "text"), new TextInstanceCreator<Integer>(), new Fields("instance"));

有监督分类

Trident-ML 含有几种不同的算法来做有监督分类 :

这些分类器利用 ClassifierUpdater从一个标注过的Instance

数据流进行学习。

另一个未标注实例的数据流可以利用 ClassifyQuery进行分类。

以下示例学习得到NAND函数,分类来自DRPC流的实例。

TridentTopology toppology = new TridentTopology();

// 从标注实例创建感知器状态。
TridentState perceptronModel = toppology
// 发射带有标注过的增强NAND特征的元组
// 即 : {label=true, features=[1.0 0.0 1.0]} 或者 {label=false, features=[1.0 1.0 1.0]}
.newStream("nandsamples", new NANDSpout()) // 更新感知器
.partitionPersist(new MemoryMapState.Factory(), new Fields("instance"), new ClassifierUpdater<Boolean>("perceptron", new PerceptronClassifier())); // 分类来自DRPC流的实例
toppology.newDRPCStream("predict", localDRPC)
// 将 DRPC ARGS 转换为无标注实例
.each(new Fields("args"), new DRPCArgsToInstance(), new Fields("instance")) // 利用感知器状态进行分类
.stateQuery(perceptronModel, new Fields("instance"), new ClassifyQuery<Boolean>("perceptron"), new Fields("prediction"));

Trident-ML 提供 KLDClassifier

,它实现了 基于 Kullback-Leibler距离的文本分类器.

这里是利用Reuters数据集创建新闻分类器的代码 :

TridentTopology toppology = new TridentTopology();

// 从标注实例创建 KLD 分类器状态
TridentState classifierState = toppology
// 发射带有文本和相关联的标签(即topic)的元组
.newStream("reuters", new ReutersBatchSpout()) // 将 trident tuple 转换为文本实例 (instance)
.each(new Fields("label", "text"), new TextInstanceCreator<Integer>(), new Fields("instance")) // 更新分类器
.partitionPersist(new MemoryMapState.Factory(), new Fields("instance"), new TextClassifierUpdater("newsClassifier", new KLDClassifier(9))); // 分类数据
toppology.newDRPCStream("classify", localDRPC) // 将 DRPC args 转换为文本实例(instance)
.each(new Fields("args"), new TextInstanceCreator<Integer>(false), new Fields("instance")) // 通过文本实例查询分类器
.stateQuery(classifierState, new Fields("instance"), new ClassifyTextQuery("newsClassifier"), new Fields("prediction"));

无监督分类

KMeans

是广为人知的 k-means algorithm

算法的实现,它用来将一些实例划分为不同的群组.

利用 ClusterUpdater

或者 ClusterQuery

来分别更新群组或者查询聚类器 :

TridentTopology toppology = new TridentTopology();

// 训练数据流
TridentState kmeansState = toppology
// 发射元组。它有一个实例,这个实例有一个作为标签的整数和三个 double 型的特征 (x0, x1, x2)
.newStream("samples", new RandomFeaturesForClusteringSpout()) // 将 trident 元组(tuple)转换为实例( instance )
.each(new Fields("label", "x0", "x1", "x2"), new InstanceCreator<Integer>(), new Fields("instance")) // 更新将样本划分为3类的 kmeans算法
.partitionPersist(new MemoryMapState.Factory(), new Fields("instance"), new ClusterUpdater("kmeans", new KMeans(3))); // 对数据流进行聚类
toppology.newDRPCStream("predict", localDRPC)
// 将 DRPC args 转换为 instance
.each(new Fields("args"), new DRPCArgsToInstance(), new Fields("instance")) // 查询 kmeans 来分类实例
.stateQuery(kmeansState, new Fields("instance"), new ClusterQuery("kmeans"), new Fields("prediction"));

流统计

流统计,例如平均值,标准差和计数,可以很容易的通过Trident-ML来计算.

这些统计值存储在 StreamStatistics 对象中.

统计值的更新和查询分别利用 StreamStatisticsUpdaterStreamStatisticsQuery 来执行:

TridentTopology toppology = new TridentTopology();

// 更新流统计值
TridentState streamStatisticsState = toppology
// 发射带有随机特征的元组
.newStream("randomFeatures", new RandomFeaturesSpout()) // 将 trident 元组(tuple)转换为实例( instance )
.each(new Fields("x0", "x1"), new InstanceCreator(), new Fields("instance")) // 更新流统计值
.partitionPersist(new MemoryMapState.Factory(), new Fields("instance"), new StreamStatisticsUpdater("randomFeaturesStream", StreamStatistics.fixed())); // 查询流统计值 (通过 DRPC)
toppology.newDRPCStream("queryStats", localDRPC)
// 查询流统计值
.stateQuery(streamStatisticsState, new StreamStatisticsQuery("randomFeaturesStream"), new Fields("streamStats"));

需要注意,Trident-ML 可以以滑动窗的形式支持概念漂移。

可以使用 StreamStatistics#adaptive(maxSize) 而不是 StreamStatistics#fixed() 来构造 带有长度为maxSize的窗口的StreamStatistics实现。

预处理数据

数据预处理是数据挖掘中很重要的一步。

Trident-ML 可以提供 Trident 函数来将原始特征转换为适于机器学习的描述。

TridentTopology toppology = new TridentTopology();

toppology
// 发射带有两个随机特征 (即 x0 和 x1) 已经一个相关联的布尔标签 (即 label) 的元组
.newStream("randomFeatures", new RandomFeaturesSpout()) // 将 trident 元组(tuple)转换为实例( instance )
.each(new Fields("label", "x0", "x1"), new InstanceCreator<Boolean>(), new Fields("instance")) // 将特征缩放到单位尺度
.each(new Fields("instance"), new Normalizer(), new Fields("scaledInstance"));
  • StandardScaler 将原始特征转换为标准正态分布的数据(零均值,单位方差的高斯分布)。它采用Stream Statistics 来减去均值并且缩小方差倍。
TridentTopology toppology = new TridentTopology();

toppology
// 发射带有两个随机特征 (即 x0 和 x1) 已经一个相关联的布尔标签 (即 label) 的元组
.newStream("randomFeatures", new RandomFeaturesSpout()) // 将 trident 元组转换为实例 (instance)
.each(new Fields("label", "x0", "x1"), new InstanceCreator<Boolean>(), new Fields("instance")) // 更新流统计值
.partitionPersist(new MemoryMapState.Factory(), new Fields("instance"), new StreamStatisticsUpdater("streamStats", new StreamStatistics()), new Fields("instance", "streamStats")).newValuesStream() // 利用原始流的统计数据来标准化流数据
.each(new Fields("instance", "streamStats"), new StandardScaler(), new Fields("scaledInstance"));

预先训练的分类器

Trident-ML 含有预先训练的的 twitter 情绪分类器.

它建立于由Niek Sanders开发的 Twitter 情绪语料库 的一个子集之上,拥有多类的PA分类器,可以将tweet上的消息分类为积极或者消极。

这个分类器以一个trident函数的形式实现,可以很容易的用于 trident topology :

TridentTopology toppology = new TridentTopology();

// 分类数据流
toppology.newDRPCStream("classify", localDRPC)
// 查询分类器
.each(new Fields("args"), new TwitterSentimentClassifier(), new Fields("sentiment"));

Maven 集成 :

Trident-Ml 发布于 Clojars (一个 Maven 库).

要在自己的项目中使用 Trident-ML,需要将如下内容添加到你的 pom.xml中 :

<repositories>
<repository>
<id>clojars.org</id>
<url>http://clojars.org/repo</url>
</repository>
</repositories> <dependency>
<groupId>com.github.pmerienne</groupId>
<artifactId>trident-ml</artifactId>
<version>0.0.4</version>
</dependency>

trident-ml 支持分布式学习吗?

Storm 允许 trident-ml 以分布式来处理一批元组 (数据集会在几个结点上计算). 这意味着 trident-ml 可以的对负载进行水平伸缩。

但是,为了能够实时添加,Storm 禁止状态更新,而模型学习就是通过状态更新完成的。这就是为什么学习过程不是分布式的。幸好缺乏这样的并行性不是一个真正的瓶颈,因为增量式算法很快,也很简单。

在trident-ml 不会实现分布式算法, 这是由它的设计决定的.

因此你无法实现分布式学习,但是你依然可以划分你的数据进行预处理或者以一种分布式的方式来充实你的数据。

Copyright and license

Copyright 2013-2015 Pierre Merienne

Licensed under the Apache License, Version 2.0 (the "License");

you may not use this file except in compliance with the License.

You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software

distributed under the License is distributed on an "AS IS" BASIS,

WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

See the License for the specific language governing permissions and

limitations under the License.

[翻译] Trident-ML:基于storm的实时在线机器学习库的更多相关文章

  1. 基于java开发的在线题库系统tamguo

    简介 探果网(简称tamguo)是基于java开发的在线题库系统,包括 在线访问 后台运营 会员中心 书籍中心 管理员账号:system 密码:123456 因为线上数据和测试数据没有做到隔离,作者已 ...

  2. [转]基于Storm的实时数据处理方案

    1 文档说明 该文档描述的是以storm为主体的实时处理架构,该架构包括了数据收集部分,实时处理部分,及数据落地部分. 关于不同部分的技术选型与业务需求及个人对相关技术的熟悉度有关,会一一进行分析. ...

  3. 基于storm的在线关联规则

    基于storm的在线视频推荐算法.算法根据youtube的推荐算法  算法相对简单,能够觉得是关联规则仅仅挖掘频繁二项集.以下给出与storm的结合实如今线实时算法 , 关于storm见这里.首先给出 ...

  4. 基于socket.io的实时在线选座系统

    基于socket.io的实时在线选座系统(demo) 前言 前段时间公司做一个关于剧院的项目,遇到了这样一种情况. 在高并发多用户同时选座的情况下,假设A用户进入选座页面,正在选择座位,此时还没有提交 ...

  5. 基于express+redis高速实现实时在线用户数统计

    作者:zhanhailiang 日期:2014-11-09 本文将介绍怎样基于express+redis高速实现实时在线用户数统计. 1. 在github.com上创建项目uv-tj.将其同步到本地: ...

  6. 制作属于自己的翻译软件(基于PyQt5+Python+实时翻译)

    目录 制作属于自己的翻译软件(基于PyQt5+Python+实时翻译) 翻译软件上传到github上. 软件截图 主要的思想 界面方面 程序方面 制作属于自己的翻译软件(基于PyQt5+Python+ ...

  7. 使用Storm实现实时大数据分析

    摘要:随着数据体积的越来越大,实时处理成为了许多机构需要面对的首要挑战.Shruthi Kumar和Siddharth Patankar在Dr.Dobb’s上结合了汽车超速监视,为我们演示了使用Sto ...

  8. Storm分布式实时流计算框架相关技术总结

    Storm分布式实时流计算框架相关技术总结 Storm作为一个开源的分布式实时流计算框架,其内部实现使用了一些常用的技术,这里是对这些技术及其在Storm中作用的概括介绍.以此为基础,后续再深入了解S ...

  9. (二): 基于ZeroMQ的实时通讯平台

    基于ZeroMQ的实时通讯平台 上篇:C++分布式实时应用框架 (Cpp Distributed Real-time Application Framework)----(一):整体介绍 通讯平台作为 ...

随机推荐

  1. warning: this decimal constant is unsigned only in ISO C90问题的处理及理解

    参考:https://blog.csdn.net/duguduchong/article/details/7709482 https://bbs.csdn.net/topics/391892978?p ...

  2. 创建Java程序并设置快捷提示

    1.new Java project 创建项目 2.new package 创建包,cn.com.test 3.创建Java文件 4.Java智能提示的设置 window/preference 在Au ...

  3. s4-3 CSMA

    载波侦听多路访问协议  CSMA:Carrier Sense Multiple Access 特点:"先听后发" 改进ALOHA协议的侦听/发送策略  分类 非持续式 持 ...

  4. Objective-C的泛型

    WWDC2015的明星是Swift.在Swift语言到2.0以后会被开源,这其中包括了protocol扩展和一个新的错误处理API. 苹果的小baby已经长成,并且意料之中的获得了开发者的关注.但是在 ...

  5. 2018-03-13 HTTP Socket TCP学习

    协议学习: https://www.jianshu.com/p/a5410f895d6b https://www.jianshu.com/p/42260a2575f8 实际例子: nano实际例子,和 ...

  6. (转).net面试题(老赵)

    转自:http://www.cnblogs.com/chenxiaoran/archive/2012/05/27/2519988.html 1.什么是CLR 公共语言运行时(Comman langua ...

  7. (拓扑)确定比赛名次 -- hdu -- 1285

    http://acm.hdu.edu.cn/showproblem.php?pid=1285 确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memo ...

  8. centos修改主机名命令

    centos修改主机名命令   需要修改两处:一处是/etc/sysconfig/network,另一处是/etc/hosts,只修改任一处会导致系统启动异常.首先切换到root用户.    vi / ...

  9. 中国移动物联网平台数据转发 c# 控制台程序

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.N ...

  10. 修改Android EditText光标颜色

    EditText有一个属性:android:textCursorDrawable,这个属性是用来控制光标颜色的   android:textCursorDrawable="@null&quo ...