吐槽大会
最近觉得python对于学的浅的人真的好鸡肋阿!
写poc,exp?可能也就比yaml灵活性高一些
写Gui?不想吐槽
写免杀?卡巴给你头都杀烂了
比大小?看看go生成的大小,python生成的exe真的不配去实战。
不得已了,抽出晚上凌晨的时候去学习学习python大名鼎鼎的机器学习吧。
文章一方面给大家分享分享学习的东西,另一方面也当做一个记录和复盘。
00x1 Knn算法
1、什么是knn算法?
Knn又叫做k近邻算法,是机器学习中大名鼎鼎的分类算法之一,原理非常简单,所以我们拿它开局,该算法应用场景也挺广泛的。
2、knn算法原理?
首先记住一句话,knn算法可以解决分类问题,也可以解决回归问题。
不用看网上那些专业术语,我们用大白话来讲:
近朱者赤近墨者黑,距离相近的事物具有相同属性的概率要大于距离较远的!
借用一句古文:
橘生淮南则为橘,橘生淮北则为枳
完整的典故是:
齐国派晏子出使楚国,楚王听说后想要羞辱他,就想出一计,楚王让人故意将一个犯人押过来,楚王问:此人犯了什么罪?,答:一个齐国人犯了偷窃罪,楚王就对晏子说,齐国人都善于偷盗吗?晏子回答:淮南的橘子又大又甜,可是到了淮北,就变成了枳,又酸又小,这是为什么呢?
再简单点:物以类聚人以群分,感觉要被打了。
步骤:
1.找到k值
2.根据k值去寻找离目标最远的点
3.根据最远的点的距离为半径画一个圆
4.圆内所有的点作为判断依据
5.圆内的点大部分属于什么属性目标就是什么属性
Knn算法常用的有:
· Brute Force
· K-D Tree
· Ball Tree
跟着大佬们学,先学习使用Knn算法训练平面数据集:
先来使用numpy来创建个平面数据集
a = numpy.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
然后调用scikit-learn中的knn算法,设置两个k邻居:
a = numpy.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
b = NearestNeighbors(n_neighbors=2, algorithm='ball_tree').fit(a)
然后来查看一下训练结果:
distances, indices = b.kneighbors(a)
print distances
print indices
完整代码:
from sklearn.neighbors import NearestNeighbors
import numpy
numpy.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
b = NearestNeighbors(n_neighbors=2, algorithm='ball_tree').fit(a)
distances, indices = b.kneighbors(a)
print distances
print indices
print (b.kneighbors_graph(a).toarray())
n_neighbors=2就是k
distances就是距离
indices就是距离最近的点(用下标表示)
b.kneighbors_graph(a).toarray()是将距离最近的点矩阵化表示(1表示是,0表示否)
然后我们看下运行结果:
一共打印了三个值,首先是 distances,也就是每个点的距离:
可以看到有距离为0的,有距离为1的,有距离为1.41的
再来看下indices:
解释下这个结果是什么意思,我们知道数组的每个值都有下标,这里代表的就是下标为0的点,也就是第一个距离谁最近,我们的结果显示距离下标为1的点最近,以此类推。
最后打印一个矩阵图形化显示:
再举一个例子:
x = [[0],[1],[2],[3]]
y = [0,0,1,1]
from sklearn.neighbors import KNeighborsClassifier
neigh = KNeighborsClassifier(n_neighbors=3)
neigh.fit(x,y)
我们来看一下这段代码,我们首先生成4个数字,然后两两分组,将0和1数字标记为0,将2和3数字标记为1,当新出现一个数字的时候,这个数字接近谁,就会被标记为哪个标签。
我们来打印一个看看:
print(neigh.predict([[1.1]]))
当我们加入一个值为1.1的时候,这时候是接近数字1的,数字1的标签为0
所以打印结果也为0
然后我们修改为1.6,这个数值是接近数字2的,所以返回结果应该为1
所以学习这些是为了什么呢?又能干什么呢?
想象一下,如果我们把一些正常的webshell所使用的敏感函数打包成多个标签,然后我们通过邻近算法来判断,是否可以检测webshell呢?
我们接下来借用一下刘焱大佬的代码:
import re
import matplotlib.pyplot as plt
import os
from sklearn.feature_extraction.text import CountVectorizer
from sklearn import cross_validation
import os
from sklearn.datasets import load_iris
from sklearn import tree
import pydotplus
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
def load_one_flle(filename):
x=[]
with open(filename) as f:
line=f.readline()
line=line.strip('n')
return line
def load_adfa_training_files(rootdir):
x=[]
y=[]
list = os.listdir(rootdir)
for i in range(0, len(list)):
path = os.path.join(rootdir, list[i])
if os.path.isfile(path):
x.append(load_one_flle(path))
y.append(0)
return x,y
def dirlist(path, allfile):
filelist = os.listdir(path)
for filename in filelist:
filepath = os.path.join(path, filename)
if os.path.isdir(filepath):
dirlist(filepath, allfile)
else:
allfile.append(filepath)
return allfile
def load_adfa_webshell_files(rootdir):
x=[]
y=[]
allfile=dirlist(rootdir,[])
for file in allfile:
if re.match(r"../data/ADFA-LD/Attack_Data_Master/Web_Shell_d+/UAD-W*",file):
x.append(load_one_flle(file))
y.append(1)
return x,y
if __name__ == '__main__':
x1,y1=load_adfa_training_files("../data/ADFA-LD/Training_Data_Master/")
x2,y2=load_adfa_webshell_files("../data/ADFA-LD/Attack_Data_Master/")
x=x1+x2
y=y1+y2
#print x
vectorizer = CountVectorizer(min_df=1)
x=vectorizer.fit_transform(x)
x=x.toarray()
#print y
clf = KNeighborsClassifier(n_neighbors=3)
scores=cross_validation.cross_val_score(clf, x, y, n_jobs=-1, cv=10)
print scores
print np.mean(scores)
首先代码会先加载一个训练的文件,然后加载一个webshell的文件:
x1,y1=load_adfa_training_files("../data/ADFA-LD/Training_Data_Master/")
x2,y2=load_adfa_webshell_files("../data/ADFA-LD/Attack_Data_Master/")
就是打标签的意思,一好一坏。
然后使用transform将之向量化,然后调用knn算法,将k值设为3去计算。
然后进行交叉验证,进行评分
这个交叉验证的意思就是比如十份数据,我们先拿第一份数据当做样本跟其他9份做对比学习,然后再用第二份跟其他9份做对比,一次类推,最终推算出平均值。
然后
.....
真正要实战的话,就是讲一些代码、函数进行向量化,与训练好的数据做近邻算法,反正开发起来很麻烦,也不知道哪个产品用这个做了。。后面再继续研究把!可太难了。。
往期精彩:
点个在看你最好看
原文始发于微信公众号(Qingy之安全):【入门篇】机器学习算法-Knn
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论