zoukankan      html  css  js  c++  java
  • 《机器学习实战》之k-近邻算法(示例)

    看了这本书的第一个算法—k-近邻算法,这个算法总体构造思想是比较简单的,在ACM当中的话就对应了kd树这种结构。首先需要给定训练集,然后给出测试数据,求出训练集中与测试数据最相近的k个数据,根据这k个数据的属性来确定我们测试数据的属性。

    书上的例子是给了四个点以及这四个点的标签,分别是A,A,B,B,现在给定一测试点,需要根据这四个训练集来判断该测试点的标签应该是A还是B。

     1 from numpy import *
     2 import operator
     3 
     4 def createDataSet():
     5     group = array([[1.0,1.1], [1.0,1.0], [0,0], [0,0.1]])
     6     labels = ['A', 'A', 'B', 'B']
     7     return group, labels
     8 
     9 def classify0(inX, dataSet, labels, k):
    10     dataSetSize = dataSet.shape[0]
    11     diffMat = tile(inX, (dataSetSize,1)) - dataSet  #统一矩阵,实现加减
    12     sqDiffMat = diffMat**2
    13     sqDistances = sqDiffMat.sum(axis=1)  #进行累加,axis=0是按列,axis=1是按行
    14     distances = sqDistances**0.5  #开根号
    15     sortedDistIndicies = distances.argsort()  #按升序进行排序,返回原下标
    16     classCount = {}
    17     for i in range(k):
    18         voteIlabel = labels[sortedDistIndicies[i]]
    19         classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1  #get是字典中的方法,前面是要获得的值,后面是若该值不存在时的默认值
    20     sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
        #在python3中没有iteritems,key在这里是按照字典的第二个元素来排序,降序排序
    21 return sortedClassCount[0][0] #获得字典中第一对映射中的第一个值 22 23 24 if __name__ == "__main__": 25 dataSet, labels = createDataSet() 26 inX = [0.2, 0.2] 27 print(classify0(inX, dataSet, labels, 2))

    代码详解:

    ①array

    这是numpy库中,它就是用来构造矩阵的:

    1 from numpy import array
    2 
    3 a = array([[1,1],
    4            [2,3]])
    5 b = array([[0,1],
    6            [3,2]])
    7 c = a-b
    8 print(c)

    ②tile()函数

    tile(A,repes)返回shape = repes的矩阵,每个元素是A

    1 from numpy import tile
    2 
    3 a = [1,2,3]
    4 b = tile(a,(2,3))
    5 print(b)

    ③argsort()

    按序排列,返回原始下标

    1 from numpy import argsort
    2 
    3 a = [4,3,1,2]
    4 b = argsort(a)
    5 print(b)

  • 相关阅读:
    perl中shift 和unshift 操作
    Perl 关于 use strict 的用法
    Windows7鼠标右键里没有新建文本文件的选项,解决办法
    大唐笔试题
    常用的设计模式
    优化C++程序编译效率的一些方法
    TCP连接,传输数据时的粘包问题讨论
    单链表是否有环及环入口点
    构造函数和析构函数能否声明为虚函数?
    azkaban 执行hive语句
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/8438665.html
Copyright © 2011-2022 走看看