《机器学习实战》——kNN算法

    技术2023-10-27  110

    学习笔记

    示例0:kNN入门

    步骤

    新建kNN.py文件

    在kNN.py文件中导入相关包

    from numpy import * import operator

    在kNN.py文件中编写生成数据集的函数

    def createDataSet(): group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]) labels = ['A','A','B','B'] return group,labels

    在kNN.py文件中编写kNN分类算法

    def classify0(inX,dataSet,labels,k): dataSetSize = dataSet.shape[0] diffMat = tile(inX, (dataSetSize,1)) - dataSet sqDiffMat = diffMat**2 sqDistances = sqDiffMat.sum(axis=1) distances = sqDistances**0.5 sortedDistIndicies = distances.argsort() classCount={} for i in range(k): voteIlabel = labels[sortedDistIndicies[i]] classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 sortedClassCount = sorted(classCount.items(), key = operator.itemgetter(1), reverse=True) return sortedClassCount[0][0]

    在IDLE中导入kNN.py文件

    执行生成数据集函数

    执行分类算法

    >>> import kNN >>> group,labels = kNN.createDataSet() >>> kNN.classify0([0,0],group,labels,3) 'B' >>> kNN.classify0([3,0],group,labels,3) 'A'

    示例1:使用kNN算法改进约会网站的配对效果

    准备数据

    在kNN.py文件中编写file2matrix函数把文本转成numpy数组对象

    分析数据

    使用matplotlib制作原始数据的散点图,使用到的命令如下

    >>> import matplotlib >>> import matplotlib.pyplot as plt >>> fig = plt.figure() >>> ax = fig.add_subplot() >>> ax.scatter(datingDataMat[:,1],datingDataMat[:,2]) >>> plt.show()

    为了区分样本分类,在调用scatter函数时添加两个参数。得到彩色散点图

    >>>ax.scatter(datingDataMat[:,1],datingDataMat[:,2],15.0*array(datingLabels),15.0*array(datingLabels))

    准备数据——归一化数值

    将数字特征值转化为0到 1的区间

    现在kNN.py文件中编写归一化函数autoNorm( )

    重新加载kNN.py模块,执行归一化函数

    4. 测试算法——作为完整程序验证分类器

    先在kNN.py文件中编写测试函数

    重载kNN模块,测试算法的出错率(本地得到的出错率为5%) 5.使用算法

    编写完整执行的函数(分类器)

    重新加载kNN模块,调用分类器

    示例2:使用kNN算法识别手写数字

    ​ 运行测试函数,得到的出错率约为1%

    遇到的问题及解决方案

    错误1:‘dict’ object has no attribute 'iteritems’

    ​ iteritems是为python2环境中dict的函数,在python3环境中为items。所以将iteritems改为items即可。

    错误2:NameError: name ‘reload’ is not defined

    ​ 重新加载python文件:

    ​ 在python2中reload( xxx )

    ​ 在python3.3及以下import imp imp.reload( xxx )

    ​ 在python3.3以上import importlib importlib.reload( xxx )

    错误3:No module named 'matplotlib’

    ​ cmd命令窗口输入pip install matplotlib

    错误4:NameError: name ‘raw_input’ is not defined

    ​ python3.0版本后用input替换了raw_input

    错误5:NameError: name ‘listdir’ is not defined

    ​ 在kNN文件中import os , 然后把listdir()改写成 os.listdir()

    【注】导入指定路径的python模块

    import sys sys.path.append('D:/software/python/note/testpy1/test1') #跳转到模块所在目录 import xxx #导入模块

    Processed: 0.012, SQL: 9