【入门篇】机器学习算法-Knn

admin 2024年12月28日13:33:59评论4 views字数 4008阅读13分21秒阅读模式

吐槽大会

【入门篇】机器学习算法-Knn
【入门篇】机器学习算法-Knn

最近觉得python对于学的浅的人真的好鸡肋阿!

写poc,exp?可能也就比yaml灵活性高一些

写Gui?不想吐槽

写免杀?卡巴给你头都杀烂了

比大小?看看go生成的大小,python生成的exe真的不配去实战。

【入门篇】机器学习算法-Knn
【入门篇】机器学习算法-Knn
【入门篇】机器学习算法-Knn

不得已了,抽出晚上凌晨的时候去学习学习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], [11], [21], [32]])

然后调用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 distancesprint indices

完整代码:

from sklearn.neighbors import NearestNeighborsimport numpynumpy.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 distancesprint indicesprint (b.kneighbors_graph(a).toarray())
n_neighbors=2就是kdistances就是距离indices就是距离最近的点(用下标表示)b.kneighbors_graph(a).toarray()是将距离最近的点矩阵化表示(1表示是,0表示否)

然后我们看下运行结果:

一共打印了三个值,首先是 distances,也就是每个点的距离:

【入门篇】机器学习算法-Knn

可以看到有距离为0的,有距离为1的,有距离为1.41的

再来看下indices:

【入门篇】机器学习算法-Knn

解释下这个结果是什么意思,我们知道数组的每个值都有下标,这里代表的就是下标为0的点,也就是第一个距离谁最近,我们的结果显示距离下标为1的点最近,以此类推。

最后打印一个矩阵图形化显示:

【入门篇】机器学习算法-Knn

再举一个例子:

x = [[0],[1],[2],[3]]y = [0,0,1,1]from sklearn.neighbors import KNeighborsClassifierneigh = 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

【入门篇】机器学习算法-Knn

然后我们修改为1.6,这个数值是接近数字2的,所以返回结果应该为1

【入门篇】机器学习算法-Knn

所以学习这些是为了什么呢?又能干什么呢?

想象一下,如果我们把一些正常的webshell所使用的敏感函数打包成多个标签,然后我们通过邻近算法来判断,是否可以检测webshell呢?

我们接下来借用一下刘焱大佬的代码:

import reimport matplotlib.pyplot as pltimport osfrom sklearn.feature_extraction.text import CountVectorizerfrom sklearn import cross_validationimport osfrom sklearn.datasets import load_irisfrom sklearn import treeimport pydotplusimport numpy as npfrom sklearn.neighbors import KNeighborsClassifierdef load_one_flle(filename):    x=[]    with open(filename) as f:        line=f.readline()        line=line.strip('n')    return linedef 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,ydef 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 allfiledef 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,yif __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份做对比,一次类推,最终推算出平均值。

然后

.....

真正要实战的话,就是讲一些代码、函数进行向量化,与训练好的数据做近邻算法,反正开发起来很麻烦,也不知道哪个产品用这个做了。。后面再继续研究把!可太难了。。

【入门篇】机器学习算法-Knn

往期精彩:

  命令执行无路径写shell

【审计学习】PHP审计的危险函数概括

【超详细 | 附EXP】Weblogic 新的RCE漏洞CVE-2021-2394

【入侵检测】Linux机器中马排查思路

【入侵检测】Windows机器中马排查思路

【代码审计】对一套钓鱼网站的代码审计

  Web安全——登录页面渗透测试思路整理

【入门篇】机器学习算法-Knn

点个在看你最好看

【入门篇】机器学习算法-Knn

原文始发于微信公众号(Qingy之安全):【入门篇】机器学习算法-Knn

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年12月28日13:33:59
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【入门篇】机器学习算法-Knnhttps://cn-sec.com/archives/663442.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息