神机喵算


  • 首页

  • 归档

  • 标签

深度学习快速实践:TensorFlow

发表于 2016-08-12

写在之前:本书是翻译自<first contact with tensorflow>,已获原作者授权。

作者写这本书的目的是为了快速实践深度学习。因此,读者应该有基本的机器学习知识和必要的数据知识。本书将采用主流的机器学习算法来进行tensorflow训练。

第一章将简短介绍TensorFlow代码和编程模型。

Tensorflow基本概念

本章将简短介绍TensorFlow代码和编程模型。学完本章后,期待读者会TensorFlow的package安装方法。

Tensorflow开源包

TensorFlow源于Google大脑团队的机器学习和深度神经网络研究。这个系统能够解决更广泛的机器学习问题。

TensorFlow使用计算图来表示一个计算任务。图中的节点代表数学运算,也可以表示数据的输入、输出和读写等操作;图中的边表示多维数组(Tensors),节点之间的某种联系。

TensorFlow使用计算图来构建计算过程,用符号来表示计算操作。这使得TensorFlow可以同时运用Linux 64位操作系统的CPU 和GPU 性能,TensorFlow也可以在移动端Android 或者iOS 上执行。

TensorFlow的可视化模块TensorBoard可监控算法的运行状态并显示。

TensorFlow Serving

Google最近开源了TensorFlow Serving,TensorFlow Serving可以帮助机器学习开发者将他们的TensorFlow机器学习模型(可以扩展到其它各类型的机器学习模型)加载到产品中。TensorFlow Serving采用C++编写,并已开源到github。

TensorFlow和TensorFlow Serving到底有啥区别呢?

TensorFlow项目主要是基于各种机器学习算法构建模型,并为某些特定类型的数据输入做适应学习,而TensorFlow Serving则专注于让这些模型能够加入到产品环境中。开发者使用TensorFlow构建模型,然后TensorFlow Serving基于客户端输入的数据使用前面TensorFlow训练好的模型进行预测。

个人认为TensorFlow Serving是将tensorflow训练出来的模型更好的应用于生产环境中,通过它的API等支持的方式来方便对外提供稳定可靠的服务。TensorFlow Serving的意义就在于能够很方便的将深度学习生产化,解决了模型无法提供服务的弊端,并且用的是C++语言,性能上应该不错。这样以后深度学习方向的创业公司都能很方便的将产品商业化,保证7*24小时的可靠服务。

典型的pipeline:输入待训练的数据到学习者(Learner)中,输出训练模型。稍后模型验证之后发布到TensorFlow Serving系统。
image
对于生产环境来说,启动模型,随着时间不断迭代模型,新的训练数据出现需要训练优化模型,这些都是常态。现在有了TensorFlow Serving就可以在不停止服务的情况下更新模型和数据,Google内部许多pipelines一直在运行。

客户端和服务端之间的通信采用的是RPC协议实现,其为Google开源的一个高性能RPC框架。

安装TensorFlow

是时候开始练手了,你需要一遍看书一边在电脑上操作。

TensorFlow提供Python API(也可以用C / C ++),所以你得安装Python 2.7(具体咋安装自行Google)。

一般来讲,使用Python工作时最好用virtualenv虚拟环境。Virtualenv可以在一台机器不同的项目间保持Python依赖隔离。使用virtualenv安装TensorFlow不会覆盖已有的Python版本,这样做也能使排查安装问题变得更容易。

首先安装必备软件:

1
2
3
4
5
6
# Ubuntu/Linux 64-bit
$ sudo apt-get install python-pip python-dev python-virtualenv
# Mac OS X
$ sudo easy_install pip
$ sudo pip install --upgrade virtualenv

建立virtualenv环境. 为了将环境建在 ~/tensorflow 目录下, 执行:

1
$ virtualenv --system-site-packages ~/tensorflow

接下来激活virtualenv:

1
2
3
$ source ~/tensorflow/bin/activate # with bash
$ source ~/tensorflow/bin/activate.csh # with csh
(tensorflow)$

Once the virtualenv is activated, you can use pip to install TensorFlow inside it:
激活virtualenv后即可使用pip在virtualenv内安装TensorFlow:

1
2
3
4
5
6
# Ubuntu/Linux 64-bit, CPU only:
(tensorflow)$ sudo pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.7.1-cp27-none-linux_x86_64.whl
# Mac OS X, CPU only:
(tensorflow)$ sudo easy_install --upgrade six
(tensorflow)$ sudo pip install --upgrade https://storage.googleapis.com/tensorflow/mac/tensorflow-0.7.1-cp27-none-any.whl

你可访问官方文档来确认所安装的版本。

如果你要在GPU上跑你的代码,你需要访问官方文档来看看是否满足指定的要求。运行Tensorflow GPU需要安装额外的软件。

当你使用完后可执行如下命令关闭虚拟环境:

1
(tensorflow)$ deactivate

其它安装TensorFlow的方法请访问官方网站获取信息。

TensorFlow的 “Hello World”

你可以使用任何文本编辑器编写python代码,然后保存为扩展名“.py”的文件(eg test.py)。用python命令行即可执行test.py。

为了快速的熟悉TensorFlow编程,下面从一段简单的代码开始:

1
2
3
4
5
6
7
8
9
10
import tensorflow as tf
a = tf.placeholder("float")
b = tf.placeholder("float")
y = tf.mul(a, b)
sess = tf.Session()
print sess.run(y, feed_dict={a: 3, b: 3})

在上面的代码中,导入Python模块tensorflow。然后定义符号变量,也称为占位符。在后面程序执行中会操作这些变量。我们把这些变量作为参数,TensorFlow的乘法函数tf.mul会调用。数学函数tf.mul会操作tensor,这时的动态大小、多维数组。

TensorFlow的算术操作如下:

1
tf.add,tf.sub,tf.mul,tf.div,tf.mod,tf.abs,tf.neg,tf.sign,tf.inv,tf.square,tf.round,tf.sqrt,tf.pow,tf.exp,tf.log,tf.maximum,tf.minimum,tf.cos,tf.sin

TensorFlow也为程序员提供一些函数来进行数学操作,列表如下:
操作 |描述|
—|—|
tf.diag| 给定对角线上的值,返回对角tensor|
tf.transpose| 转置|
tf.matmul| tensor乘法,即矩阵乘法|
tf.matrix_determinant |方阵的行列式|
tf.matrix_inverse| 方阵的逆矩阵|

接下来,创建一个会话。事实上,直到这步还没有执行TensorFlow代码。程序通过Session()创建一个会话与Tensorflow库交互;直到调用run()方法才会创建会话,并运行指定的代码。在本例中,run()方法调用变量值和feed_dict参数,表达式运行完成退出会显示结果9 。

本例比较简单,仅仅为了展示TensorFlow完整的过程。然而,我们更感兴趣的是灵活的结构化代码,插入操作来构建计算图。比如,类似于Python编程中的IPython。为了达到这个目的,TensorFlow提供了tf.InteractiveSession()类。

编程模型的理解已经超出了本书的范围,但为了继续接下来的章节,我们仅仅需要知道计算结构包含所有的操作信息和数据。

上面的计算图描述的是数学计算。节点(node)代表数学操作,但是它们也可以代表数据项的点,输出结果或者读写持久化的变量。边(edge)描述的是输入和输出的节点之间的关系。

TensorFlow 将图形定义转换成分布式执行的操作, 以充分利用可用的计算资源(如 CPU 或 GPU). 一般你不需要显式指定使用 CPU 还是 GPU, TensorFlow 能自动检测. 如果检测到 GPU, TensorFlow 会尽可能地利用找到的第一个 GPU 来执行操作.

并行计算能让代价大的算法计算加速执行,TensorFlow也在实现上对复杂操作进行了有效的改进。大部分核相关的操作都是设备相关的实现,比如GPU。下面是一些重要的操作/核:

操作分组 操作
Maths Add, Sub, Mul, Div, Exp, Log, Greater, Less, Equal
Array Concat, Slice, Split, Constant, Rank, Shape, Shuffle
Matrix MatMul, MatrixInverse, MatrixDeterminant
Neuronal Network SoftMax, Sigmoid, ReLU, Convolution2D, MaxPool
Checkpointing Save, Restore
Queues and syncronizations Enqueue, Dequeue, MutexAcquire, MutexRelease
Flow control Merge, Switch, Enter, Leave, NextIteration

TensorBoard:可视化学习

为了更方便TensorFlow 程序的理解,TensorFlow 包括从函数、调试与优化等方面进行了可视化,并发布了一套叫做TensorBoard 的可视化工具。TensorBoard 从不同统计数据来展现图计算过程的详细信息和参数。

TensorBoard模块的数据展示是在TensorFlow执行和汇总数据存储的过程。在TensorFlow的文档,你可以找到更详细的Python API的解释。

输入下面的指令来启动TensorBoard,包括跟踪(也可以成为序列化)的路径参数:

1
(tensorflow)$ tensorboard --logdir=&lt;trace file&gt;

TensorBoard 开始运行,你可以通过在浏览器中输入http://localhost:6006 来查看。TensorBoard可视化工具的详细使用已超出本书的范围,若想了解更多,可参见文档。


侠天,专注于大数据、机器学习和数学相关的内容,并有个人公众号:bigdata_ny分享相关技术文章。

若发现以上文章有任何不妥,请联系我。

image

Netflix支付生态系统迁移到AWS的实践(part II)

发表于 2016-08-11

本文是Netflix支付生态系统迁移到AWS的第二部分,主要讲解具体的支付应用和数据存储的技术细节。支付系统迁移的概览见第一部分《Netflix支付生态系统迁移到AWS的实践(part I)》。

随着Netflix全球各地的业务启动,带来了系统数据上的不断增长,进而意识到越早迁移到AWS云服务对Netflix越有利。因为现有对系统将不能继续扩展。

毋庸置疑,迁移如此高度复杂、敏感的应用和数据库并不能干扰线上的业务,是一项艰巨的任务。

Billing的职责和挑战

  • Billing team保障Netflix公司财务数据。每天生成订阅费,礼品卡,积分,退款等数据,汇报给财务和会计部门。数据处理严格遵循SLAs,并保证处理管道无延迟;
  • Billing对数据丢失零容忍;
  • 大部分情况下,支付数据是结构化存储成关系模型,并确保数据库操作是事务性的。换句话说,需要保证操作都具有ACID。但是,也有些场景支持跨区域低延迟的访问;
  • Billing集成DVD业务,但两者的架构不同,增加了集成的难度;
  • Billing team需要为Netflix客户服务中心提供数据支持,回答Netflix会员的支付问题。同时为客户支持提供数据预览。

现有支付系统的架构如下:

image

  • 数据中心有2个Oracle数据库:一个存储用户订阅信息,另外一个存储是付费数据;
  • 基于REST 的多个应用:从www.netflix.com到客户支持应用的服务调用;
  • 3个批量应用:
    • Subscription Renewal
    • Order & Payment Processor
    • Revenue Reporting
  • Billing Proxy应用(AWS云服务):从Netflix应用路由调用到数据中心;
  • Weblogic队列:进程间的通信。

迁移支付系统的目标是把所有这些入AWS云服务。

迁移步骤

整个过程分三步走:

  • Act I:新国家地区的支付数据直接上云,并把数据同步回数据中心以供批量作业工作;
  • Act II:面向用户的数据持久化到Cassandra,保证数据最终一致性,不需要保障操作的ACID;
  • Act III:最后迁移SQL数据库到AWS云服务。

Act I – 转发新国家的支付数据到AWS云服务,并同步数据到数据中心(DC)

Netflix新增加6个国家地区,并把部分国家的支付数据放在云上。这意味着面向用户的数据和应用将在云服务中,但同时也需要同步数据回数据中心。这些新增加的国家的用户数据在云服务上服务,同时批处理仍然运行在数据中心。关于Netflix数据中心可以见Part I。

所有的API都是基于云服务用Spring Boot 和Spring 集成开发的应用。Spring Boot提供了框架,使得作者能够快速的开发新应用,并把注意力更多的聚焦在业务逻辑上。Spring 集成一次编写、可重用。新增6个国家的会员数据的API调用可在AWS的任意区域处理,数据存储在Cassandra数据库。这使得即使整个AWS区域宕机,这些国家的支付数据仍可使用,这就是云服务的魅力所在。

Netflix在AWS云服务多个区域的EC2实例上发布应用。他们为云服务代理应用增加一个转发层,把新加的国家的用户支付调用转发到云服务上新的支付API,而老国家地区的支付调用还是继续到数据中心的老支付API。他们从AWS云服务区域之一直接连接到数据中心的Oracle数据库,然后开发一个应用通过SQS来同步其它三个区域的Cassandra数据到这个区域。

Netflix从数据中心迁移Subscription Renewal 应用到AWS云服务,所以他们不能把负载放在数据中心。对于新增的国家区域,他们写爬虫每天去Cassandra爬取会员数据,并追上会员付费数据。行迭代方法在新增的国家使用,但对于其它国家的数据,特别是美国数据量太大,不容易迁移到云服务。不过这事还得继续,只能试试水。

Netflix选择Cassandra作为数据存储是因为它可以写入到AWS任意区域并快速复制写入其它区域。作者设计数据模型如图所示:

image

Act I步骤实施后,支付系统架构如下:

image

Act II – 迁移所有应用和已有国家的数据到AWS云服务

步骤Act I成功完成后,Netflix支付团队开始迁移其它应用到AWS云服务上,此时Oracle数据库未迁移。大部分业务逻辑是批量应用,而且已经成熟的运行了好多年。此次借着迁移的机会把原有代码进行了重构。

Netflix开发Aegisthus从Cassandra SSTable来拉取数据,并转换成JSON格式的行。Pig脚本按天跑mapreduce来处理海量数据集。Sqoop作业从Cassandra 和Oracle 拉取数据写入Hive。为了验证海量数据的迁移,Netflix开发一个comparator tool来比较验证迁移前后的数据。

各项准备工作做好之后,Netflix支付团队首先拿会员数少的国家“开刀”,迁移的步骤大概如下:

  • 迁移时禁用non-GET的API。(这不会影响会员,但会造成支付的更新和订阅的延迟);
  • 使用Sqoop job从Oracle 获取数据,写入S3 和Hive;
  • 用Pig转换数据写入Cassandra格式;
  • 插入所有的会员记录到Cassandra;
  • 启用non-GET的API。

在验证迁移后的数据之后,开始迁移下一个国家,最后迁移的是美国,因为美国的会员量最大。

步骤Act II完成之后,支付系统的架构变为:
image

Act III – 和数据中心Say “Good bye”!

最后开始迁移剩下的Oracle数据库。考虑到Oracle高度的关系型,如果迁移到NoSQL的数据,将会比较麻烦。在支付团队忙于前两步时,云数据库工程师迁移Oracle数据库到EC2的MySQL实例。所以在迁移第三步时,MySQL数据库已准备好。接下来,对前期的代码做了部分兼容的优化。

现在的数据库架构包括一个MySQL Master数据库,一个容灾 DB (从MySQL Master复制,如果Master挂掉即可启用为Master),Slave数据库(用来做应用的访问)。

整个支付系统迁移完之后,架构图如下:

image

在路上

随着支付系统迁移到AWS云服务的完成,Netflix流式架构已全部运行在云端。Netflix可以按需扩展任意Netflix服务,基于用户量来做预测性扩容,使用Spinnaker单点发布和Netflix各应用的持续发布。

参考

[1] http://techblog.netflix.com/2016/07/netflix-billing-migration-to-aws-part-ii.html


侠天,专注于大数据、机器学习和数学相关的内容,并有个人公众号:bigdata_ny分享相关技术文章。

若发现以上文章有任何不妥,请联系我。

image

TensorFlow——岂止于深度学习

发表于 2016-08-09

摘要:TensorFlow,机器学习构建模块和算法合集。

TensorFlow——岂止于深度学习。TensorFlow提供了“一揽子”常用数值计算和机器学习算法的构建模块。在本文中,作者将介绍广泛使用的机器学习算法以及它们在TensorFlow的tf.contrib中的构建模块。Note:许多tf.contrib中的稳定模块将会移到TensorFlow的主模块。

High level的TF.Learn Estimator

TF.Learn 是TensorFlow内部的high-level模块,并提供各种机器学习算法以及相应的estimator模块。除了简单易用的深度学习API(Deep Neural Networks,Recurrent Neural Networks等)外,TensorFlow提供的流行的机器学习算法如下,包括且不限于:

  • K均值聚类(K-means clustering)
  • 随机森林(Random Forests)
  • 支持向量机(SVM)
  • 高斯混合模型聚类(Gaussian Mixture Model clustering)
  • 线性/逻辑回归(Linear/logistic regression)

学习如何构建自定义机器学习estimator,请看上篇文章《深度解析TensorFlow组件Estimator:构建自定义Estimator》。

Statistical Distribution

TensorFlow提供了主流的各种统计分布函数,在tf.contrib.distributions中,包括且不限于Bernoulli,Beta, Chi2,Dirichlet,Gamma,Uniform等分布函数。这些统计分布函数是构建机器学习算法的重要构建模块,特别是像Bayesian这一类的概率模型。

Layer Component

在tf.contrib.layers内部,有许多产生layer操作及其相关权重和偏差变量的函数。这些大部分都是用来构建不同深度学习架构的。也有些函数是提供归一化,卷积层,dropout层(注:Dropout是在训练过程中以一定概率1-p将隐含层节点的输出值清0),‘one-hot’编码等。下面来粗略浏览一下:

  • tf.contrib.layers.optimizers模块:tf.contrib.layers.optimizers包括的优化器有Adagrad,SGD,Momentum等。它们用来解决数值分析的优化问题,比如,优化参数空间寻找最优模型;
  • tf.contrib.layers.regularizers模块:tf.contrib.layers.regularizers包括的正则化有L1规则化和L2规则化。规则化经常被用来抑制模型训练时特征数过大导致的过拟合(overfitting)问题;有时也作为Lasso回归和Ridge回归的构建模块;
  • tf.contrib.layers.initializers模块:tf.contrib.layers.initializers一般用来做模型初始化。包括深度学习在内的许多算法都要求计算梯度来优化模型。随机初始化模型参数有助于在参数空间中找到最优参数解。TensorFlow提供的有Xavier初始化器,用来在所有层中保持梯度大体相同;
  • tf.contrib.layers.feature_column模块:tf.contrib.layers.feature_column提供函数(比如,bucketing/binning,crossing/compostion,和embedding)来转换连续特征和离散特征;
  • tf.contrib.layers.embedding模块:tf.contrib.layers.embedding转化高维分类特征成低维、密集实数值向量。

损失函数(Loss Function)和Metric

  • tf.contrib.losses模块:机器学习算法优化依赖于损失函数。TensorFlow在tf.contrib.losses模块中提供大量的损失函数以供选择,比如,Sigmoid 交叉熵损失函数(sigmoid cross entropy)和Softmax(softmax cross entropy),Log损失函数,Hinge损失函数等;
  • tf.contrib.metrics模块:tf.contrib.metrics中提供了各种Metric,比如,precision,recall,accuracy, auc,MSE等。

其它

前面作者仅仅抛砖引玉地给出TensorFlow的contrib模块中重要的内容。其它更重要的函数,比如,DataFrame和Monitors可参考以前的文章。

参考

[1] http://terrytangyuan.github.io/2016/08/06/tensorflow-not-just-deep-learning


侠天,专注于大数据、机器学习和数学相关的内容,并有个人公众号:bigdata_ny分享相关技术文章。

若发现以上文章有任何不妥,请联系我。

image

如何编写自己的推荐系统

发表于 2016-07-31

摘要:推荐系统过去都是用在物品推荐上,Netflix是最典型的例子。当你浏览几个物品之后,它会给你推荐新的物品。你是否思考过这是如何工作的?或者应用到你自己的网站或者应用中?

作者将使用Python完成一个完整的、简单的推荐系统,并给出相应的代码。这里将使用电影点击率数据(1 - 5 星)作为源数据集。

小规模实例

在进行成千上万大规模点击率实验之前,先使用小规模的数据集来展示推荐系统是如何工作的,这样会很快看到一些有意义的结果。

作者使用的样列数据见链接。HP代表<哈利波特>(Harry Potter)三部曲,TW代<表暮光之城>(Twilight),SW代表<星球大战>(Star Wars)前三部。

HP1 HP2 HP3 TW SW1 SW2 SW3
A 4 5 1
B 5 5 4
C 2 4 5
D 3 3

A到D是四个评分用户。比较意外的是:用户D未观看第一部<哈利波特>就跑去看第二部<哈利波特>。让我们试着用已有的用户评分数据去评估用户D有多大可能去观看<哈利波特>第一部。这个过程也可以用来处理推荐系统中遇到的缺失数据问题,这部分会在稍后讲解。

找出缺失评分数据(D, HP1)最简单的方法是:看过第一部<哈利波特>的用户具有相似的品味,根据他们的观影评分来评估。本例的数据太少,只有4个用户,可能最终的推荐结果不太精确。但使用更多的用户数据会使得推荐结果更精确。

那我们如何找出与用户D 品味最相似的用户呢?余弦相似度(或称为余弦距离)可以解决这个问题。余弦相似度通过输入两个用户的评分,输出0 到1 之间的值(此值即为余弦相似度)。1 代表电影评分完全相同。下面我们就来找出用户最大的余弦相似度。

Cosine Distance/Similarity

一般公式为:

1
\frac{(a_1 \times b_1) + (a_2 \times b_2) + \ldots}{\sqrt{(a_1)^2 + (a_2)^2 + \ldots}\sqrt{(b_1)^2 + (b_2)^2 + \ldots}}

其中, a 和 b 代表用户。

下面让我们来计算用户 A (红色)和用户 B(蓝色)余弦相似度(cosine similarity):

1
\frac{(\color{red}4 \times \color{blue}5) + (\color{red}0 \times \color{blue}5) + (\color{red}0 \times \color{blue}4) + (\color{red}5 \times \color{blue}0) + (\color{red}1 \times \color{blue}0) + (\color{red}0 \times \color{blue}0) + (\color{red}0 \times \color{blue}0)}{\sqrt{\color{red}4^2 + \color{red}0^2 + \color{red}0^2 + \color{red}5^2 + \color{red}1^2 + \color{red}0^2 + \color{red}0^2}\sqrt{\color{blue}5^2 + \color{blue}5^2 + \color{blue}4^2 + \color{blue}0^2 + \color{blue}0^2 + \color{blue}0^2 + \color{blue}0^2 }}

上述中的零值对最终的结果没有影响,简化得到:

1
\frac{(\color{red}4 \times \color{blue}5)}{\sqrt{\color{red}4^2 + \color{red}5^2 + \color{red}1^2}\sqrt{\color{blue}5^2 + \color{blue}5^2 + \color{blue}4^2}}

这里只能比较用户A 和B ,因为用户C 并没有对HP1电影评分,所以对推荐用户D 观看HP1电影的工作没有啥帮助。我们可以计算出对应的余弦相似度:

  • [ ] 用户A 和 用户D 的余弦相似度= 0.0
  • [ ] 用户B 和 用户D 的余弦相似度= 0.435

所以,可以看出用户B 很明显有最大的余弦相似度。下面是相应的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
_ = 0 # A missing value.
users = {
'A': [4, _, _, 5, 1, _, _],
'B': [5, 5, 4, _, _, _, _],
'C': [_, _, _, 2, 4, 5, _],
'D': [_, 3, _, _, _, _, 3],
}
def cosine_distance(user1, user2):
top = 0
user1bottom = 0
user2bottom = 0
for i in range(0, len(user1)):
top += user1[i] * user2[i]
user1bottom += user1[i] * user1[i]
user2bottom += user2[i] * user2[i]
return top / (sqrt(user1bottom) * sqrt(user2bottom))
print cosine_distance(users['A'], users['D'])
print cosine_distance(users['B'], users['D'])

需要注意的是:前面我们是把缺失值置为0。但这意味着我们把没有评分的电影都认为是用户不喜欢的电影(因为评分若为0代表用户不喜欢这部电影,而缺失评分值实际上只是未知,并不代表喜欢,也不代表不喜欢)。一般更好的做法是计算出一个平衡值(balanced value)来替代缺失数据。在本例中选择2.5更好,在改变_的值后我们得到:

  • [ ] 用户A 和 用户D 的余弦相似度= 0.915
  • [ ] 用户B 和 用户D 的余弦相似度= 0.952

我们找出用户B给出的电影评分,5 星好评。那说明用户D 也应该会喜欢<哈利波特>第一部,并给出5 星好评。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def estimate_rating(users, userName, movie):
user_best_match = None
user_best_match_dist = 0
for user in users:
# We don't want to calculate ourself.
if user == userName:
continue
# Ignore users that haven't rated the movie.
if users[user][movie] == 0:
continue
dist = cosine_distance(users[userName], users[user])
print '%s -> %s = %.3f' % (userName, user, dist)
if dist >= user_best_match_dist:
user_best_match_dist = dist
user_best_match = user
# Return the rating of the best matched user.
return users[user_best_match][movie]
HP1, HP2, HP3, TW, SW1, SW2, SW3 = range(0, 7)
print estimate_rating(users, 'D', HP1)

如果有更多的用户评分数据,我们将会得到更精确的结果。而且我们会给出固定数量的相似用户的平均相似值,而不是最大的相似值。

下期内容

在下篇文章中,作者使用真实场景的数据集进行实战。主要关注三部分:推荐算法的性能、推荐结果质量和推荐算法精度的计算。

http://elliot.land/how-to-write-your-own-recommendation-system-part-1


侠天,专注于大数据、机器学习和数学相关的内容,并有个人公众号:bigdata_ny分享相关技术文章。

若发现以上文章有任何不妥,请联系我。

image

【机器学习】在TensorFlow中构建自定义Estimator:深度解析TensorFlow组件Estimator

发表于 2016-07-31

你是否思考过TensorFlow的tutorial和其背后的“魔力”?希望这篇文章至少能给你思考的正确方向。

TensorFlow的基本概念可以去查看TensorFlow官方文档。这里将帮你更好的理解TensorFlow Learn中estimator的工作原理,并指导你构建适合自己特定应用的estimator。

BaseEstimator和Estimator的理解

BaseEstimator是TensorFlow训练和评估模块的抽象和基类。它利用graph_actions.py的隐藏逻辑,提供像fit(),partial_fit(),evaluate()和predict()的基本功能,处理不同类型的输入数据批量拉取(Note:未来learn.DataFrame将替代DataFeeder)。它通过dtypes来检查输入数据的兼容,考虑输入数据是否稀疏需要使用estimators.tensor_signature。

BaseEstimator为monitors,checkpointing等初始化设置,并提供了构建和评估自定义模块的大部分逻辑。_get_train_ops(), _get_eval_ops()和_get_predict_ops()放在子类中实现,给Estimator自定义带来了更大的自由。BaseEstimator也是分布式的。

TensorFlow模块中Estimator的实现给我们重写BaseEstimator子类提供了很好的范本。
例如,Estimator中的_get_train_ops()载入features和targets作为输入,返回训练Operation和损失Tensor的一个tuple。如果你想完成自己的estimator,并且用于非监督机器学习训练,这时你就可以自由决定targets是否可忽略。

类似地,子类中的_get_eval_ops()可自定义metric来评估每步的训练。在TensorFlow的high-level模块中可发现一打适用的metric。它们会返回Tensor对象的字典,表示指定metric的评价ops。

_get_predict_ops()可实现自定义的prediction,例如 概率 v.s. 实际预测输出。它将返回一个Tensor或者Tensor对象的字典,表示预测ops。你可以很轻松的使用父类的predict()函数实现像transform()的功能。

Estimator示例

逻辑回归(LogisticRegressor)

Estimator已经提供了自定义estimator大部分实现。例如,LogisticRegressor仅需实现自己的metric即可,比如AUC,accuracy,precision和recall。开发者使用LogisticRegressor子类即可实现二值分类问题。

随机森林(TensorForestEstimator)

TensorForestEstimator已经增加到TensorFlow Learn。contrib.tensor_forest详细的实现了随机森林算法(Random Forests)评估器,并对外提供high-level API使得开发者构建随机森林评估器更简单。

例如,开发者只需传入params到构造器,params使用params.fill()来填充,而不用传入所有的超参数,Tensor Forest自己的RandomForestGraphs使用这些参数来构建整幅图。

1
2
3
4
5
6
7
8
9
class TensorForestEstimator(estimator.BaseEstimator):
"""An estimator that can train and evaluate a random forest."""
def __init__(self, params, device_assigner=None, model_dir=None,
graph_builder_class=tensor_forest.RandomForestGraphs,
master='', accuracy_metric=None,
tf_random_seed=None, verbose=1,
config=None):
self.params = params.fill()

随机森林算法的接口实现有许多细节,_get_predict_ops()利用tensor_forest.RandomForestGraphs来构建随机森林图,调用graph_builder.inference_graph来获取预测ops。

1
2
3
4
5
6
def _get_predict_ops(self, features):
graph_builder = self.graph_builder_class(
self.params, device_assigner=self.device_assigner, training=False,
**self.construction_args)
features, spec = data_ops.ParseDataTensorOrDict(features)
return graph_builder.inference_graph(features, data_spec=spec)

类似地,使用graph_builder.training_loss来实现_get_train_ops()。注意,TensorForestEstimator使用了tensor_forest.data.data_ops的模块功能,比如 ParseDataTensorOrDict和ParseLabelTensorOrDict解析输入特征和标签。

其它用例

K-means聚类的estimator刚加入项目,放在contrib.factorization.python.ops.kmeans。 更多的例子可以在learn.estimators中找到。

强烈推荐你先领悟代码整体结构,开始实现自己的estimator之旅!

参考:http://terrytangyuan.github.io/2016/07/08/understand-and-build-tensorflow-estimator

侠天,专注于大数据、机器学习和数学相关的内容,并有个人公众号:bigdata_ny分享相关技术文章。

若发现以上文章有任何不妥,请联系我。

image

Apache Spark 2.0 正式发布:Easier、Faster、Smarter

发表于 2016-07-30

摘要:Apache Spark 2.0 正式发布,下面来深度解读一下。主要从Apache Spark 2.0的Easier、Faster和Smarter三方面来体现。

Easier: ANSI SQL and Streamlined APIs

除了Spark一贯“引以为傲”的简单易用API外,Spark 2.0主要聚焦在两方面:
(1) standard SQL support;
(2) DataFrame/Dataset API的统一。

在SQL方面,扩展了Spark的SQL支持,引入ANSI SQL解析器和子查询。Spark 2.0 可执行所有99 TPC-DS查询(支持SQL:2003)。

在API编程方面,主要是提供了简化的Spark APIs:

  • DataFrames和Datasets的API统一,支持Scala/Java,关于RDD、DataFrames和Datasets三种API的详细解析见《Apache Spark 2.0三种API的传说:RDD,DataFrame和Dataset》;
  • SparkSession:SparkSession在Spark 2.0中是替代SQLContext和HiveContext的,作为新的入口点。老的SQLContext和HiveContext继续保留,味了向后兼容;
  • 更简单、更高效的Accumulator API;
  • 基于DataFrame的Machine Learning API作为主要的ML API;
  • 机器学习管道的持久化,详细解析见《Apache Spark 2.0预览: 机器学习模型持久化》;
  • R语言支持Distributed algorithm。

Faster: Apache Spark as a Compiler

重新思考Spark的物理执行层时,发现大部分CPU时间花费在毫无意义的工作上了,比如,虚拟函数的调用或者读/写中间数据到CPU cache或者内存,着在其它现代数据引擎中都存在(Spark或者MPP数据库)。所以得想办法减少CPU时间浪费。

Spark 2.0 使用第二代Tungsten engine。Tungsten engine应用现代编译器原理和MPP数据库技术到Spark。主要得方法是“whole-stage code generation”。具体分析见我在InfoQ上的文章。

Smarter: Structured Streaming

Spark Streaming在Spark 2.0之前仅仅是个streaming engine。但广大使用者需要的是离线处理和实时处理深度结合的系统,并能处理业务逻辑的变化,和外部数据存储交互。

对比之前的streaming系统,Structured Streaming有三方面的优化:

  • 和批处理job作业的API整合:开发者简单的用DataFrame / Dataset API写完批处理计算,Spark会以Streaming形式自动的进行增量计算;
  • 和存储系统交互中保持事务性:Structured Streaming会在跨引擎和存储系统中处理fault tolerance和consistency;
  • 和Spark其它组件紧密集成: Structured Streaming处理完的数据可直接放入Spark SQL和MLlib等处理。

结论

以上即为Apache Spark 2.0的解读,主要在用户的易用性和性能上做了优化。


侠天,专注于大数据、机器学习和数学相关的内容,并有个人公众号:bigdata_ny分享相关技术文章。

若发现以上文章有任何不妥,请联系我。

image

Hello 小小妮

发表于 2016-07-23

主题

you’re my world!

1…34
侠天

侠天

侠天,专注于大数据、机器学习和数学相关的内容,并有个人公众号:bigdata_ny分享相关技术文章。

37 日志
微博 InfoQ
© 2018 侠天
由 Hexo 强力驱动
主题 - NexT.Mist