【转载】理工渣眼中的HMM及安全应用

2024-01-26 09:32

本文主要是介绍【转载】理工渣眼中的HMM及安全应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        话说,又到了盼星星盼月亮才等来的周末,结果由于强网杯又给糟蹋了。

        比赛实在是被虐的受不了了,于是“点子扎手,风紧扯呼”了~

        去91RI逛了一圈,发现了一篇讲HMM不错的文章,记录下来学习学习。

        原文地址:http://www.91ri.org/12659.html

----------------------------------------------------------------我是华丽丽的分割线---------------------------------------------------------------------

虽然是理工妹子,但仍是数学渣。症状之一就是每次学习算法都能把自己绕成鸡窝头。所以尝试写一篇数学渣眼中的HMM。
我们先看一个让人头疼的HMM定义式(喜欢从公式下手是我多年来应付考试养成的不良习性)
一、HMM五元素
HMM简介 - 碳基体 - 碳基体
N:隐藏状态数 hidden states
M:观测状态数 observed states
A: 状态转移矩阵 transition matrix
B:发射矩阵  emission matrix
pi:初始隐状态向量 initial state vector

好了,接下来我们用数学渣可以理解的语言来解释上面都是些什么鬼

女主:小红(用食物丈量心情喵)
心情状态有三种: 开心、正常、崩溃
吃的食物也有三种: 汉堡、 西瓜、啤酒
男主:小明(面部表情识别障碍汪)

因此对男主而言,
        隐藏状态:女主的心情状态
        观测状态:女主吃的食物
        隐藏状态数 :N=3
        观测状态数:    M=3
        初始隐状态向量pi:

对照下表看:女主处于各种心情状态的概率,例如女主51%的概率是正常的,36%的概率是开心的,13%的概率是崩溃的
 开心 正常 崩溃
 0.36 0.51 0.13

状态转移矩阵
A:
上一个隐状态到下一个隐状态的转化概率矩阵
对照下表看:在女主上一个状态是开心的条件下,则此刻状态是开心的概率为36.5%,正常的概率为50%,崩溃的概率为13.5%
   开心   正常 崩溃
  开心 0.365 0.500 0.135
  正常 0.250 0.125 0.625
 崩溃 0.365 0.265 0.370

  发射矩阵B:
隐状态对应的观测状态的概率
对照下表看:在女主是开心的状态下,她吃汉堡的概率是10%,西瓜的概率是20%,啤酒的概率是70%
  汉堡 西瓜 啤酒
 开心 0.1 0.2 0.7
 正常 0.5 0.25 0.25
 崩溃 0.8 0.1 0.1

 

一个HMM模型就由上面描述的隐藏状态数N,观测状态数M,初始隐状态向量pi,状态转移矩阵A,混淆矩阵B五个要素组成。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

现在男主小明开始做任务了,我们用现成的工具mahout来示例

                         

查了Mahout的中文意思——驭象的人,再看看Mahout的logo,好吧,想和小黄象happy地玩耍,得顺便陪陪这位驭象人耍耍了...

安装指南(仅介绍local版)

wget http://archive.apache.org/dist/mahout/0.9/mahout-distribution-0.9.tar.gzcd mahout-distribution-0.9/vim bin/mahout

修改

MAHOUT_JAVA_HOME=/usr/lib/jvm/java-6-openjdk-amd64 (修改为你自己的java所在地址)MAHOUT_LOCAL=true

任务一:学习(本例中根据女主吃的食物序列,推断一个合适的HMM模型)
输入:观测状态序列——女主吃的食物序列,我们用数字表示对应的食物与心情
0:汉堡
1:西瓜
2:啤酒
0 :崩溃
1:开心
2:   正常
输出:生成一个合适的HMM模型
算法:BaumWelch

1.输入观测序列
echo "0 1 2 2 2 1 1 0 0 2 1 2 1 1 1 1 2 2 2 0 0 0 0 0 0 2 2 2 0 0 0 0 0 0 1 1 1 1 2 2 2 2 2 0 2 1 2 0 2 1 2 1 1 0 0 0 1 0 1 0 2 1 2 1 2 1 2 1 1 0 0 2 2 0 2 1 1 0" 
>> hmm-input 
2.输入观测序列后,开始生成HMM模型
bin/mahout baumwelch -i hmm-input(观测序列文件) -o hmm-model(hmm模型文件) -nh 3(隐状态数) -no 3(观测状态数) -e .0001 -m 10
3.观察结果

Initial probabilities: 初始隐状态向量pi
0 1 2
0.062295949769082204  0.22250521455286396  0.7151988356780538
Transition matrix:状态转移矩阵A:
0 1 2
0 0.3765444789556002  0.5583673988903969  0.06508812215400292
1 0.3759312048603327  0.2560959620304218  0.36797283310924545
2 0.5383787685979908  0.24752553248847228  0.21409569891353694
Emission matrix: 发射矩阵
0 1 2
0 0.4419117509334424  0.3106990713267408  0.2473891777398168
1 0.20948851558479514  0.2830936761513362  0.5074178082638686
2 0.34341499252552676  0.40310175949497634  0.2534832479794969

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

任务二:预测(根据上一个任务生成的HMM模型来预测女主后续会吃的东西)
输入:HMM模型
输出:预测后续的观测状态,或者计算给定规则状态序列的概率(这个我们在下一个场景中描述)
算法:  ForwardBackward
bin/mahout hmmpredict -m hmm-model(hmm模型文件) -o hmm-predictions (预测结果文件)-l 10(预测多少个后续观测状态)
我们看结果
more hmm-predictions 
2 2 0 0 1 2 1 2 2 1
预测女主后续会吃的东西依次为 :啤酒,啤酒,汉堡,汉堡,西瓜,啤酒,西瓜,啤酒,啤酒、西瓜
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
任务三:编码(根据女主吃的东西,判断女主当前的心情,这个也是男主最关心的任务,女孩的心思你别猜。。。)
输入:HMM模型,观测状态序列
输出:观测状态序列对应的隐藏状态序列
算法viterbi
输入观测状态序列,本例中女主吃的食物
echo "2 2 0 0 1 2 1 2 2 1" >> hmm-viterbi-input









判断观测状态序列对应的隐状态序列

bin/mahout viterbi -i hmm-viterbi-input -o hmm-viterbi-output -m hmm-model -l
我们看结果

more hmm-viterbi-output 
2 1 2 0 0 1 2 0 1 2
可以看到女主

吃的东西  : 啤酒,啤酒,汉堡,汉堡,西瓜,啤酒,西瓜,啤酒,啤酒、西瓜
对应的心情: 正常,开心,正常,崩溃,崩溃,开心,正常,崩溃,开心,正常
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
三、安全上的应用—— jahmm示例
现在我们知道了什么是HMM以及HMM能做什么,最关键的时刻到了,现实场景的应用。我们先提出
需要解决的问题—HTTP异常请求的检测(弥补基于签名检测的不足)
解决方案猜想——HTTP请求内容实际是一系列字符串,而正常字符串出现的概率远大于异常字符串。我们可以靠概率来划分正常请求与异常请求。
有了这个前提,再结合HMM的学习功能与预测功能,学习功能能根据观测序列(HTTP请求内容)生成最适合的HMM模型,而预测功能能在HMM模型下能计算指定观测序列(HTTP请求内容)的概率 。我们得出下面这个
解决方案——两个阶段解决问题:
阶段一: 训练; 使用正常日志生成HMM模型,并设置正常请求的概率范围
阶段二: 检测; 使用待检测的请求来计算该请求在上一步所生成的HMM模型中的概率,不在正常请求概率范围内的则判定为异常请求。
原理:我们可以根据概率分布来区分正常与异常请求的原理是 正常请求远远多于异常请求;正常请求是相似的,异常请求各异













这篇关于【转载】理工渣眼中的HMM及安全应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/646370

相关文章

CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比

《CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比》CSS中的position属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布... css 中的 position 属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布局和层叠关

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

Java中常见队列举例详解(非线程安全)

《Java中常见队列举例详解(非线程安全)》队列用于模拟队列这种数据结构,队列通常是指先进先出的容器,:本文主要介绍Java中常见队列(非线程安全)的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一.队列定义 二.常见接口 三.常见实现类3.1 ArrayDeque3.1.1 实现原理3.1.2

Python使用Tkinter打造一个完整的桌面应用

《Python使用Tkinter打造一个完整的桌面应用》在Python生态中,Tkinter就像一把瑞士军刀,它没有花哨的特效,却能快速搭建出实用的图形界面,作为Python自带的标准库,无需安装即可... 目录一、界面搭建:像搭积木一样组合控件二、菜单系统:给应用装上“控制中枢”三、事件驱动:让界面“活”

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹

Python Flask 库及应用场景

《PythonFlask库及应用场景》Flask是Python生态中​轻量级且高度灵活的Web开发框架,基于WerkzeugWSGI工具库和Jinja2模板引擎构建,下面给大家介绍PythonFl... 目录一、Flask 库简介二、核心组件与架构三、常用函数与核心操作 ​1. 基础应用搭建​2. 路由与参

Spring Boot中的YML配置列表及应用小结

《SpringBoot中的YML配置列表及应用小结》在SpringBoot中使用YAML进行列表的配置不仅简洁明了,还能提高代码的可读性和可维护性,:本文主要介绍SpringBoot中的YML配... 目录YAML列表的基础语法在Spring Boot中的应用从YAML读取列表列表中的复杂对象其他注意事项总

电脑系统Hosts文件原理和应用分享

《电脑系统Hosts文件原理和应用分享》Hosts是一个没有扩展名的系统文件,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应... Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应

CSS 样式表的四种应用方式及css注释的应用小结

《CSS样式表的四种应用方式及css注释的应用小结》:本文主要介绍了CSS样式表的四种应用方式及css注释的应用小结,本文通过实例代码给大家介绍的非常详细,详细内容请阅读本文,希望能对你有所帮助... 一、外部 css(推荐方式)定义:将 CSS 代码保存为独立的 .css 文件,通过 <link> 标签

Python使用Reflex构建现代Web应用的完全指南

《Python使用Reflex构建现代Web应用的完全指南》这篇文章为大家深入介绍了Reflex框架的设计理念,技术特性,项目结构,核心API,实际开发流程以及与其他框架的对比和部署建议,感兴趣的小伙... 目录什么是 ReFlex?为什么选择 Reflex?安装与环境配置构建你的第一个应用核心概念解析组件