这章零零散散花费了好久(吐槽毕业典礼真的是忙到吐血啊!!!!),感觉兜哥跳跃的有点厉害,直接进入了算法与场景结合,没有什么关于K近邻算法的数学介绍,而我作为一个机器学习的小萌新,只能先去搜索一些关于K近邻算法的知识了。
在搜索的过程中,发现一篇写的特别特别特别好的文章,强烈推荐!!!
Python3《机器学习实战》学习笔记(一):k-近邻算法(史诗级干货长文)
建议阅读完上述这篇文章,再继续下面的阅读
阅读完上述文章后,我们可以将KNN的一般流程简单总结如下:
- 收集数据:可以使用爬虫进行数据的收集,也可以使用第三方提供的免费或收费的数据。一般来讲,数据放在txt文本文件中,按照一定的格式进行存储,便于解析及处理。
- 准备数据:使用Python解析、预处理数据。
- 分析数据:可以使用很多方法对数据进行分析,例如使用Matplotlib将数据可视化。
- 测试算法:计算错误率。
- 使用算法:错误率在可接受范围内,就可以运行k-近邻算法进行分类。
K近邻算法-手写文字分类实验
本小节为基于上述文章的自我实验片段,如果未看完上述文章,或者对KNN已经有一定了解,可以跳过这一小节,直接阅读后续小节
K近邻-KNN-k Nearest Neighbors
在通篇阅读完之后,我对手写文字分类算法尝试自己进行编写代码,我的思路如下:
- 数据集是
32*32
的,因为这里我们选择用欧几里得距离来算距离,我们必须得将其转成一维的数组,所以将32*32
的数组转成1*1024的数组; - 正常来说,我们接下来需要计算,预测集的第一个数据与所有训练集的数据的欧几里得距离,选择K个(K自己决定)距离最近的数据,找到这K个数据中最多的那个,判断此预测数据就为该数据,接下来循环计算所有的预测集数据;
- 由于这里直接使用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()
整个代码的备注写的十分详细,大家可以自行读代码,建议一定要去练一练,我练习编写这段代码的过程中,有了如下的收获:
- 可以使用列表推导式简化for循环代码
- 从txt文本中读取出来的数字都是str类型,一定要在读取后进行类型转化,否则会有大量如下所示的警告
- 基于sklearn的KNN算法,在训练和预测的时候,都需要将数据转成numpy矩阵形式才能进行计算,一维list,二维list均不可以用于计算
- 基于sklearn的KNN算法的基本函数调用操作
使用K近邻检测Linux命令操作异常
从这一节开始,我们回归到书籍,Schonlau提供的数据下载路径
其实这章后面还有很多,不过我决定暂时不写了,因为我觉得我目前有点知其然又不知其所以然了
听从实验室师兄以及圈内大佬们的意见,我决定先去学一段时间的深度学习,之后再回来继续看