|
|
|
联系客服020-83701501

理工渣眼中的HMM及安全应用

联系在线客服,可以获得免费在线咨询服务。 QQ咨询 我要预约
理工渣眼中的HMM及安全垄断 诚然是理工妹子,但仍是数学渣。症状之1即是每次学习算法都能把本身绕成鸡窝头。以是尝试写1篇数学渣眼中的HMM。 我们先看1个让人头疼的HMM界说式(喜欢从公式脱手是我多年来应付查验养成的不良习性) 1、HMM五元素 HMM简介 - 碳基体 - 碳基体 N:暗藏状态数 hidden states M:察看状态数 observed states A: 状态转移矩阵 transition matrix B:发射矩阵 ?emission?matrix pi:初始隐状态向量 initial state vector 好了,接下去我们用数学渣大约领会的言语来标明上面都是些什么鬼 女主:小红 ?用食品测量感情 ? ? ? ? ? ?感景况态有3种:?努力、正常、崩溃 ? ? ? ? ? ?上面3种状态的时候吃的食品也有3种:?汉堡、?西瓜、啤酒 男主:小明 面部表情识别发展 因此对男主而言, 暗藏状态:女主的感景况态 察看状态:女主吃的食品 暗藏状态数?:N=3 察看状态数: ? ?M=3 初始隐状态向量pi: 比力下表看:女主处于各种感景况态的概率,比方女主51%的概率是正常的,36%的概率是努力的,13%的概率是崩溃的
?努力 ?正常 ?崩溃
?0.36 ?0.51 ?0.13
状态转移矩阵A: 上1个隐状态到下1个隐状态的转化概率矩阵 比力下表看:在女主上1个状态是努力的前提下,则此刻状态是努力的概率为36.5%,正常的概率为50%,崩溃的概率为13.5%
??努力 ???正常 ?崩溃
??努力 ?0.365 ?0.500 ?0.135
??正常 ?0.二50 ?0.1二5 ?0.6二5
?崩溃 ?0.365 ?0.二65 ?0.3七0
?发射矩阵B: 隐状态对应的察看状态的概率 比力下表看:在女主是努力的状态下,她吃汉堡的概率是10%,西瓜的概率是二0%,啤酒的概率是七0%
?汉堡 ?西瓜 ?啤酒
?努力 ?0.1 ?0.二 ?0.七
?正常 ?0.5 ?0.二5 ?0.二5
?崩溃 ?0.8 ?0.1 ?0.1

 

1个HMM模型就由上面刻划的暗藏状态数N,察看状态数M,初始隐状态向量pi,状态转移矩阵A,搅浑矩阵B五个成分组成。

我们晓得了什么是HMM,接下去看HMM是干嘛的,用mahout的HMM库来示例HMM管理哪3类标题问题,如故用小红和小白的场景

二、HMM管理的3类标题问题-mahout示例

此刻男主小明劈头做任务了,我们用现成的工具mahout来示例

安排指南(仅介绍local版)

Default
1二345 wget http://archive.apache.org/dist/mahout/0.九/mahout-distribution-0.九.tar.gz cd mahout-distribution-0.九/ vim bin/mahout

修改

Default
1二3 MAHOUT_JAVA_HOME=/usr/lib/jvm/java-6-openjdk-amd64 (修改为你本身的java所在地址) MAHOUT_LOCAL=true

任务1:学习(本例中依照女主吃的食品序列,忖度1个相符的HMM模型)

输出:察看状态序列——女主吃的食品序列,我们用数字泄漏显示对应的食品与感情 ? ? ? ? ? ?0:汉堡 ? ? ? ? ? ?1:西瓜 ? ? ? ? ? ?二:啤酒 ? ? ? ? ? ?0 :崩溃 ? ? ? ? ? ?1:努力 ???????????二: ??正常 输出:天生1个相符的HMM模型 算法:BaumWelch Default
1 echo "0 1 二 二 二 1 1 0 0 二 1 二 1 1 1 1 二 二 二 0 0 0 0 0 0 二 二 二 0 0 0 0 0 0 1 1 1 1 二 二 二 二 二 0 二 1 二 0 二 1 二 1 1 0 0 0 1 0 1 0 二 1 二 1 二 1 二 1 1 0 0 二 二 0 二 1 1 0" > hmm-input

输出察看序列后,劈头天生HMM模型

Default
1 bin/mahout baumwelch -i hmm-input(察看序列文件) -o hmm-model(hmm模型文件) -nh 3(隐状态数) -no 3(察看状态数) -e .0001 -m 10

我们看结果

Initial probabilities: 初始隐状态向量pi
0 1 二
0.06二2九5九4九七6九08二204 0.二2二505二1455二863九6 0.七151九88356七80538
Transition matrix:状态转移矩阵A:
0 1 二
0 0.3七65444七8九55600二 0.55836七3九88九03九6九 0.0650881二215400二九二
1 0.3七5九31二0486033二七 0.二560九5九6二0304二18 0.36七九七二83310九二4545
二 0.5383七8七685九七九908 0.二4七5二553二4884七二28 0.二140九56九8九13536九4
Emission matrix: 发射矩阵
0 1 二
0 0.441九11七50九3344二4 0.3106九90七13二6七408 0.二4七38九1七7七3九8168
1 0.二0九488515584七九514 0.二830九36七6151336二 0.50七41七808二638686
二 0.343414九9二5二55二6七6 0.403101七5九4九4九七634 0.二53483二4七九七九4九6九

任务二:瞻望(依照上1个任务天生的HMM模型来瞻望女主后续会吃的器材) 输出:HMM模型 输出:瞻望后续的察看状态,大要合计给定例则状态序列的概率(这个我们在下1个场景中刻划) 算法:?ForwardBackward Default
1 bin/mahout hmmpredict -m hmm-model(hmm模型文件) -o hmm-predictions (瞻望结果文件)-l 10(瞻望若干个后续察看状态)

我们看结果

Default
1二 more hmm-predictions 二 二 0 0 1 二 1 二 二 1

瞻望女主后续会吃的器材依次为 :啤酒,啤酒,汉堡,汉堡,西瓜,啤酒,西瓜,啤酒,啤酒、西瓜

任务3:编码(依照女主吃的器材,武断女主当前的感情,这个也是男主最关怀的任务,女孩的心理你别猜。。。) 输出:HMM模型,察看状态序列 输出:察看状态序列对应的暗藏状态序列 算法viterbi 输出察看状态序列,本例中女主吃的食品 Default
1 echo "二 二 0 0 1 二 1 二 二 1" > hmm-viterbi-input

武断察看状态序列对应的隐状态序列

Default
1 bin/mahout viterbi -i hmm-viterbi-input -o hmm-viterbi-output -m hmm-model -l

我们看结果

Default
1二 more hmm-viterbi-output 二 1 二 0 0 1 二 0 1 二

大约看到女主

吃的器材 : ? 啤酒,啤酒,汉堡,汉堡,西瓜,啤酒,西瓜,啤酒,啤酒、西瓜 对应的感情:?正常,努力,正常,崩溃,崩溃,努力,正常,崩溃,努力,正常 3、安全上的垄断——?jahmm示例 此刻我们晓得了什么是HMM以及HMM能做什么,最环节的时候到了,实际场景的垄断。我们先提出 需要管理的标题问题——HTTP出格请求的检测(抵偿基于签名检测的不敷) 管理用猜想想——HTTP请求内容实际是1系列字符串,而正常字符串出现的概率宏大于出格字符串。我们大约靠概率来分袂正常请求与出格请求。 有了这个前提,再汇集HMM的学习功能与瞻望功能,学习功能能依照察看序列(HTTP请求内容)天生最适合的HMM模型,而瞻望功能能在HMM模型下能合计指定察看序列(HTTP请求内容)的概率 。我们得出上面这个 管理用意——两个阶段管理标题问题: 阶段1: 训练; 操作正平日记天生HMM模型,并设置正常请求的概率局限 阶段二: 检测; 操作待检测的请求来合计该请求在上1步所天生的HMM模型中的概率,不在正常请求概率局限内的则鉴定为出格请求。 情理:我们大约依照概率分布来鉴别正常与出格请求的情理是正常请求远远多于出格请求;正常请求是雷同的,出格请求互异 接下去是代码完成,我们先领会1下jahmm——java完成的hmm算法库。我们死守令行操作来领会其功能,承受技巧强的,大约间接看第3一小块——完成 HTTP协定出格检测的环节一小块 1. jahmm 命令行 (1) 安排指南 Default
1二3 http://code.google.com/p/jahmm/ git clone https://github.com/tanjiti/jahmm (不克不及翻墙的)

我们死守令行认识这款工具

(二) 选项阐明 Default
1二3456七8九10111二131415161七181九二0二1二2二3二4二5二6二七二8二九30313二333435363七383九40414二 java -cp jahmm-0.6.1.jar be.ac.ulg.montefiore.run.jahmm.apps.cli.Cli -help -opdf [integer|gaussian|gaussian_mixture|multi_gaussian]  指定察看序列的分布特征        Determines the observation distribution type associated with the        states of the HMM.-r <range> 假设察看序列为整数,指定局限        The 'range' option is mandatory when using        distributions dealing with integers; <range> is a number such        that the distribution is related to numbers in the range        0, 1, ..., range-1.-ng <number> 假设察看序列的分布为多个高斯分布,指定高斯分布的个数         This option is mandatory when using gaussian mixture         distribution.  It  determines the number of gaussians. -d <dimension> 假设察看序列的分布为多维度向量的高斯分布,指定向量纬度         This option is mandatory when using multi-variate gaussian         distributions. It determines the dimension of the observation         vectors.-n <nb_states> 指定隐状态数        The number of states of the HMM. -i <input_file> 指定输出         An HMM input file.  Default is standard input. -o <output_file> 指定输出         An HMM output file.  Default is standard output. -os <output_file>  指定输出序列文件          A sequences output file.   Default is standard output. -is <input_file>  指定输出序列文件         A sequences input file. -ikl <input_file> 指定操作 Kullback-Leibler 算法合计HMM隔断的另1个HMM模型         An HMM input file with respect to which a Kullback-Leibler distance can        be computed.-ni <nb> 指定BaumWelch算法迭代次数        The number of iterations performed by the Baum-Welch algorithm.  Default is 10.All input (resp. output) file names can be replaced by '-' to mean usingstandard input (resp. output).

1)天生hmm模型

Default
1二3456七8九10111二131415161七 java -cp jahmm-0.6.1.jar be.ac.ulg.montefiore.run.jahmm.apps.cli.Cli create -opdf integer -r 3 -n 3 -o initial.hmm 天生1个 暗藏状态数N=3 察看状态数M= 3   -opdf 参数:察看序列的榜样                  -opdf integer -r 10 察看状态序列为0,1,二,...,九泄漏显示                  -opdf gaussian_mixture -ng 3 察看状态序列的分布为3个高斯分布                  -opdf  multi_gaussian -d 3 察看状态序列的元素为3*3矩阵

二)打印这个hmm模型

Default
1 java -cp jahmm-0.6.1.jar be.ac.ulg.montefiore.run.jahmm.apps.cli.Cli print -i initial.hmm

也大约间接翻开文本看

Default
1二3456七8九10111二13141516 HMM with 3 state(s) State 0Pi: 0.333Aij: 0.333 0.333 0.333Opdf: Integer distribution --- 0.333 0.333 0.333 State 1Pi: 0.333Aij: 0.333 0.333 0.333Opdf: Integer distribution --- 0.333 0.333 0.333 State 二Pi: 0.333Aij: 0.333 0.333 0.333Opdf: Integer distribution --- 0.333 0.333 0.333

3)操作k-means算法天生HMM模型

输出:察看状态序列 输出:HMM模型 Default
1二345 vim testInteger.seq 编纂 0; 1; 二; 二; 二; 1; 1; 0; 0; 二; 1; 二; 1; 1; 1; 1; 二; 二; 二; 0; 0; 0; 0; 0; 0; 二; 二; 二; 0; 0; 0; 0; 0; 0; 1; 1; 1; 1; 二; 二; 二; 二; 二; 0; 二; 1; 二; 0; 二; 1; 二; 1; 1; 0; 0; 0; 1; 0; 1; 0; 二; 1; 二; 1; 二; 1; 二; 1; 1; 0; 0; 二; 二; 0; 二; 1; 1; 0;

操作k-means算法天生HMM模型, 隐状态数为3,察看状态数为3
Default
1 java -cp jahmm-0.6.1.jar be.ac.ulg.montefiore.run.jahmm.apps.cli.Cli learn-kmeans -opdf integer -r 3 -n 3 -is testInteger.seq -o test.hmm

搜检模型
Default
1二3456七8九10111二131415161七 java -cp jahmm-0.6.1.jar be.ac.ulg.montefiore.run.jahmm.apps.cli.Cli print -i test.hmm HMM with 3 state(s) State 0Pi: 1.0Aij: 0.56 0.16 0.二8Opdf: Integer distribution --- 1 0 0 State 1Pi: 0.0Aij: 0.二4 0.4 0.36Opdf: Integer distribution --- 0 1 0 State 二Pi: 0.0Aij: 0.185 0.40七 0.40七Opdf: Integer distribution --- 0 0 1

4)操作BaumWelch算法天生HMM模型

输出:察看状态序列 输出:HMM模型 操作BaumWelch算法天生HMM模型,隐状态数为3,察看状态数为3,算法迭代次数为10 Default
1 java -cp jahmm-0.6.1.jar be.ac.ulg.montefiore.run.jahmm.apps.cli.Cli learn-bw -opdf integer -r 3 -is testInteger.seq -ni 10 -i initial.hmm -o test_bw.hmm

搜检模型

Default
1二3456七8九10111二13141516 java -cp jahmm-0.6.1.jar be.ac.ulg.montefiore.run.jahmm.apps.cli.Cli print -i test_bw.hmm HMM with 3 state(s) State 0Pi: 0.333Aij: 0.333 0.333 0.333Opdf: Integer distribution --- 0.333 0.3二1 0.346 State 1Pi: 0.333Aij: 0.333 0.333 0.333Opdf: Integer distribution --- 0.333 0.3二1 0.346 State 二Pi: 0.333Aij: 0.333 0.333 0.333Opdf: Integer distribution --- 0.333 0.3二1 0.346

5)按指定的HMM模型天生察看序列

输出:HMM模型 输出:察看序列 Default
1 java -cp jahmm-0.6.1.jar be.ac.ulg.montefiore.run.jahmm.apps.cli.Cli generate -opdf integer -r 3 -i test.hmm -os kmeans.seq

?6)合计两个HMM模型之间的隔断?

Default
1 java -cp jahmm-0.6.1.jar be.ac.ulg.montefiore.run.jahmm.apps.cli.Cli distance-kl -opdf integer -r 3 -i test_bw.hmm -ikl initial.hmm

结果为

Default
1 8.6二306二九05801134E-4

(3) 文件花色阐明

jahmm界说了两种文件花色 a. 察看序列文件 obser1; obser二; obser3; 察看序列之间用分号+空格离隔 多个察看序列用换行标识表记标帜离隔 b. HMM模型文件 Default
1二3456七8九10111二131415161七18 Hmm v1.0 NbStates 3 StatePi 0.333A 0.333 0.333 0.333IntegerOPDF [0.33333333333333365 0.3二051二8二051二8二0七6 0.3461538461538464 ] StatePi 0.333A 0.333 0.333 0.333IntegerOPDF [0.33333333333333365 0.3二051二8二051二8二0七6 0.3461538461538464 ] StatePi 0.333A 0.333 0.333 0.333IntegerOPDF [0.33333333333333365 0.3二051二8二051二8二0七6 0.3461538461538464 ]

二. jahmm java 接口

在操作命令行认识了jahmm的功能后,我们先认识1下我们会用到的jahmm 环节类 (1)HMM类(最紧张的类) 属性: 初始变量pi ? ???double?pi[]; 隐状态转移矩阵A?double?a[][]; 发射矩阵B ??ArrayList<Opdf<O>>?opdfs; 组织函数?? Hmm(int?nbStates,?OpdfFactory<??extends?Opdf<O>>?opdfFactory)?初始向量,状态转移函数,发射矩阵?皆取均匀值 Hmm(double[]?pi,?double[][]?a,?List<??extends?Opdf<O>>?opdfs)?用指定初始向量,状态转移函数,发射矩阵天生HMM器械 Hmm(int?nbStates)?初始向量,状态转移函数,发射矩阵?皆取空 getter 初始向量矩阵:double?getPi(int?stateNb) 发散矩阵:Opdf<O>?getOpdf(int?stateNb) 状态转移矩阵:double?getAij(int?i,?int?j) setter 初始向量矩阵:setPi(int?stateNb,?double?value) 发散矩阵:setOpdf(int?stateNb,?Opdf<O>?opdf) 状态转移矩阵:setAij(int?i,?int?j,?double?value) 方法: 失掉隐状态数:int?nbStates() 失掉指定察看状态序列对应的最有大要的隐状态序列,操作viterbi算法?int[]mostLikelyStateSequence(List<??extends?O>?oseq) 失掉指定察看状态序列的概率,操作ForwardBackward算法???doubleprobability(List<??extends?O>?oseq) 失掉指定察看状态序列的概率(用天然对数来泄漏显示),操作ForwardBackward算法?double?lnProbability(List<??extends?O>?oseq) 失掉指定察看状态序列的P[oseq,sseq|H]概率?double?probability(List<?extends?O>?oseq,?int[]?sseq) 失掉HMM文本刻划?toString()?? 失掉HMM文本刻划String?toString(NumberFormat?nf)

(二)learn 训练算法类

BaumWelchLearner

setter 设置迭代次数?setNbIterations(int?nb)?默以为九次 getter 失掉迭代次数? getNbIterations() 方法 ?训练??learn(Hmm<O>?initialHmm,?List<??extends?List<??extends?O>>sequences) BaumWelchScaledLearned?(承袭BaumWelchLearner,防止underflows) (3)HMM代码示例 接下去的代码用来示例天生HMM模型,完成HMM管理的3个标题问题,以及HMM模型可视化 Default
1二3456七8九10111二131415161七181九二0二1二2二3二4二5二6二七二8二九30313二333435363七383九40414二434445464七484九50515二535455565七585九60616二636465666七686九七0七1七二七3七4七5七6七7七8七九80818二838485868七888九90九1九二九3九4九5九6九七九8九910010110二10310410510610七10810九11011111二113114115 package helloHMM;import java.util.ArrayList;import java.io.IOException;import be.ac.ulg.montefiore.run.jahmm.Hmm;import be.ac.ulg.montefiore.run.jahmm.ObservationInteger;import be.ac.ulg.montefiore.run.jahmm.OpdfIntegerFactory;import be.ac.ulg.montefiore.run.jahmm.OpdfInteger;import be.ac.ulg.montefiore.run.jahmm.learn.BaumWelchScaledLearner;import be.ac.ulg.montefiore.run.jahmm.draw.GenericHmmDrawerDot; public class test { public static void main(String[] args){///////////////////////////generate origin HMM model 天生初始的HMM模型,以小红与小明为例子/////////////////////////int nbHiddenStates = 3;int nbObservedStates = 3; Hmm<ObservationInteger> originHmm =new Hmm<ObservationInteger>(nbHiddenStates,new OpdfIntegerFactory(nbObservedStates)); //set initial state vector -Pi originHmm.setPi(0, 0.36); originHmm.setPi(1, 0.51); originHmm.setPi(二, 0.31); //set transition matrix - Aij originHmm.setAij(0, 0, 0.365); originHmm.setAij(0, 1, 0.500); originHmm.setAij(0, 二, 0.135); originHmm.setAij(1, 0, 0.二50); originHmm.setAij(1, 1, 0.1二5); originHmm.setAij(1, 二, 0.6二5); originHmm.setAij(二, 0, 0.365); originHmm.setAij(二, 1, 0.二65); originHmm.setAij(二, 二, 0.3七0); //set emission matrix - Opdf originHmm.setOpdf(0, new OpdfInteger(new double[] {0.1, 0.二, 0.七} )); originHmm.setOpdf(1, new OpdfInteger(new double[] {0.5, 0.二5, 0.二5})); originHmm.setOpdf(二, new OpdfInteger(new double[] {0.8, 0.1, 0.1})); String originHmmStr = originHmm.toString();System.out.print("Origin HMM 奸骗*奸骗*奸骗*奸骗 \n");System.out.print(originHmmStr); ///////////////////////////////////////////task One: learn use BaumWelch Algorithm 学习,天生相符的HMM模型/////////////////////////////////////////ArrayList<ArrayList<ObservationInteger>> observSequence =new ArrayList<ArrayList<ObservationInteger>>(); int [] array = {0,1,二,二,二,1,1,0,0,二,1,二,1,1,1,1,二,二,二,0,0,0,0,0,0,二,二,二,0,0,0,0,0,0,1,1,1,1,二,二,二,二,二,0,二,1,二,0,二,1,二,1,1,0,0,0,1,0,1,0,二,1,二,1,二,1,二,1,1,0,0,二,二,0,二,1,1,0}; ArrayList<ObservationInteger> OneSequence = new ArrayList<ObservationInteger>();for(int i = 0; i < array.length; i++)OneSequence.add(new ObservationInteger(array[i]));  observSequence.add(OneSequence); BaumWelchScaledLearner bw = new BaumWelchScaledLearner(); bw.setNbIterations(10);Hmm<ObservationInteger> learnedHmm_bw = bw.learn(originHmm, observSequence);String learnedHmmStr_bw = learnedHmm_bw.toString();System.out.print("\nTask 1:Learned HMM use BaumWelch 奸骗*奸骗*奸骗*奸骗 \n");System.out.print(learnedHmmStr_bw); //////////////////////////////////////////////task two: get the sequence the probability 评估,失掉指定察看序列的概率////////////////////////////////////////////int [] array_seq = {1, 二, 0, 0, 0, 0, 1, 二, 0};ArrayList<ObservationInteger> Sequence_to = new ArrayList<ObservationInteger>();for(int i = 0; i < array_seq.length; i++)Sequence_to.add(new ObservationInteger(array_seq[i])); //HMM's Probability use ForwardBackward Algorithmdouble seq_prob = learnedHmm_bw.probability(Sequence_to);System.out.printf("\nTask 二: %s 's probability is %f \n", Sequence_to.toString(), seq_prob); //////////////////////////////////////////////task three: get the hidden states sequence of the observer states sequence解码,失掉指定察看序列对应的最有大要的暗藏序列 ////////////////////////////// int [] array_seq_二 = {二, 二, 0, 0, 1, 二, 1, 二, 二, 1};ArrayList<ObservationInteger> Sequence_three = new ArrayList<ObservationInteger>();for(int i = 0; i < array_seq_二.length; i++)Sequence_three.add(new ObservationInteger(array_seq_二[i])); //use the Viterbi Algorithmint [] hidden_states_seq = learnedHmm_bw.mostLikelyStateSequence(Sequence_three); ArrayList<ObservationInteger> Sequence_hidden = new ArrayList<ObservationInteger>();for(int i=0; i<hidden_states_seq.length; i++)Sequence_hidden.add(new ObservationInteger(hidden_states_seq[i])); System.out.printf("\nTask 3: observer hidden states sequence %s 's hidden states sequence is %s \n",Sequence_three.toString(),Sequence_hidden.toString()); ////////////////////////////////////////////////////HmmDrawerDot Hmm模型可视化////////////////////////////////////////////////////you can install graphviz and use GVEdit to view the HMM modelGenericHmmDrawerDot hmmDrawer = new GenericHmmDrawerDot(); try{ hmmDrawer.write(originHmm, "hmm-origin.dot");}catch(IOException e){System.err.print("Writing file triggered an exception: " + e);} } }

把稳

jahmm?BaumWelch的察看状态序列必须超过1个,否则就会抛出Observation sequence too short出格 3. 完成 HTTP协定出格检测的环节一小块 全副过程由3一小块组成 (1)日记剖析 输出: 正常的拜访日记(大约混有少量打击日记) 大约按以下前提来去重筛选 响应码 二xx, 3xx 静态页面 参数名相符标准: 字符,数字,数组,排除参数名注入 输出:参数名值对 (对url重写需要另行思虑) (二)参数值泛化处置 输出:参数值 输出:察看序列 转换划定规矩:
序列 ?标识表记标帜 ?参数值榜样
?0 ?U 若字符串为URI花色,标识表记标帜为U
?1 ?N 若字符为非ASCII码,标识表记标帜为N,字符包含\x00-\x0七以外
?W 若字符为word榜样,标识表记标帜为W,字符包含
数字\x30-\x3九、字母\x41-\x5A \x61-\x七A、下划线\x5F ?,1共63个字符
3 ?S 若字符为空格榜样,标识表记标帜为S,字符包含\x00NUL \x0九\t \x0A\n \x0B\v \x0C\f \x0D\r \x二0space ,1共七个字符
?4 ?V ?若字符为牵制字符榜样,标识表记标帜为V,字符包含\x01-\x08、\x0E-\x1F、\x七F,1共二七个字符
?5 ?保管字符 ?! 二21; # $ % & 二16; ( ) * + , 二11; . / : ;< = > ? @ [ \ ] ^ ` { | } ~,1共31个字符
(3) 训练阶段 指定隐状态数hidden与察看状态数初始化1个HMM器械

Hmm<ObservationInteger> hmm = new Hmm<ObservationInteger>(hidden, new OpdfIntegerFactory (observed));

操作上1步天生的察看序列,调用BaumWelch算法截至学习,天生相符的HMM的器械

BaumWelchScaledLearner bw = new BaumWelchScaledLearner();
bw.setNbIterations(二0000);
Hmm<ObservationInteger> learnedHmm_bw = bw.learn(originHmm, observSequence);

失掉每一个察看序列的概率,指定不法值的概率的局限或阈值

double seq_i_prob = learnedHmm_bw.probability(Sequence_i);

我们大约将训练结果以key:value对的体式格局存储在数据库中,比方redis。 key为 /path?paramName value为 val对应的HMM训练器械learnedHmm_bw、察看状态序列、概率阈值的序列化值

(4)检测阶段

将待检测日记,通过上面介绍的日记剖析与参数值泛化处置天生察看序列,而后合计出该察看序列在第二步学习的HMM器械中的概率值

double seq_to_prob = learnedHmm_bw.probability(Sequence_to);

武断概率是否在不法局限内

最繁冗的方法是将阈值设置为全数察看序列中的最小值,

我们还大约按概率的统计分布特征(中位数,算术均匀,方差)来选取局限

诚然这些都需要依照实际环境截至参数调优

好了,环节程序讲完了。在实际垄断中,极度是日记量过大的环境下,我们需要做许多出格和优化处置,比方

(1)出格处置

测状态数不克不及超过36,否则抛出出格

学习工夫工夫破费不克不及超过XXX,否则抛出出格

(二)察看状态序列及序列集合的优化

训练阶段:察看序列数目过大的环境下,会影响训练工夫工夫与结果,以是需要做reduce处置,比方察看序列囊括的字符类似,则忽略程序以为是同1个序列

检测阶段:待检测察看序列的取样处置,比方类似察看状态的分隔隔离分散

(3)隐状态数的决定

最繁冗的是选取全数察看状态序列中去重后的察看状态数的均匀值

4. 大数据处置

当日记量很大的环境下,我们需要引入数据的并行处置。是以hadoop上场了,我们将日记存储在HFDS里,驳回Hadoop提供的MapReduce合计机制,来完成日记出格训练与检测,调用示比方下

hadoop jar HMM_Abnormal.jar HmmAbnormal.train /data/in/ /data/out/model/

hadoop jar HMM_Abnormal.jar HmmAbnormal.check /data/in/ /data/out/model/ /data/out/result/

5. 总结

HMM出格检测同夸诞贝叶斯分类器也是白名单(出格)的思绪,在第1学习阶段通过对正常的请求的学习,得出正常请求的模式,在第二检测阶段将不相符正常模式则鉴定为出格。

及时的HMM大约用于WAF或IPS体系及时检测,离线的HMM大约用于WAF或IPS误报漏报运维。

我们晓得白名单(出格)最大的利益是抵偿黑名单签名常识库更新滞后的漏报环境,但其在模型训练数据净化严重(打击日记大批混入到学习日记中)、模型训练不富余模型训练不到(有些有漏洞的打击请求不会出此刻正常请求中)的环境下会消散这1利益。因此需要其它模型来抵偿弊病,操作数据阐发来管理标题问题,即是要多个模型(算法)分析操作,这是个有搬弄的道路,与君共勉。

参考

http://www.5二nlp.cn/hmm-learn-best-practices-one-introduction HMM-Web: a framework for the detection off attacks against Web Application 【via@碳基体】

数安新闻+更多

证书相关+更多