机器学习算法适用场景

[toc]

随机森林

决策树

马尔可夫

隐马尔可夫(HMM)

三骰子问题

  • 假设我手里有三个不同的骰子:
  1. 第一个骰子是我们平常见的骰子(称这个骰子为D6),6个面,每个面(1,2,3,4,5,6)出现的概率是1/6
  2. 第二个骰子是个四面体(称这个骰子为D4),每个面(1,2,3,4)出现的概率是1/4
  3. 第三个骰子有八个面(称这个骰子为D8),每个面(1,2,3,4,5,6,7,8)出现的概率是1/8

  • 开始掷骰子10次,点数为 1 6 3 5 2 7 3 5 2 4,这串数字叫做==可见状态链==
  • 其中隐含状态链就是你用的骰子的序列,比如,隐含状态链有可能是:D6 D8 D8 D6 D4 D8 D6 D6 D4 D8,一般来说,HMM中说到的马尔可夫链其实是指==隐含状态链==
  • ==转换概率==(transition probability):隐含状态直接的转换概率,如D6的下一个状态是D4,D6,D8的概率都是1/3,也可以定义,D6后面不能接D4,D6后面是D6的概率是0.9,是D8的概率是0.1
  • ==输出概率==(emission probability):隐含状态和可见状态之间有一个概率,如六面骰(D6)产生1的输出概率是1/6,产生2,3,4,5,6的概率也都是1/6

五要素和三个基本问题

五要素

综上所述,我们可以得到隐马尔科夫的基本要素,即一个五元组{S,N,A,B,PI};

1
2
3
4
5
S:隐藏状态集合;
N:观察状态集合;
A:隐藏状态间的转移概率矩阵;
B:输出矩阵(即隐藏状态到输出状态的概率);
PI:初始概率分布(隐藏状态的初始概率分布);

三个基本问题

  • 似然度问题:参数(N,PI,A,B)已知的情况下,求(PI,A,B)下观测序列N出现的概率。(Forward-backward算法)
  • 解码问题:参数(N,PI,A,B)已知的情况下,求解状态值序列S(最大概率)。(viterbi算法)
  • 学习问题:参数(N)已知的情况下,求解(PI,A,B)。(Baum-Welch算法)

应用场景

学习问题

参数异常检测(以白找黑)

  • 场景分析下面为正常用户请求
    1
    2
    3
    4
    5
    6
    /0_1/include/dialog/select_media.php?userid=admin123
    /0_1/include/dialog/select_media.php?userid=root
    /0_1/include/dialog/select_media.php?userid=maidou0806
    /0_1/include/dialog/select_media.php?userid=52maidou
    /0_1/include/dialog/select_media.php?userid=wjq_2014
    /0_1/include/dialog/select_media.php?userid=mzc-cxy
  • 下面为异常用户请求
    1
    /0_1/include/dialog/select_media.php?userid=%3Cscript%3Ealert(1)%3C/script%3E
  • 以userid为例,我们将uid的值作为观察序列N,隐藏序列的状态只有四个, A、
    N、 C、 T:
1
2
3
4
·[a-zA-Z]范化为A;
·[0-9]范化为N;
·[\-_]范化为C;
·其他字符范化为T。
  • URL参数admin 123和root范化结果为:

    1
    2
    ·admin123范化为AAAAANNN
    ·root范化为AAAA
  • 将url中以userid的参数值进行范化训练模型

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#-*- coding:utf-8 –*-

import sys
import urllib
import urlparse
import re
from hmmlearn import hmm
import numpy as np
from sklearn.externals import joblib


#处理参数值的最小长度
MIN_LEN=6

#状态个数
N=4
#最大似然概率阈值
T=-200
SEN=['-', '_', '\\']


def etl(str):
vers=[]
for i, c in enumerate(str):
c=c.lower()
if ord(c) >= ord('a') and ord(c) <= ord('z'):
vers.append([1])
elif ord(c) >= ord('0') and ord(c) <= ord('9'):
vers.append([2])
elif c in SEN:
vers.append([3])
else:
vers.append([4])

#print vers
return np.array(vers)

def main(filename):
X = []
X_lens = []
with open(filename) as f:
for line in f:
line=line.strip('\n')
# 切割参数
result = urlparse.urlparse(line)
# url解码
query = urllib.unquote(result.query)
params = urlparse.parse_qsl(query, True)

for k, v in params:
if len(v) >= MIN_LEN:
vers = etl(v)
print vers
for i in vers:
X.append(i)
#X=np.concatenate([X,vers])
X_lens.append(len(vers))


remodel = hmm.GaussianHMM(n_components=N, covariance_type="full", n_iter=100)
remodel.fit(X,X_lens)
#joblib.dump(remodel, "xss-train.pkl")

return remodel

def test(remodel,filename):
with open(filename) as f:
for line in f:
# 切割参数
result = urlparse.urlparse(line)
# url解码
query = urllib.unquote(result.query)
params = urlparse.parse_qsl(query, True)

for k, v in params:
if len(v) >= MIN_LEN :
vers = etl(v)
pro = remodel.score(vers)
if pro >= T:
print "SCORE:(%d) QUREY_PARAM:(%s) EX_URL:(%s) " % (pro,v,line)
#print line
else:
print "SCORE:(%d) QUREY_PARAM:(%s) NO_URL:(%s) " % (pro,v,line)



if __name__ == '__main__':
remodel=main(sys.argv[1])
test(remodel,sys.argv[2])

用户访问习惯(以白找黑)

  • 场景分析,下面为用户正常请求顺序
1
2
3
4
/api/login.php
/api/userlist
/api/msg
/api/redpacket
  • 下面为异常用户请求顺序
1
2
/api/redpacket
/api/redpacket

xss攻击识别(以黑找黑)

解码问题

语音解码

词性标注

似然度问题

搜索词猜想补齐

参考

-------------本文结束感谢您的阅读-------------
0%