KNN(K nearest neighbor)算法
1.概念
KNN算法是分类算法的一个基础算法,它是一个先验算法,也就是需要首先有一个基础的分类,再对一个目标样本进行分类的算法。
2.原理
如下图,假设有一个样本集合已经分好为3类:绿、蓝、紫,现在要对一个目标样本(图中红点)进行分类。
其中每个样本有n个特征,每2个样本(x、y)之间可按照欧式距离公式计算出一个距离:
D=∑ni=0(xi−yi)2−−−−−−−−−−−−√
KNN的原理就是,以目标为中心,构造一个包含K个点的最小半径的”圆”,该圆内包含哪一类样本多,目标就属于哪一类。比如图中的K=4时,紫色点多,则该样本分为紫色类。当K=6时,绿色点多,则该样本分为绿色类。显然KNN算法的K值选取很关键。
并不是K越大精度越高,这与目标所处位置有关。目标样本在分类边界时,K值选取不同,可能导致分类结果不同,而目标样本在某一类中心时,则K大K小无所谓了。
K值越大,计算量越大,时间复杂度为:O(N*K)
分类样本数量不同时,要乘以权值后再计算,防止大类吞小类现象。
3. 实践
可以对WEB访问日志中每一个动态URL访问进行一个基础分类:
- 攻击:危险等级为高的安全日志
- 可疑:危险等级不为高的安全日志
- 正常:只有访问日志
提炼某动态URL访问日志的N维特征:
名称 | 说明 | 取值 |
---|---|---|
method | 请求方法 | GET:1 POST:2 Other:3 |
referer_info | Referer信息 | 无:1 自己:2 非自己:3 |
referer_length | Referer长度 | 取实际值 |
url_para_count | GET参数个数 | 取实际值 |
Post_para_count | POST参数个数 | 取实际值 |
max_para_length | 最长的参数值 | 最长的参数值 |
cookie_count | Cookie个数 | 取实际值 |
referer_url_count | 引用的URL数量(依据此可区分工具和浏览器) | IP和UA相同的30s内referer是自己的不同url个数。 |
access_count | 24h内访问次数 | IP和UA相同的24h内的访问次数 |
上表中斜体为访问日志中暂不存在的,但确实有分析价值的参数值。
K值选取:10
Github上有现成的SPARK KNN算法:https://github.com/saurfang/spark-knn
4. 参考文献
[1] 数据挖掘之KNN分类 http://www.cnblogs.com/fengfenggirl/archive/2013/05/27/knn.html