Flink CEP - Flink的复杂事件处理

Flink——复杂事件(CEP) 1、概念 Flink CEP(Complex Event Processing)是在Flink上层实现的复杂事件处理库 将数据流通过一定的规则匹配,然后输出用户想得到的数据, -底层通过equals()和hashCode()方法来比较和匹配事件 2、使用场景 风控检测 对用户异常行为模式、数据异常流向实时检测 策略营销 向特定行为的用户进行实时的精准营销 运维监控 监控设备运行参数,灵活配置多指标的发生规则 2、模式(Pattern) 模式的概念 处理事件的规则,被叫做“模式”(Pattern) 模式的 阅读详情

​1 Flink CEP 是什么

FlinkCEP - Flink的复杂事件处理。它可以让你在无限事件流中检测出特定的事件模型,有机会掌握数据中重要的那部分

2 Flink CEP 特点

  • 目标:从有序的简单事件流中发现一些高阶特征

  • 输入:一个或多个由简单事件构成的事件流

  • 处理:识别简单事件之间的内在联系,多个符合一定规则的简单事件构成复杂事件

  • 输出:满足规则的复杂事件

3 Flink CEP 应用场景

  • 风险控制:对用户异常行为模式进行实时检测,当一个用户发生了不该发生的行为,判定这个用户是不是有违规操作的嫌疑。

  • 策略营销:用预先定义好的规则对用户的行为轨迹进行实时跟踪,对行为轨迹匹配预定义规则的用户实时发送相应策略的推广。

  • 运维监控:灵活配置多指标、多依赖来实现更复杂的监控模式。

4 Flink CEP原理

Flink CEP内部是用NFA(非确定有限自动机)来实现的,由点和边组成的一个状态图,以一个初始状态作为起点,经过一系列的中间状态,达到终态。点分为起始状态、中间状态、最终状态三种,边分为take、ignore、proceed三种。

  • take:必须存在一个条件判断,当到来的消息满足take边条件判断时,把这个消息放入结果集,将状态转移到下一状态。

  • ignore:当消息到来时,可以忽略这个消息,将状态自旋在当前不变,是一个自己到自己的状态转移。

  • proceed:又叫做状态的空转移,当前状态可以不依赖于消息到来而直接转移到下一状态。

模式API (Pattern API)

模式API可以让你定义想从输入流中抽取的复杂模式序列

个体模式:组成复杂规则的每一个单独的模式定义,就是“个体模式”

A 量词

在FlinkCEP中,你可以通过这些方法指定循环模式:

  • pattern.oneOrMore() 指定期望一个给定事件出现一次或者多次的模式

  • pattern.times(#fTimes) 指定期望一个给定事件出现特定次数的模式,例如出现4次A

  • pattern.times(#fromTimes, #toTimes) 指定期望一个给定事件出现次数在一个最小值和最大值中间的模式,比如出现2-4次A

  • pattern.greedy() 方法让循环模式变成贪心的

  • pattern.optional() 方法让所有的模式变成可选的,不管是否是循环模式

// 期望出现4次
start.times(4)

// 期望出现0或者4次
start.times(4).optional()

// 期望出现2、3或者4次
start.times(2, 4)

// 期望出现2、3或者4次,并且尽可能的重复次数多
start.times(2, 4).greedy()

// 期望出现0、2、3或者4次
start.times(2, 4).optional()

// 期望出现0、2、3或者4次,并且尽可能的重复次数多
start.times(2, 4).optional().greedy()

// 期望出现1到多次
start.oneOrMore()

// 期望出现1到多次,并且尽可能的重复次数多
start.oneOrMore().greedy()

// 期望出现0到多次
start.oneOrMore().optional()

// 期望出现0到多次,并且尽可能的重复次数多
start.oneOrMore().optional().greedy()

// 期望出现2到多次
start.timesOrMore(2)

// 期望出现2到多次,并且尽可能的重复次数多
start.timesOrMore(2).greedy()

// 期望出现0、2或多次
start.timesOrMore(2).optional()

// 期望出现0、2或多次,并且尽可能的重复次数多
start.timesOrMore(2).optional().greedy()

B 条件

对每个模式你可以指定一个条件来决定一个进来的事件是否被接受进入这个模式,指定判断事件属性的条件可以通过

  • pattern.where() 增加新的条件,多个条件应该同时满足

pattern.where(event => ... /* 一些判断条件 */)
  • pattern.or() 增加新的条件,多个条件满足任意一个都可以

pattern.where(event => ... /* 一些判断条件 */)
    .or(event => ... /* 替代条件 */)
  • pattern.until() 为循环模式指定一个停止条件。意思是满足了给定的条件的事件出现后,就不会再有事件被接受进入模式了。如"(a+ until b)" (一个或者更多的"a"直到"b")

pattern.oneOrMore().until(event => ... /* 替代条件 */)

以上这些可以是可迭代的

  • subtype(subClass) 为当前模式定义一个子类型条件。一个事件只有是这个子类型的时候才能匹配到模式

pattern.subtype(classOf[SubEvent])
  • oneOrMore() 指定模式期望匹配到的事件至少出现一次。默认(在子事件间)使用松散的内部连续性。关于内部连续性的更多信息可以参考连续性。提示:推荐使用until()或者within()来清理状态。

pattern.oneOrMore()
  • timesOrMore(#times) 指定模式期望匹配到的事件正好出现的次数。默认(在子事件间)使用松散的内部连续性。关于内部连续性的更多信息可以参考连续性。

pattern.timesOrMore(2)
  • optional() 指定这个模式是可选的,也就是说,它可能根本不出现。这对所有之前提到的量词都适用。

pattern.oneOrMore().optional()
  • greedy() 指定这个模式是贪心的,也就是说,它会重复尽可能多的次数。这只对量词适用,现在还不支持模式组。

pattern.oneOrMore().greedy()

迭代条件 : 这是最普遍的条件类型。使用它可以指定一个基于前面已经被接受的事件的属性或者它们的一个子集的统计数据来决定是否接受时间序列的条件。

pattern.oneOrMore()
    .subtype(classOf[SubEvent])
    .where(
        (value, ctx) => {
            lazy val sum = ctx.getEventsForPattern("middle").map(_.getPrice).sum
            value.getName.startsWith("foo") && sum + value.getPrice < 5.0
        }
    )

组合模式:很多个体模式组合起来,就形成了整个的模式序列

FlinkCEP支持事件之间如下形式的连续策略

策略说明方法
严格连续期望所有匹配的事件严格的一个接一个出现,中间没有任何不匹配的事件next notNext
严松散连续忽略匹配的事件之间的不匹配的事件followedBy notFollowedBy
不确定的松散连续更进一步的松散连续,允许忽略掉一些匹配事件的附加匹配。可以使用下面的方法来指定模式之间的连续策略followedByAny
// 严格连续
val strict: Pattern[Event, _] = start.next("event").where(...)

// 松散连续
val relaxed: Pattern[Event, _] = start.followedBy("event").where(...)

// 不确定的松散连续
val nonDetermin: Pattern[Event, _] = start.followedByAny("event").where(...)

// 严格连续的NOT模式
val strictNot: Pattern[Event, _] = start.notNext("not").where(...)

// 松散连续的NOT模式
val relaxedNot: Pattern[Event, _] = start.notFollowedBy("not").where(...)

松散连续意味着跟着的事件中,只有第一个可匹配的事件会被匹配上,而不确定的松散连接情况下,有着同样起始的多个匹配会被输出。举例来说,模式"a b",给定事件序列"a","c","b1","b2",会产生如下的结果:

"a"和"b"之间严格连续:{} (没有匹配),"a"之后的"c"导致"a"被丢弃。

"a"和"b"之间松散连续:{a b1},松散连续会”跳过不匹配的事件直到匹配上的事件”。

"a"和"b"之间不确定的松散连续:{a b1}, {a b2},这是最常见的情况。

也可以为模式定义一个有效时间约束。例如,你可以通过pattern.within()方法指定一个模式应该在10秒内发生。这种时间模式支持处理时间和事件时间.

next.within(Time.seconds(10))

循环模式中的连续性

对于循环模式(例如oneOrMore()和times())),默认是松散连续。如果想使用严格连续,你需要使用consecutive()方法明确指定, 如果想使用不确定松散连续,你可以使用allowCombinations()方法。

consecutive

与oneOrMore()和times()一起使用, 在匹配的事件之间施加严格的连续性, 也就是说,任何不匹配的事件都会终止匹配(和next()一样)。如果不使用它,那么就是松散连续(和followedBy()一样)

Pattern.begin("start").where(_.getName().equals("c"))
  .followedBy("middle").where(_.getName().equals("a"))
                       .oneOrMore().consecutive()
  .followedBy("end1").where(_.getName().equals("b"))
  
输入:C D A1 A2 A3 D A4 B,会产生下面的输出:
如果施加严格连续性: {C A1 B},{C A1 A2 B},{C A1 A2 A3 B}
不施加严格连续性: {C A1 B},{C A1 A2 B},{C A1 A2 A3 B},{C A1 A2 A3 A4 B}

allowCombinations

与oneOrMore()和times()一起使用, 在匹配的事件中间施加不确定松散连续性(和followedByAny()一样)。如果不使用,就是松散连续(和followedBy()一样)

Pattern.begin("start").where(_.getName().equals("c"))
  .followedBy("middle").where(_.getName().equals("a"))
                       .oneOrMore().allowCombinations()
  .followedBy("end1").where(_.getName().equals("b"))

输入:C D A1 A2 A3 D A4 B,会产生如下的输出:

如果使用不确定松散连续: 
{C A1 B},{C A1 A2 B},{C A1 A3 B},{C A1 A4 B},{C A1 A2 A3 B},{C A1 A2 A4 B},{C A1 A3 A4 B},{C A1 A2 A3 A4 B}

如果不使用:
{C A1 B},{C A1 A2 B},{C A1 A2 A3 B},{C A1 A2 A3 A4 B}
  

5 匹配后跳过策略

对于一个给定的模式,同一个事件可能会分配到多个成功的匹配上。为了控制一个事件会分配到多少个匹配上,你需要指定跳过策略AfterMatchSkipStrategy。有五种跳过策略,如下:

  • NO_SKIP: 每个成功的匹配都会被输出。

  • SKIP_TO_NEXT: 丢弃以相同事件开始的所有部分匹配。

  • SKIP_PAST_LAST_EVENT: 丢弃起始在这个匹配的开始和结束之间的所有部分匹配。

  • SKIP_TO_FIRST: 丢弃起始在这个匹配的开始和第一个出现的名称为PatternName事件之间的所有部分匹配。

  • SKIP_TO_LAST: 丢弃起始在这个匹配的开始和最后一个出现的名称为PatternName事件之间的所有部分匹配。

val skipStrategy = 
      AfterMatchSkipStrategy.skipToFirst("patternName").throwExceptionOnMiss()
Pattern.begin("patternName", skipStrategy)

例如,给定一个模式b+ c和一个数据流b1 b2 b3 c,不同跳过策略之间的不同如下:

跳过策略结果描述
NO_SKIPb1 b2 b3 c
b2 b3 c
b3 c
找到匹配b1 b2 b3 c之后,
不会丢弃任何结果
SKIP_TO_NEXTb1 b2 b3 c
b2 b3 c
b3 c
找到匹配b1 b2 b3 c之后,
不会丢弃任何结果,
因为没有以b1开始的其他匹配
SKIP_PAST_LAST_EVENTb1 b2 b3 c找到匹配b1 b2 b3 c之后,
会丢弃其他所有的部分匹配。
SKIP_TO_FIRSTb1 b2 b3 c
b2 b3 c
b3 c
找到匹配b1 b2 b3 c之后,
会尝试丢弃所有在b1之前开始的部分匹配,
但没有这样的匹配,
所以没有任何匹配被丢弃。
SKIP_TO_LASTb1 b2 b3 c
b3 c
找到匹配b1 b2 b3 c之后
,会尝试丢弃所有在b3之前开始的部分匹配,
有一个这样的b2 b3 c被丢弃。

6 模式的检测

在指定了要寻找的模式后,该把它们应用到输入流上来发现可能的匹配了。为了在事件流上运行你的模式,需要创建一个PatternStream。给定一个输入流input,一个模式pattern和一个可选的用来对使用事件时间时有同样时间戳或者同时到达的事件进行排序的比较器comparator

object Cep {
  def main(args: Array[String]): Unit = {
    val env: StreamExecutionEnvironment =
      StreamExecutionEnvironment.getExecutionEnvironment
    env.setParallelism(1)

    val loginDS: DataStream[LoginInfo] = env.fromElements("")
      .map(data => {
        val datas: Array[String] = data.split(",")
        LoginInfo(datas(0), datas(1), datas(2).toInt,datas(3).toLong)
      }
      )
    // 创建规则

    val pattern: Pattern[LoginInfo, LoginInfo] = Pattern.begin[LoginInfo]("start")
    // 增加新的条件,多个条件应该同时满足
      .where(_.age > 18)
      .where(_.age < 12)
    // 应用规则:将规则应用到数据流中
    val loginPS: PatternStream[LoginInfo] = CEP.pattern(loginDS,pattern)

    // 获取规则的结果
    val ds: DataStream[String] = loginPS.select(
      map => {
        map.toString
      })
    ds.print()
    env.execute()
  }
}

case class LoginInfo(
                    id:String,
                    name:String,
                    age:Int,
                    loginTime:Long
                    )

7 从模式中选取

创建 PatternStream 之后,就可以应用 select 或者 flatselect 方法,从检测到的事件序列中提取事件了

select() 方法需要输入一个 select function 作为参数,每个成功匹配的事件序列都会调用它

select() 以一个 Map[String,Iterable [IN]] 来接收匹配到的事件序列,其中 key 就是每个模式的名称,而 value 就是所有接收到的事件的 Iterable 类型

    val loginPS: PatternStream[LoginInfo] = CEP.pattern(loginDS,pattern)
    val outputTag: OutputTag[String] = OutputTag[String]("side-output")
    val result: SingleOutputStreamOperator[CompleLogin] =loginPS.select(outputTag){
      (pattern: Map[String, Iterable[LoginInfo]], timestamp: Long, out: Collector[TimeoutLogin]) =>
        out.collect(TimeoutLogin())
    } {
      (pattern: mutable.Map[String, Iterable[LoginInfo]], out: Collector[CompleLogin]) =>
        out.collect(CompleLogin())
    }
    val timeoutResult: DataStream[TimeoutLogin] =result.getSideOutput(outputTag)

微信公众号:大数据左右手

人要去的地方,除了远方,还有未来
欢迎关注我,一起学习,一起进步!

CEP-Flink的复杂事件处理(一) Flink CEP 背景介绍 随着无处不在的传感器网络和智能设备不断收集越来越多的数据,我们面临着以近实时的方式分析不断增长的数据流的挑战。 能够快速响应不断变化的趋势或提供最新的商业智能可能是公司成功或失败的决定性因素。 实时处理中的关键问题是检测数据流中的事件模式。 复杂事件处理(CEP)恰好解决了对连续传入事件进行模式匹配的问题。 匹配的结果通常是从输入事件派生的复杂事件。 与对存储数据执行... 阅读详情

相关推荐

Flink之CEP(复杂事件处理)

CEP概述 复杂事件处理(Complex Event Processing,CEP) FLink CEP是在Flink中实现的复杂事件处理(CEP)库 CEP允许在无休止的事件流中检测事件模式,让我们有机会掌握数据中重要的部分 一个或多个由简单事件构成的事件流通过一定的规则匹配,然后输出用户想要得到的数据-=-满足规则的复杂事件 ...

qq_37135484的博客 2870

Flink实战-恶意登录行为检测-CEP

FlinkCEP是在Flink上层实现的复杂事件处理库。 它可以让你在无限事件流中检测出特定的事件模型,有机会掌握数据中重要的那部分。 官网文档: https://ci.apache.org/projects/flink/flink-docs-stable/zh/dev/libs/cep.html 这里给个demo,对比下不用cep和用cep的区别, 实现目标: 从目标csv中读取...

MaFei的博客 1187

最新 Flink 1.13 的 Flink CEP 复杂事件处理快速入手、详细教程

CEP,其实就是“复杂事件处理(Complex Event Processing)”的缩写;而 Flink CEP,就是 Flink 实现的一个用于复杂事件处理的库(library)。 把事件流中的一个个简单事件,通过一定的规则匹配组合起来,这就是“复杂事件”;然后基于这些满足规则的一组组复杂事件进行转换处理,得到想要的结果进行输出。 CEP 做的事其实就是在流上进行模式匹配。主要用在风控管理【人工进一步判定用户是否有违规操作】、用户画像【行为轨迹画像特定行为习惯】和运维监控【灵活配置多指标、多依赖】

博文约礼 2423

Flink-电商用户行为分析(恶意登录监控-CEP实现)

数据 链接:https://pan.baidu.com/s/1x1lJ1iuuefTn-tTGC6C3UQ 提取码:iz9n 需求 在 2 秒之内连续两次登录失败 import java.util import org.apache.flink.cep.PatternSelectFunction import org.apache.flink.cep.scala.CEP import org.apache.flink.cep.scala.pattern.Pattern import org.apache.

Knight 1310

大数据学习之Flink——16Flink 的复杂事件处理 CEP

本文参考尚学堂flink课件, 侵权删 复杂事件处理(CEP)是一种基于流处理的技术,将系统数据看作不同类型的事件,通 过分析事件之间的关系,建立不同的事件关系序列库,并利用过滤、关联、聚合等技术,最 终由简单事件产生高级事件,并通过模式规则的方式对重要信息进行跟踪和分析,从实时数据中发掘有价值的信息 一. CEP相关概念 1. 配置依赖 在使用 FlinkCEP 组件之前,需要将 FlinkCEP 的依赖库引入项目工程中。 <dependency> <groupId>org.

bingque6535的博客 772

Flink 实现恶意登录检测

Flink 实现恶意登录检测

congge_study的博客 6792

Flink之Flink CEP 复杂事件处理简介

Flink CEP 复杂事件处理简介一、什么是复杂事件处理 CEP二、Flink CEP2.1 Event Streams2.2 Pattern API2.3 Pattern 检测2.4 select2.5 flatSelect2.6 超时事件的处理 一、什么是复杂事件处理 CEP 一个或多个由简单事件构成的事件流通过一定的规则匹配,然后输出用户想得到的数据,满足规则的复杂事件。 特征: 目标:从有序的简单事件流中发现一些高阶特征 输入:一个或多个由简单事件构成的事件流 处理:识别简单事件之间的内在联系,

weixin_43520450的博客 1740

【flink】flink 复杂事件处理 CEP

1.概述 转载:Flink系列 13. 复杂事件处理 CEP 请到原文查看。。。 1. 什么是 CEP? CEP 是 Flink 中实现的复杂事件处理库,(Complex Event Processing,CEP)是一种基于流处理的技术,CEP是Flink一个基于复杂事件监测处理的库 CEP通过一个或多个由简单事件构成的事件流通过一定的规则匹配,然后输出用户想得到的数据,满足规则的复杂事件。 CEP复杂事件处理DataStrem API 提供了 FlinkCEP 组件栈,专门用于对复杂事件的处理,帮助用户

九师兄 718

深入探索Flink的复杂事件处理CEP

CEP是一种基于流处理的技术,它将系统产生的数据看作是不同类型的事件。通过深入分析这些事件之间的内在关系,构建起多样化的事件关系序列库。在此基础上,运用过滤、关联、聚合等先进技术手段,能够从简单的基础事件中衍生出高级事件。并且,借助模式规则,我们可以精准地对重要信息进行跟踪和深度分析,从而在实时数据的海洋中发掘出隐藏的、具有高价值的信息宝藏。CEP在多个领域展现出了强大的应用潜力,例如在防范网络欺诈方面,能够实时监测异常的交易行为模式;

qq_68076599的博客 1641

如何基于Flink+TensorFlow打造实时智能异常检测平台

AI前线导读:Flink已经渐渐成为实时计算引擎的首选之一,从简单的实时ETL到复杂的CEP场景,Flink都能够很好地驾驭。本文整理自携程实时计算负责人潘国庆在QCon全球软件开发大会(北京站)2019的演讲,他介绍了携程如何基于Flink与TensorFlow构建实时智能异常检测平台,以解决规则告警系统准确率低、时效性低、规则配置复杂与耗费人力等诸多问题,实现了业务指标毫秒级延迟与智能化检测,同时依托Flink实现了强大的容错机制。随着互联网的迅速发展,各个公司都建立了自己的监控体系,用于提前发现问题降低损失,携程亦是如此。然而携程的监控体系存在以下三个问题:监控系统繁多监控告警配置复杂没

SAP入门技术分享四:模块化程序

SAP入门技术分享三:模块化程序

ITxiaoangzai的博客 1153

Flink之复杂事件处理CEP

FlinkCEP是在Flink之上实现的复杂事件处理(CEP)库。它允许我们检测无穷无尽的事件流中的事件模式,让我们有机会掌握数据中的重要内容。

积跬步,至千里。 1598

STM32H723串口接收全为0 & CAN错误中断问题

STM32H723串口接收全为0 和 叠加的导致CAN错误问题

weixin_38743772的博客 3917

Flink CEP 复杂事件处理

1 复杂事件 1.1 引入 在Flink RichFunction&state这篇博文中我们一起学习了下如何结合使用keyBy state和TreeSet在一条无界流中进行全局的分组求top n操作,可以解决一些实时看板相关的业务问题。在Flink BroadcastStream这篇博文中我们也学习到了如何使用广播流来处理监控规则经常变更的程序日志监控业务。 那么现在我们又遇到了一个新的业务需求:判断一个用户在点击了商品之后是否立即进行了下单付款操作,如果是的话将用户名和点击时间以及下单付款时

yang灬仔 984

太速科技-基于DSP TMS320C6678+FPGA XC7V690T的6U VPX信号处理卡

当多块盘并行工作时,存储阵列读写带宽成指数增长,2块盘则≥4GB/s,4块盘则≥8GB/s,以此类推。存储阵列的存储容量由单盘配置决定,目前单块NVME存储盘存储容量可选择512GB、1TB、2TB、4TB、8TB、16TB。硬盘管理通过文件系统,FPGA的PCIeX4与 6U VPX主板互联,操作系统直接映射管理硬盘,也可以通过前面板QSFP+ 光纤导出给其他服务器设备。本方案优势就是集中的进行采集,存储,计算一体化,降低硬件成本、功耗,减小设备体积、重量。信号处理,无线电通信领域。

Orihard_的博客 678

六维力传感器选型指南:电阻式vs电容式,哪个更适合你的工业场景?

本文深入解析六维力传感器在工业自动化中的选型要点,重点对比电阻式与电容式传感器的核心原理、环境适应性及成本结构。针对不同工业场景(如高精度装配、重载机器人等),提供专业选型建议,帮助工程师优化系统性能与经济效益。

weixin_42525005的博客 397

flink 复杂事件处理 flink cep

1.获取基础配置变量(类似spark的spark conf) 离线处理使用ExecutionEnvironment。实时处理使用StreamExecutionEnvironment 注意 导包的时候 有java的也有scala的 不要导错 import org.apache.flink.api.java.ExecutionEnvironment import org.apache.flink.a...

a724952091的博客 460

N5105核显直通PVE:从黑屏到HDMI输出的完整指南

PCI直通能让虚拟机独占物理设备,但核显直通远没有独显那么轻松。Intel核显与CPU、显示输出链路的强耦合使UEFI引导、GOP驱动、驱动签名等环节都成了黑屏陷阱。在PVE虚拟化环境中,通过IOMMU开启、vfio-pci绑定、OVMF固件和Q35机型配合,可以绕过KVM检测,让Windows虚拟机正确驱动核显,从HDMI口输出画面,并解锁Intel Quick Sync硬解能力。这种方案尤其适合N5105等低功耗迷你主机,可作为客厅HTPC、本地视频硬解或依赖硬件加速的轻量工作台。本文基于N5105平台

weixin_31082403的博客 378

Flink 的复杂事件处理 CEP

一、什么是CEP? 复杂事件处理(CEP)是一种基于流处理的技术,将系统数据看作不同类型的事件,通 过分析事件之间的关系,建立不同的事件关系序列库,并利用过滤、关联、聚合等技术,最 终由简单事件产生高级事件,并通过模式规则的方式对重要信息进行跟踪和分析,从实时数 据中发掘有价值的信息。复杂事件处理主要应用于防范网络欺诈、设备故障检测、风险规避 和智能营销等领域。Flink 基于 DataStrem API 提供了 FlinkCEP 组件栈,专门用于对复杂 事件的处理,帮助用户从流式数据中发掘有价值的信息。

weixin_38255219的博客 784

【深度强化学习】(2) Double DQN 模型解析,附Pytorch完整代码

Double DQN 算法是 DQN 算法的改进版本,解决了 DQN 算法过估计行为价值的问题。Double DQN 算法不直接通过最大化的方式选取目标网络计算的所有可能 Q 值,而是首先通过估计网络选取最大 Q 值对应的动作。在 Double DQN 框架中存在两个神经网络模型,分别是训练网络与目标网络。这两个神经网络模型的结构完全相同,但是权重参数不同;每训练一段之间后,训练网络的权重参数才会复制给目标网络。

博观而约取,厚积而薄发 1万+

ubuntu20.04升级OpenSSH

业务需求,需要将服务器的OpenSSH版本从8.2升级到最新版本(9.9),由于apt能提供的最新版本就是8.2,所以需要采用源码安装的方式。

xiamu66的博客 1527

Flink CEP复杂事件处理

Flink CEP能够从流中特定的(事件中定义的一组条件和规则), 并对其进行相应的操作和处理。例如:在金融领域中检测欺诈交易行为时,需要考虑多笔交易之间的时序和金额关系。在物联网领域中需要在设备运行状态事件流中实时监测设备状态变化及设备之间协作。

weixin_37536020的博客 1369

5.7 BGP属-ORIGIN

注意:当去往同一个目的地存在多条不同Origin属性的路由时,在其他条件都相同的情况下,BGP将按如Origin的下顺序优选路由:IGP > EGP > Incomplete。通过以上输出可以看到路由表选择了R3发过来的路由,因为R1的路由的起源为?通过以上输出我们可以看到针对于1.1.1.1这条路由有两条,从R1和R3传过来的起源都属于IGP。(4)把从R1传过来的路由的起源改为incomplete。通过以上输出可以看到,从R1传过来的路由是最优的。(2)在R2上查看1.1.1.1的路由详细信息。

lwljh134的博客 308

59、Flink CEP - Flink的复杂事件处理介绍及示例(完整版)

一、Flink 专栏Flink 专栏系统介绍某一知识点,并辅以具体的示例进行说明。1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。2、Flink基础系列 本部分介绍Flink 的基础部分,比如术语、架构、编程模型、编程指南、基本的datastream api用法、四大基石等内容。3、Flik Table API和SQL基础系列 本部分介绍Flink Table Api和SQL的基本用法,比如Table API和SQL创建库、表用法、查询、窗口函数、catalog等等内容。4、Flik

alanchanchn的专栏 7万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

关于flink复杂事件处理Flink-CEP

它们构成了一个新的“复杂事件流”,流中的数据就变成了一组一组的复杂事件,每个数据都包含了一个圆形和一个三角形。设定一些行为模式,可以对用户的异常行为进行实时检测。利用 CEP 可以用预先定义好的规则,对用户的行为轨迹进行实时跟踪,从而检测出具有特定行为习惯的一些用户,做出相应的用户画像。CEP 可以帮助在复杂的、看似不相关的事件流中找出那些有意义的事件组合,进而可以接近实时地进行分析判断、输出通知信息或报警。具体的处理过程是,把事件流中的一个个简单事件,通过一定的规则匹配组合起来,这就是“复杂事件”;

友莘居士的博客 356

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Flink的复杂事件处理与CEP

1.背景介绍 1. 背景介绍 复杂事件处理(Complex Event Processing,CEP)是一种处理和分析实时数据流的技术,用于识别和响应复杂事件。Flink是一个流处理框架,可以用于实现CEP。在本文中,我们将深入探讨Flink的复杂事件处理与CEP,涵盖其核心概念、算法原理、最佳实践、应用场景和工具推荐。 2. 核心概念与联系 2.1 复杂事件处理(CEP) 复杂事件处理...

AI天才研究院 1338

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

上一篇: Flink的一致性保证
下一篇: ​ Flink的状态与容错
大数据左右手
博客等级 码龄9年 475粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值