【技术君啃书之旅】web安全之机器学习入门 第五章笔记

这章零零散散花费了好久(吐槽毕业典礼真的是忙到吐血啊!!!!),感觉兜哥跳跃的有点厉害,直接进入了算法与场景结合,没有什么关于K近邻算法的数学介绍,而我作为一个机器学习的小萌新,只能先去搜索一些关于K近邻算法的知识了。

在搜索的过程中,发现一篇写的特别特别特别好的文章,强烈推荐!!!

Python3《机器学习实战》学习笔记(一):k-近邻算法(史诗级干货长文)

建议阅读完上述这篇文章,再继续下面的阅读

阅读完上述文章后,我们可以将KNN的一般流程简单总结如下:

  • 收集数据:可以使用爬虫进行数据的收集,也可以使用第三方提供的免费或收费的数据。一般来讲,数据放在txt文本文件中,按照一定的格式进行存储,便于解析及处理。
  • 准备数据:使用Python解析、预处理数据。
  • 分析数据:可以使用很多方法对数据进行分析,例如使用Matplotlib将数据可视化。
  • 测试算法:计算错误率。
  • 使用算法:错误率在可接受范围内,就可以运行k-近邻算法进行分类。

K近邻算法-手写文字分类实验

本小节为基于上述文章的自我实验片段,如果未看完上述文章,或者对KNN已经有一定了解,可以跳过这一小节,直接阅读后续小节

K近邻-KNN-k Nearest Neighbors

数据集下载

在通篇阅读完之后,我对手写文字分类算法尝试自己进行编写代码,我的思路如下:

  1. 数据集是32*32的,因为这里我们选择用欧几里得距离来算距离,我们必须得将其转成一维的数组,所以将32*32的数组转成1*1024的数组;
  2. 正常来说,我们接下来需要计算,预测集的第一个数据与所有训练集的数据的欧几里得距离,选择K个(K自己决定)距离最近的数据,找到这K个数据中最多的那个,判断此预测数据就为该数据,接下来循环计算所有的预测集数据;
  3. 由于这里直接使用python的sklearn库自带的KNN算法函数,所以我们只需要配置一下参数,之后根据预测的准确率调整参数即可

代码如下:

# -*- coding: UTF-8 -*-
'''
Desprition:
    这段代码使用了KNN算法来对手写数字进行数值判断

Author:
    Sp4rkW   https://sp4rkw.blog.csdn.net/

Modify:2019-06-07 18:43:14
'''

from sklearn.neighbors import KNeighborsClassifier
import numpy,os


'''
Desprition:
    这个函数用来将某个手写数字的txt文件转化为1*1024的数组

Parameters:
    txt文件路径

Returns:
    1*1024数组

Modify:2019-06-09 10:31:54
'''
def ConductImg(filepath):
    TainingList = []
    with open(filepath,"r") as target:
        lines = target.read().replace("\n","")
        demo = [int(x) for x in lines] #列表推导式
        TainingList += demo
    # print(TainingList)
    return numpy.mat(TainingList)#将列表转换为numpy矩阵格式
    

'''
Desprition:
    这个函数用来进行训练以及进行预测

Parameters:
    Null

Returns:
    Null

Modify:2019-06-09 11:14:35
'''
def NumberClassfy():
    dirlist = os.listdir("./trainingDigits/")
    
    target = [x[0:1] for x in dirlist]
    dirlen = len(target)
    
    TainingNumpy = numpy.zeros((dirlen,1024))
    for x in range(dirlen):
        TainingNumpy[x,:] = ConductImg("./trainingDigits/"+dirlist[x])
    
    #KNN训练
    KNN = KNeighborsClassifier(n_neighbors=3)
    KNN.fit(TainingNumpy,target)

    dirlist2 = os.listdir("./testDigits/")
    
    target2 = [x[0:1] for x in dirlist2]
    dirlen2 = len(target2)
    
    errorCount = 0.0
    for x in range(dirlen2):
        PredictData = KNN.predict(ConductImg("./testDigits/"+dirlist2[x]))#KNN预测
        print("真实结果为: {} /t 预测结果为: {}".format(target2[x],PredictData[0]))
        if(target2[x] != PredictData[0]):
            errorCount += 1
    

    print("错误率为: {}".format(errorCount/float(dirlen2)))



if __name__ == "__main__":
    NumberClassfy()

整个代码的备注写的十分详细,大家可以自行读代码,建议一定要去练一练,我练习编写这段代码的过程中,有了如下的收获:

  1. 可以使用列表推导式简化for循环代码
  2. 从txt文本中读取出来的数字都是str类型,一定要在读取后进行类型转化,否则会有大量如下所示的警告
  3. 基于sklearn的KNN算法,在训练和预测的时候,都需要将数据转成numpy矩阵形式才能进行计算,一维list,二维list均不可以用于计算
  4. 基于sklearn的KNN算法的基本函数调用操作

使用K近邻检测Linux命令操作异常

从这一节开始,我们回归到书籍,Schonlau提供的数据下载路径

Masquerading User Data

其实这章后面还有很多,不过我决定暂时不写了,因为我觉得我目前有点知其然又不知其所以然了

听从实验室师兄以及圈内大佬们的意见,我决定先去学一段时间的深度学习,之后再回来继续看

发布了168 篇原创文章 · 获赞 344 · 访问量 72万+

猜你喜欢

转载自blog.csdn.net/wy_97/article/details/94317335