机器学习实战——kNN分类器

惰性学习法:简单的存储数据,一直等待,直到给定一个测试元组时才进行泛化,根据对存储的元组的相似性进行分类。kNN(k近邻)分类方法于20世纪50年代提出,由于计算密集型算法,因此到60年代之后随着计算能力增强后才逐步应用。

kNN基于类比学习,将给定的测试元组表示为n维空间中的一个点,n代表属性数目。然后使用某种距离度量方式来寻找与给定测试元组最近的k个训练元组,对这个k个训练元组的类别进行统计,返回类别数目多的类别作为未知测试元组的类别。

常用的距离度量就是欧几里得距离,也称为二范数。同时为了减小不同属性值的取值范围对距离计算的影响,一般使用最大-最小规范化将属性值都变换到[0,1]区间。

根据上述特性,可知kNN算法最适合应用在数值型属性上,对于序数型属性可以变换为数值型,标称型属性规范化后也比较好,但是二元属性则可能效果不是太好。主要优缺点:

优点:精度高,对噪声不敏感,无需数据输入假定

缺点:时间和空间复杂度高,需要确定k值(k值的确定可能需要很多经验)

下面是使用《机器学习实战》一书中的kNN算法对一个垃圾邮件的数据进行实际分类的实现。这个数据共有3065个训练样本,1536个测试样本。每个样本使用了57个特征,特征中有数值型数据和二元属性,类别标号为{0,1},0表示不是垃圾邮件,1表示是垃圾邮件。

首先是从文件读取数据:

def loadDataSet(fp):
    if os.path.exists(fp):
        try:
            fh = open(fp, 'r')
            rtnTrainSet = zeros((TRAINSET_NUM, FEATURES_NUM))
            trainLabel = []
            rtnTestSet = zeros((TESTSET_NUM, FEATURES_NUM))
            testLabel = []
            i = 0
            for line in fh:
                line = line.strip()
                terms = line.split(',')
                if i < TRAINSET_NUM:
                    rtnTrainSet[i,:] = terms[0:FEATURES_NUM]
                    trainLabel.append(int(terms[FEATURES_NUM]))
                    i += 1
                else:
                    rtnTestSet[i - TRAINSET_NUM, :] = terms[0:FEATURES_NUM]
                    testLabel.append(int(terms[FEATURES_NUM]))
                    i += 1
        except Exception, msg:
            print 'An unexcepted error occur: ', msg
        finally:
            fh.close()
        return rtnTrainSet,trainLabel,rtnTestSet,testLabel
    else:
        print "The data file does not exists!"
        return None

文件每一行代表一个样本,各特征使用逗号分隔,最后一个字段为类别标号。这里面使用的是Numpy这个第三方库存储数据到矩阵中。

然后是数据的规范化处理,规范化到[0,1]区间。

def normalize(ds):
    minVals = ds.min(0)
    maxVals = ds.max(0)
    ranges = maxVals - minVals
    normDS = zeros(shape(ds))
    n = ds.shape[0]
    normDS = ds - tile(minVals, (n, 1))
    normDS = normDS / tile(ranges, (n, 1))
    return normDS

最后,分类器的实现就是将每个待测试的样本输入,使用训练样本计算最近的k个邻居然后得出最多的类别。

def kNNclassify(ds, labels, k, inputX):
    dsSize = ds.shape[0]
    diff = tile(inputX, (dsSize, 1)) - ds
    sqDiff = diff ** 2
    sqDist = sqDiff.sum(axis = 1)
    dist = sqDist ** 0.5
    sortedDist = dist.argsort()
    classCount = {}
    for i in range(k):
        votedLabel = labels[sortedDist[i]]
        classCount[votedLabel] = classCount.get(votedLabel, 0) + 1
    sortedClassCount = sorted(classCount.iteritems(),
                              key = operator.itemgetter(1),reverse = True)
    return sortedClassCount[0][0]

对1536个测试数据进行分类,同时使用不同的k值,得到不同k值分类的准确率,绘制了如下的图表:

从图中可以看出当k为10的时候精确度为75%为最高,这个结果并不是太好,主要原因是垃圾邮件的57个特征中有部分二元属性,当使用kNN进行分类计算距离时会有较大影响。

最后使用k=10对训练集也进行测试,得到如下结果。

Train Accuracy: 0.9282

时间: 2024-10-25 14:43:25

机器学习实战——kNN分类器的相关文章

【读书笔记】机器学习实战-kNN(1)

k临近算法(kNN)采用测量不同特征值之间的距离方法进行分类,也是一种非常直观的方法.本文主要记录了使用kNN算法改进约会网站的例子. 任务一:分类算法classify0 就是使用距离公式计算特征值之间的距离,选择最邻近的k个点,通过统计这k个点的结果来得出样本的预测值. tile函数用法在这里 argsort函数在这里 def classify0(inX,dataset,labels,k): #shape 返回行列数,shape[0]是行数,有多少元组 datasetsize = datase

机器学习实战-----八大分类器识别树叶带源码

今天我想送给大家两句话:1:在这个浮躁的社会中,每个人都想找到捷径,那么我想认真踏实地做好一件事也便是最大的捷径了.2:不要管别人做什么,有自己的目标,可能你现在的环境牛人多多,让你压力巨大,也可能你身处的环境废物多多,让你感慨你本可以让自己更加强大.不要管这些,只要相信自己选择的,走下去. 以上献给迷茫的人们,同时也自勉.不多说,进入八大分类器. 引言:树叶有好多种,如下图: 目标:写一个系统,让系统区分各种树叶属于哪个品种. 我的思路如下图: 特征提取:也就是我们前几张说的x i ,抽取能代

机器学习实战knn

最近在学习这本书,按照书上的实例编写了knn.py的文件,使用canopy进行编辑,用shell交互时发现运行时报错: >>> kNN.classify0([0,0],group,labels,3) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'kNN' is not defined 运行的代码如下: from nu

机器学习实战- KNN

KNN:k近邻算法-在训练样本中找到与待测样本距离相近的N个样本,并用这N个样本中所属概率最大的类别作为待测样本的类别. 算法步骤: 1.对训练中的样本数据的不同属性进行归一化处理. 2.计算待测样本到训练样本集中的距离.(欧拉距离或曼哈顿距离): 3.找到N个距离最小的样本属于不同类别的概率. 4.取最大的概率作为待测样本的类别. 例子1: 相亲 相亲考虑的条件: 1) 每年飞行公里 2) 每周打的游戏时长 3)每周消耗的ice cream 态度用1,2,3表示:1表示little like

《机器学习实战》读书笔记2:K-近邻(kNN)算法

声明:文章是读书笔记,所以必然有大部分内容出自<机器学习实战>.外加个人的理解,另外修改了部分代码,并添加了注释 1.什么是K-近邻算法? 简单地说,k-近邻算法采用测量不同特征值之间距离的方法进行分类.不恰当但是形象地可以表述为近朱者赤,近墨者黑.它有如下特点: 优点:精度高.对异常值不敏感.无数据输入假定 缺点:计算复杂度高.空间复杂度高 适用数据范围:数值型和标称型 2.K-近邻算法的工作原理: 存在一个样本数据集合,也称作训练样本集,并且样本集中的每个数据都存在标签,即我们知道样本集中

机器学习实战之kNN算法

机器学习实战这本书是基于python的,如果我们想要完成python开发,那么python的开发环境必不可少: (1)python3.52,64位,这是我用的python版本 (2)numpy 1.11.3,64位,这是python的科学计算包,是python的一个矩阵类型,包含数组和矩阵,提供了大量的矩阵处理函数,使运算更加容易,执行更加迅速. (3)matplotlib 1.5.3,64位,在下载该工具时,一定要对应好python的版本,处理器版本,matplotlib可以认为是python

机器学习实战笔记——基于KNN算法的手写识别系统

本文主要利用k-近邻分类器实现手写识别系统,训练数据集大约2000个样本,每个数字大约有200个样本,每个样本保存在一个txt文件中,手写体图像本身是32X32的二值图像,如下图所示: 首先,我们需要将图像格式化处理为一个向量,把一个32X32的二进制图像矩阵通过img2vector()函数转换为1X1024的向量: def img2vector(filename): returnVect = zeros((1,1024)) fr = open(filename) for i in range(

《机器学习实战》--KNN

代码来自<机器学习实战>https://github.com/wzy6642/Machine-Learning-in-Action-Python3 K-近邻算法(KNN) 介绍 简单地说,k-近邻算法采用测量不同特征值之间的距离方法进行分类. 优点:精度高.对异常值不敏感,无数据输入假定. 缺点:计算复杂度高.空间复杂度高,无法给出数据的内在含义. 使用数据范围:数值型.标称型. 分类函数的伪代码: 对未知类别属性的数据集中的每个点依次执行以下操作: (1)计算已知类别数据集中的点与当前点之间

机器学习实战之kNN

笔者最近开始对机器学习非常感兴趣,作为一个有志向的软设方向的女孩纸,我开始了学习的第一步入门,下面将今天刚刚学习的kNN及其应用进行总结和回顾,希望可以得到更好的提升,当然,有志同道合者,你可以联系我给我留言,毕竟菜鸟一起飞才能飞的更高更远.?? 首先,kNN算法也叫k-近邻算法,它的工作原理是:存在一个样本的数据集合,也称作训练样本集,并且每个样本集都有其标签.故而,我们很清楚每一数据和其所属分类之间的关系.当输入新样本时,我们将新数据的每一个特征样本集中对应的数据特征进行比较,然后算法提取特