在之前的学习中我们知道,如果在算法的训练样本量m不足的时候得到的模型具有高方差(High Variance),那么此时我们需要更多的训练样本。但是如果算法具有高偏差,提高样本数量并不会显著改善模型的性能。

在今天,数据集很容易就可以达到m=100,000,000这样的数量级(比如人口调查、通讯消息等)。在这样的背景下,梯度下降算法每一步都需要汇总上亿个训练样本来完成一次迭代。那么我们能不能通过一些方法来分流如此大量的计算呢?

一、异常检测(Anomaly Detection)
1.导论(Problem Motivation)
和其他学习问题一样,已知一个数据集​​\( x^{(1)}, x^{(2)},\dots,x^{(m)} \)。

接下来我们又得到一个新的样本​\( x_{test} \)​,现在,我们想要知道这个样本是不是异常/坏点。

我们定义了一个“模型”(“model”) p(x)来告诉我们该样本是否异常。我们也使用了一个阈值ϵ作为评判样本是否异常的分界线。

一个常见的异常检测使用案例是诈骗检测:

​\( x^{(i)}= \)​用户活动的特征量
从数据而得的模型p(x)
通过p(x)<ϵ这一条件找出异常的用户 如果最后我们的异常检测算法标记出的异常样本太多了,那我们需要减小阈值ϵ,以此降低被划为异常样本的样本数。

Kafka是什么
在流式计算中,Kafka一般用来缓存数据,Storm通过消费Kafka的数据进行计算。

Apache Kafka是一个开源消息队列,由Scala写成。是由Apache软件基金会开发的一个开源消息系统项目。
Kafka最初是由LinkedIn开发,并于2011年初开源。2012年10月从Apache Incubator毕业。该项目的目标是为处理实时数据提供一个统一、高通量、低等待的平台。
Kafka是一个分布式消息队列:生产者、消费者的功能。它提供了类似于JMS的特性,但是在设计实现上完全不同,此外它并不是JMS规范的实现。
Kafka对消息保存时根据Topic进行归类,发送消息者被称为Producer,消息接收者被称为Consumer,此外Kafka集群由多个Kafka实例构成,每一个实例(server)称为broker。
无论是Kafka集群,还是producer和consumer,都依赖于Zookeeper集群保存一些meta信息,来保证系统的可用性。

算法概述
K-Means算法是时下最流行且应用广泛的自动聚类算法。它的实现流程基本如下:

随机设置两个初始点,称作聚类中心(cluster centroids)。
聚类分配:将每一个样本归入到离它最近的聚类中心所属的分类中。
移动中心:对于每一个聚类中心,计算它集合中所有的样本点的平均值,然后将该聚类中心移动到平均值的位置。
重复(2)和(3)直到实现聚类。

在这篇文章中,我想要更进一步地探讨数据处理模式,抓住更多的细节,并且结合它们的实际使用案例进行分析。这篇文章的脉络主要依照如下两个部分展开:
 流处理 101 终极版:简要地回顾一下Streaming 101中所介绍的概念,然后补充一些使用案例来突出重点。
 流处理 102:Streaming 101的配套内容,引入了处理无界数据时,在一些细节上的重要概念,并且使用一些使用案例来帮助理解。

我们来回顾一下逻辑回归的代价函数:

\[ \begin{align*}J(\theta) & = \frac{1}{m}\sum_{i=1}^m -y^{(i)} \log(h_\theta(x^{(i)})) – (1 – y^{(i)})\log(1 – h_\theta(x^{(i)}))\\ & = \frac{1}{m}\sum_{i=1}^m -y^{(i)} \log\Big(\dfrac{1}{1 + e^{-\theta^Tx^{(i)}}}\Big) – (1 – y^{(i)})\log\Big(1 – \dfrac{1}{1 + e^{-\theta^Tx^{(i)}}}\Big)\end{align*} \]

​为了引入向量支持机,首先,我们将代价函数的第一项转化为​\( -\log(h_{\theta}(x)) = -\log\Big(\dfrac{1}{1 + e^{-\theta^Tx}}\Big) \)​,第二项转化为​\( -\log(1 – h_{\theta(x)}) = -\log\Big(1 – \dfrac{1}{1 + e^{-\theta^Tx}}\Big) \)​。这样,我们就得到了SVM的代价函数。

为了分析代价函数的趋势,得出其优化解,我们把这两项关于z即\( θ^Tx \)​的函数图像画出来,得到两条光滑的sigmoid函数曲线。进一步地,使用两段直线来尝试替代曲线,这被称作hinge loss 函数

原文:The world beyond batch: Streaming 101

参看“流处理系统与实时程序会话”,the Strata Data Conference in London。

编辑批注:这是关于数据处理演变的两部曲文章中的第一篇,聚焦于流式系统,无穷数据集,以及大数据的未来。

我们有足够的理由可以说,流数据处理对于现今的大数据来说,是一个不容小觑的内容。这些理由包括但不限于:

商业活动愈发渴望实时性更强的数据,而把数据转化为流数据进行处理,正好是一个实现更低延迟的好方法。
在海量、无穷的数据集越来越常见的今天,使用这种专门用来处理无穷无尽的数据的系统,能够使我们处理数据更加得心应手。
因为流处理在数据到达时就开始处理,所以,随着时间推移,它能够使得后续任务负载的传播更加平稳,进而使得资源的消耗更具有一致性和可预测性。

目前为止,我们已经掌握了很多用于预测的算法,并且我们可以通过如下几种方式改善误差度:

使用更多的训练集
减少设置的特征量
增加特征量
增加高次项
增加或减少λ
Andrew Ng建议,不要随机的选取上面的解决方案,而是通过接下来要说的方式来评估当前模型,选择合适的方法。

离线计算的特点
离线计算:批量获取数据、批量传输数据、周期性批量计算数据、数据展示

代表技术:Sqoop批量导入数据、HDFS批量存储数据、MapReduce批量计算数据、Hive批量计算数据、Kettle任务调度

3.流式计算的特点
流式计算:数据实时产生、数据实时传输、数据实时计算、实时展示

代表技术:Flume实时获取数据、Kafka实时数据存储、Storm/JStorm实时数据计算、Redis实时结果缓存

一句话总结:将源源不断产生的数据实时收集并实时计算,尽可能快的得到计算结果

4.流式计算与实时计算的区别
最大区别:实时收集、实时计算、实时展示

1、控制台:
进行Hadoop集群任务管理的时候,我们可以通过访问任意一台机器的8088端口

hadoop01:8088/cluster
进入图形界面。

2、驱动分析
我们以WordCount这个jar为例,进行分析,其中的main方法称为驱动:

public class WordCount
{
public static void main(String[] args) throws Exception // 整个main方法是驱动
{
Job job = new Job(conf,”word count”); // 提交job
job.setJarByClass(WordCount.class); // 定义要运行的jar地址
job.setMapperClass(TokenizerMapper.class); // 定义Mapper
job.setCombinerClass(IntSumReducer.class); // 定义Combiner
job.setReducerClass(IntSumReducer.class); // 定义Reducer
job.setOutputKeyClass(Text.class); // 定义输出的key的类,这里是Text
job.setOutputValueClass(IntWritable.class); // 定义输出的Value的类,这里是可序列化的

Insert math as
Block
Inline
Additional settings
Formula color
Text color
#333333
Type math using LaTeX
Preview
\({}\)
Nothing to preview
Insert