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

学习笔记

示例0:kNN入门

步骤

  1. 新建kNN.py文件

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

    from numpy import *
    import operator
    
  3. 在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
    
  4. 在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]
    
  5. 在IDLE中导入kNN.py文件

  6. 执行生成数据集函数

  7. 执行分类算法

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

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

  1. 准备数据

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

在这里插入图片描述

  1. 分析数据

    使用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))

在这里插入图片描述

  1. 准备数据——归一化数值

    将数字特征值转化为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	#导入模块

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值