机器学习算法之:KNN

基于实例的学习方法中,最近邻法和局部加权回归法用于逼近实值或离散目标函数,基于案例的推理已经被应用到很多任务中,比如,在咨询台上存储和复用过去的经验;根据以前的法律案件进行推理;通过复用以前求解的问题的相关部分来解决复杂的调度问题。
      基于实例方法的一个不足是,分类新实例的开销可能很大。这是因为几乎所有的计算都发生在分类时,而不是在第一次遇到训练样例时。所以,如何有效地索引训练样例,以减少查询时所需计算是一个重要的实践问题。此类方法的第二个不足是(尤其对于最近邻法),当从存储器中检索相似的训练样例时,它们一般考虑实例的所有属性。如果目标概念仅依赖于很多属性中的几个时,那么真正最“相似”的实例之间很可能相距甚远。
      基于实例的学习方法中最基本的是k-近邻算法。这个算法假定所有的实例对应于n维欧氏空间Ân中的点。一个实例的最近邻是根据标准欧氏距离定义的。更精确地讲,把任意的实例x表示为下面的特征向量:
                               <a1(x),a2(x),an(x)>
                   其中ar(x)表示实例x的第r个属性值。那么两个实例xi和xj间的距离定义为d(xi, xj),其中:

使用Python实现过程:

# -* -coding: UTF-8 -* -
import numpy
import operator

class  kNN(object):
    def __init__(self,filename):
        self.filename = filename

    def file_to_matrix(self):
        "the last column is label"
        fp = open(self.filename)
        rows = len(fp.readlines())
        result = numpy.zeros((rows,3))
        labels = []
        fp = open(self.filename)
        index = 0
        for line in fp.readlines():
            fromline = line.strip()
            linesplit = fromline.split(‘\t‘)
            result[index,:] = linesplit[0:3]
            labels.append(linesplit[-1])
            index += 1
        return result,labels

    def data_standard(self,dataset):
        ‘‘‘data standardization
         using  (oldvalue - minvalue)/(maxvalue - minvalue)
         the dataset is a matrix ,result is matrix too
        ‘‘‘
        minvales = dataset.min(0)
        maxvales = dataset.max(0)
        ranges = maxvales - minvales
        m = dataset.shape[0]

        nordataset = dataset - numpy.tile(minvales, (m,1))
        nordataset = nordataset/numpy.tile(ranges, (m,1))

        return nordataset, minvales , ranges

    def knn_classify(self,inputX,dataset,labels,k=3):
        ‘‘‘
            calculation the distance,using ((a1 - b1)^2 + (a2 - b2)^2 + ... + (an - bn)^2)^0.5
        result:
             labels of the kth minimum distance
        ‘‘‘
        rows = dataset.shape[0]
        diffmat = numpy.tile(inputX, (rows , 1)) -dataset
        square_dist =  diffmat ** 2
        "when axis=1 ,then rows sum;when axis=0 ,then cloumns sum;"
        sum_square_dist = square_dist.sum(axis=1)  

        distance = sum_square_dist ** 0.5
        "sorted distance , keep the position"
        sorted_distance = distance.argsort()

        labelcount = {}
        for row in range(k):
            votelabel = labels[sorted_distance[row]]
            labelcount[votelabel] =  labelcount.get(votelabel,0) + 1

        sortedlabels = sorted(labelcount.iteritems() , key=operator.itemgetter(1), reverse=True) 

        return sortedlabels

if __name__ == ‘__main__‘:
    testKNN = kNN(‘.\\datingTestSet.txt‘)
    dataset, labels = testKNN.file_to_matrix()
    nordataset, minvales , ranges=testKNN.data_standard(dataset) 

    fp = open(‘.\\datingTestSet.txt‘)
    rows = len(fp.readlines())
    errorcount = 0 

    fp = open(‘.\\datingTestSet.txt‘)
    for i,line in enumerate(fp.readlines()):
        fromline = line.strip().split(‘\t‘)
        label = fromline[-1]
        inputX = numpy.zeros((1,3))
        inputX[:] = fromline[0:3]

        sortedlabels = testKNN.knn_classify((inputX - minvales) / ranges,nordataset,labels,3)

        if sortedlabels[0][0] == label :
            #print ‘the ‘ + str(i) + ‘ is right \n‘
            pass
        else:
            print ‘the %d record is error‘ %i
            errorcount += 1
    print  ‘error count: %d‘ %errorcount
    print  ‘error ration: %f‘ %(float(errorcount) / rows)

距离加权最近邻算法

k-近邻算法的一个显而易见的改进是对k个近邻的贡献加权,根据它们相对查询点xq的距离,将较大的权值赋给较近的近邻。例如,在表8-1逼近离散目标函数的算法中,我们可以根据每个近邻与xq的距离平方的倒数加权这个近邻的“选举权”。方法是通过用下式的公式来实现:

其中:

为了处理查询点xq恰好匹配某个训练样例xi,从而导致分母为0的情况,我们令这种情况下的 等于f(xi)。如果有多个这样的训练样例,我们使用它们中占多数的分类。

我们也可以用类似的方式对实值目标函数进行距离加权,只要用下式替换公式:

其中wi的定义与公式(8.3)中相同。注意公式(8.4)中的分母是一个常量,它将不同权值的贡献归一化(例如,它保证如果对所有的训练样例xif(xi)=c,那么                        ----->c)。

注意以上k-近邻算法的所有变体都只考虑k个近邻以分类查询点。如果使用按距离加权,那么允许所有的训练样例影响xq的分类事实上没有坏处,因为非常远的实例对    的影响很小。考虑所有样例的惟一不足是会使分类运行得更慢。如果分类一个新的查询实例时考虑所有的训练样例,我们称此为全局(global)法。如果仅考虑最靠近的训练样例,我们称此为局部(local)法。当公式(8.4)的法则被应用为全局法时,它被称为Shepard法(Shepard 1968)。

时间: 2024-12-14 01:19:55

机器学习算法之:KNN的相关文章

scikit-learn中的机器学习算法封装——kNN

接前面 https://www.cnblogs.com/Liuyt-61/p/11738399.html 回过头来看这张图,什么是机器学习?就是将训练数据集喂给机器学习算法,在上面kNN算法中就是将特征集X_train和Y_train传给机器学习算法,然后拟合(fit)出一个模型,然后输入样例到该模型进行预测(predict)输出结果. 而对于kNN来说,算法的模型其实就是自身的训练数据集,所以可以说kNN是一个不需要训练过程的算法. k近邻算法是非常特殊的,可以被认为是没有模型的算法 为了和其

机器学习算法之 KNN(k最近算法)

KNN算法 存在一个训练样本集合,里面有n个训练数据,每个训练数据有m个特征.每个训练数据都标明了相对应的分类.比如: 其中一条数据有四个特征:体重,翼展等,也有相对应的种属. 则KNN算法就是将一条未知种属的数据的每个特征与训练样本集合中的每条数据对应的特征进行比较,然后算法提取样本集合特征最相似数据(最近邻)的分类标签.一般选择样本数据集合中前K个最相似的数据,这就是K-近邻算法中k的出处. 最后选择k个最相似数据中出现次数最多的分类,作为新数据的分类. (可以大概理解为将一条数据与样本中每

机器学习算法&#183;KNN

机器学习算法应用·KNN算法 一.问题描述 验证码目前在互联网上非常常见,从学校的教务系统到12306购票系统,充当着防火墙的功能.但是随着OCR技术的发展,验证码暴露出的安全问题越来越严峻.目前对验证码的识别已经有了许多方法,例如CNN,可以直接输入图片进行识别.验证码分为许多种类,本文以传统的字符验证码作为研究对象,进行图片分割成单一图片作为训练集,构架以测KNN,决策树或者朴素贝叶斯这三个算法为核心的验证码识别算法,进一步体会三个算法的特点. 二.数据准备 2.1数据说明 对于比较简单的字

机器学习算法原理解析——分类

1. KNN分类算法原理及应用 1.1 KNN概述 K最近邻(k-Nearest Neighbor,KNN)分类算法是最简单的机器学习算法. KNN算法的指导思想是“近朱者赤,近墨者黑”,由你的邻居来推断你的类型. 本质上,KNN算法就是用距离来衡量样本之间的相似度. 1.2 算法图示 从训练集中找到和新数据最接近的k条记录,然后根据多数类来决定新数据类别 算法涉及3个主要因素 1) 训练数据集 2) 距离或相似度的计算衡量 3) k的大小 算法描述 1) 已知两类“先验”数据,分别是蓝方块和红

转:机器学习算法原理解析 - 分类

转:http://www.cnblogs.com/swordfall/p/9517988.html 常见分类模型与算法 距离判别法,即最近邻算法KNN: 贝叶斯分类器: 线性判别法,即逻辑回归算法: 决策树: 支持向量机: 神经网络: 1. KNN分类算法原理及应用 1.1 KNN概述 K最近邻(k-Nearest Neighbor,KNN)分类算法是最简单的机器学习算法. KNN算法的指导思想是"近朱者赤,近墨者黑",由你的邻居来推断你的类型. 本质上,KNN算法就是用距离来衡量样本

机器学习算法---KNN

KNN最邻近规则,主要应用领域是对未知事物的识别,即判断未知事物属于哪一类,判断思想是,基于欧几里得定理,判断未知事物的特征和哪一类已知事物的的特征最接近: K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一.该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别.KNN算法中,所选择的邻居都是已经正确分类的对象.该方法在定类决策上只依据最邻近的一个或

机器学习十大算法之KNN(K最近邻,k-NearestNeighbor)算法

机器学习十大算法之KNN算法 前段时间一直在搞tkinter,机器学习荒废了一阵子.如今想重新写一个,发现遇到不少问题,不过最终还是解决了.希望与大家共同进步. 闲话少说,进入正题. KNN算法也称最近邻居算法,是一种分类算法. 算法的基本思想:假设已存在一个数据集,数据集有多个数值属性和一个标签属性,输入一个新数据,求新数据的标签. 步骤如下: 先将新数据拷贝n份,形成一个新的数据集: 逐行计算新数据集与原数据集的距离: 按距离长度排序后,统计前K个数据里,那个标签出现的次数最多,新数据就标记

【机器学习算法实现】kNN算法__手写识别——基于Python和NumPy函数库

[机器学习算法实现]系列文章将记录个人阅读机器学习论文.书籍过程中所碰到的算法,每篇文章描述一个具体的算法.算法的编程实现.算法的具体应用实例.争取每个算法都用多种语言编程实现.所有代码共享至github:https://github.com/wepe/MachineLearning-Demo     欢迎交流指正! (1)kNN算法_手写识别实例--基于Python和NumPy函数库 1.kNN算法简介 kNN算法,即K最近邻(k-NearestNeighbor)分类算法,是最简单的机器学习算

机器学习之近邻算法模型(KNN)

1..导引 如何进行电影分类 众所周知,电影可以按照题材分类,然而题材本身是如何定义的?由谁来判定某部电影属于哪 个题材?也就是说同一题材的电影具有哪些公共特征?这些都是在进行电影分类时必须要考虑的问 题.没有哪个电影人会说自己制作的电影和以前的某部电影类似,但我们确实知道每部电影在风格 上的确有可能会和同题材的电影相近.那么动作片具有哪些共有特征,使得动作片之间非常类似, 而与爱情片存在着明显的差别呢?动作片中也会存在接吻镜头,爱情片中也会存在打斗场景,我们 不能单纯依靠是否存在打斗或者亲吻来