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

使用Python实现过程:

  1. # -* -coding: UTF-8 -* -
  2. import numpy
  3. import operator
  4.  
  5. class kNN(object):
  6. def __init__(self,filename):
  7. self.filename = filename
  8.  
  9. def file_to_matrix(self):
  10. "the last column is label"
  11. fp = open(self.filename)
  12. rows = len(fp.readlines())
  13. result = numpy.zeros((rows,3))
  14. labels = []
  15. fp = open(self.filename)
  16. index = 0
  17. for line in fp.readlines():
  18. fromline = line.strip()
  19. linesplit = fromline.split('\t')
  20. result[index,:] = linesplit[0:3]
  21. labels.append(linesplit[-1])
  22. index += 1
  23. return result,labels
  24.  
  25. def data_standard(self,dataset):
  26. '''data standardization
  27. using (oldvalue - minvalue)/(maxvalue - minvalue)
  28. the dataset is a matrix ,result is matrix too
  29. '''
  30. minvales = dataset.min(0)
  31. maxvales = dataset.max(0)
  32. ranges = maxvales - minvales
  33. m = dataset.shape[0]
  34.  
  35. nordataset = dataset - numpy.tile(minvales, (m,1))
  36. nordataset = nordataset/numpy.tile(ranges, (m,1))
  37.  
  38. return nordataset, minvales , ranges
  39.  
  40. def knn_classify(self,inputX,dataset,labels,k=3):
  41. '''
  42. calculation the distance,using ((a1 - b1)^2 + (a2 - b2)^2 + ... + (an - bn)^2)^0.5
  43. result:
  44. labels of the kth minimum distance
  45. '''
  46. rows = dataset.shape[0]
  47. diffmat = numpy.tile(inputX, (rows , 1)) -dataset
  48. square_dist = diffmat ** 2
  49. "when axis=1 ,then rows sum;when axis=0 ,then cloumns sum;"
  50. sum_square_dist = square_dist.sum(axis=1)
  51.  
  52. distance = sum_square_dist ** 0.5
  53. "sorted distance , keep the position"
  54. sorted_distance = distance.argsort()
  55.  
  56. labelcount = {}
  57. for row in range(k):
  58. votelabel = labels[sorted_distance[row]]
  59. labelcount[votelabel] = labelcount.get(votelabel,0) + 1
  60.  
  61. sortedlabels = sorted(labelcount.iteritems() , key=operator.itemgetter(1), reverse=True)
  62.  
  63. return sortedlabels
  64.  
  65. if __name__ == '__main__':
  66. testKNN = kNN('.\\datingTestSet.txt')
  67. dataset, labels = testKNN.file_to_matrix()
  68. nordataset, minvales , ranges=testKNN.data_standard(dataset)
  69.  
  70. fp = open('.\\datingTestSet.txt')
  71. rows = len(fp.readlines())
  72. errorcount = 0
  73.  
  74. fp = open('.\\datingTestSet.txt')
  75. for i,line in enumerate(fp.readlines()):
  76. fromline = line.strip().split('\t')
  77. label = fromline[-1]
  78. inputX = numpy.zeros((1,3))
  79. inputX[:] = fromline[0:3]
  80.  
  81. sortedlabels = testKNN.knn_classify((inputX - minvales) / ranges,nordataset,labels,3)
  82.  
  83. if sortedlabels[0][0] == label :
  84. #print 'the ' + str(i) + ' is right \n'
  85. pass
  86. else:
  87. print 'the %d record is error' %i
  88. errorcount += 1
  89. print 'error count: %d' %errorcount
  90. 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)。

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

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

    接前面 https://www.cnblogs.com/Liuyt-61/p/11738399.html 回过头来看这张图,什么是机器学习?就是将训练数据集喂给机器学习算法,在上面kNN算法中就是将特 ...

  2. 机器学习算法之——KNN、Kmeans

    一.Kmeans算法 kmeans算法又名k均值算法.其算法思想大致为:先从样本集中随机选取 kk 个样本作为簇中心,并计算所有样本与这 kk 个“簇中心”的距离,对于每一个样本,将其划分到与其距离最 ...

  3. 机器学习算法·KNN

    机器学习算法应用·KNN算法 一.问题描述 验证码目前在互联网上非常常见,从学校的教务系统到12306购票系统,充当着防火墙的功能.但是随着OCR技术的发展,验证码暴露出的安全问题越来越严峻.目前对验 ...

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

    机器学习十大算法之KNN算法 前段时间一直在搞tkinter,机器学习荒废了一阵子.如今想重新写一个,发现遇到不少问题,不过最终还是解决了.希望与大家共同进步. 闲话少说,进入正题. KNN算法也称最 ...

  5. 机器学习十大算法 之 kNN(一)

    机器学习十大算法 之 kNN(一) 最近在学习机器学习领域的十大经典算法,先从kNN开始吧. 简介 kNN是一种有监督学习方法,它的思想很简单,对于一个未分类的样本来说,通过距离它最近的k个" ...

  6. 机器学习之K近邻算法(KNN)

    机器学习之K近邻算法(KNN) 标签: python 算法 KNN 机械学习 苛求真理的欲望让我想要了解算法的本质,于是我开始了机械学习的算法之旅 from numpy import * import ...

  7. 机器学习实战 之 KNN算法

    现在 机器学习 这么火,小编也忍不住想学习一把.注意,小编是零基础哦. 所以,第一步,推荐买一本机器学习的书,我选的是Peter harrigton 的<机器学习实战>.这本书是基于pyt ...

  8. 机器学习实战(Machine Learning in Action)学习笔记————02.k-邻近算法(KNN)

    机器学习实战(Machine Learning in Action)学习笔记————02.k-邻近算法(KNN) 关键字:邻近算法(kNN: k Nearest Neighbors).python.源 ...

  9. 机器学习:K-近邻算法(KNN)

    机器学习:K-近邻算法(KNN) 一.KNN算法概述 KNN作为一种有监督分类算法,是最简单的机器学习算法之一,顾名思义,其算法主体思想就是根据距离相近的邻居类别,来判定自己的所属类别.算法的前提是需 ...

随机推荐

  1. Hibernate集合映射

    可以在Hibernate中映射持久类的集合元素. 您需要从以下类型之一声明持久类中的集合类型: java.util.List java.util.Set java.util.SortedSet jav ...

  2. Python Socket 网络编程 (客户端的编程)

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...

  3. xxxxxxclub系统模块分类

    不是分析整个程序执行的过程. 分析程序在设计的时候模块怎样分类 针对的是应用程序,name 类的装载:1. Spring配置 基于接口调用hsf 3. 一个页面相应的java类 Spring的xml文 ...

  4. ios -将navigationbar的translucent属性设为No后,子控制器视图整体下移问题

    如果不将navigationbar.translucent = YES 会觉得颜色很浅,因为这是半透明状态 若navigationbar.translucent = NO,颜色问题解决,但是子控制器视 ...

  5. spring-security+hibernate4+quartz实现的心跳检测项目(转 收藏)

    转自:http://www.52itstyle.com/thread-27470-1-1.html HeartBeat. ~2 Z8 U! ?8 r心跳检测各类应用服务器(如Tomcat,Jetty) ...

  6. okhttp 通过网关请求服务端返回数据

    1.启动类代码 package com.tycoon.service; import org.springframework.boot.SpringApplication; import org.sp ...

  7. html5离线缓存使用

    html5 离线缓存使用以及注意事项 1.index.html中加入离线缓存的声明文件 如:<!DOCTYPE html><html manifest="test.appc ...

  8. python发送邮件(yagmail模块)

    import yagmail user = 'xxxx@qq.com' passwd = 'xxxx' # 授权码,不是密码,需要在邮箱中设置,看邮箱类型,有的需要设置 res = yagmail.S ...

  9. Introduction to Mathematical Thinking - Week 6 - Proofs with Quantifieers

    Mthod of proof by cases 证明完所有的条件分支,然后得出结论. 证明任意 使用任意 注意,对于一个任意的东西,你不知道它的具体信息.比如对于任意正数,你不知道它是 1 还是 2等 ...

  10. Lucene索引数计算

    Elasticsearch默认在创建索引结束时得到5个分片及1个副本: 分片是有0-n个副本,“5个分片及1个副本”即“5个分片及5个相应分片副本”:共10个Lucene索引 副本数:指的是“单个分片 ...