【机器学习】2——K近邻算法

-- coding: utf-8 -- #中文注释记得加这句话

from numpy import * #导入numpy包 用import numpy 也可以,但是之后的使用其中的函数时前边必须加上numpy.方法名,
from operator import * #导入运算模块

创建数据集

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 #返回数据集(数组)和标签(列表)

k-近邻算法

“”“”
inX: 用于分类的输入向量
dataSet:训练样本集
labels: 标签向量
k: 选择的最近邻居数目
“””
def classify0(inX, dataSet, labels, k):
#计算距离
dataSetSize = dataSet.shape[0] #dataSetSize为dataSet的行数
diff = tile(inX,(dataSetSize,1)) - dataSet #扩展输入向量,方便计算每一个数据到该向量的距离
sqDiff = diff ** 2 #数组每个元素进行平方
sqDistances = sqDiff.sum(axis=1)#求该数组的行和
distances = sqDistances ** 0.5 #为每行元素进行开方 即求出了每个数据和输入数据的距离
sortedDistIndicies = distances.argsort() #为该距离数组进行升序排序 返回排序结果的下标值

#确定k个点并计算其频率
classCount = {}  #声明一个统计K个数据中类别与相应个数的字典
for i in range(k): #i从0到k-1进行循环
    votelabel = labels[sortedDistIndicies[i]] #找到i对应下标的类别
    classCount[votelabel] = classCount.get(votelabel,0)+1 #该类别如果在字典中存在,则取出其值后加1 如果不存在取默认值再+1
sortedClassCount = sorted(classCount.items(),key=itemgetter(1),reverse=True)#将字典返回为元祖列表 并依据其第二个元素进行降序排序
return sortedClassCount[0][0]  #返回频率最高元祖的第一个量即标签

代码注解:

【1】shape[0] 计算矩阵的行数,shape[1]计算矩阵的列数
【2】tile 数组inX以dataSetSize行1列重复,例如:intX 为[0, 0],则tile计算后
[0, 0]
[0, 0]
[0, 0]
[0, 0]
….. dataSetSize行
【3】** 是指次方, diffMat**2 为diffMat的平方, 比如[1, 2]**2 = [1, 4]
【4】sqDiffMat.sum(axis=1) 指array中每行元素的和,这些和再组成一个array:
  例如: >>>a = array([[1, 2], [2, 4]])
    >>>s = a.sum(axis=1)
    >>>s
    array([3, 6])
    >>>a = array([[1, 2, 3], [2, 3, 4]])
    >>>s = a.sum(axis=1)
    >>>s
    array([6, 9])
  但是如果array只有一行,例如array([1, 2]), 则不能用sum(axis=1),只能用sum()
【5】classCount = {}新建一个dict, dict提供的get方法,如果key不存在,可以返回None,或者自己指定的value,这里classCount.get(voteIlabel, 0)是指不存在相对应key值的value则返回0
  例如:   >>> d = {‘Michael’: 95, ‘Bob’: 75, ‘Tracy’: 85}
        >>> d[‘Michael’]
       95
       >>> d[‘Thomas’]
       Traceback (most recent call last):
         File “”, line 1, in
       KeyError: ‘Thomas’
  要避免key不存在的错误,有两种办法,一是通过in判断key是否存在:
      >>> ‘Thomas’ in d
      False
  二是通过dict提供的get方法,如果key不存在,可以返回None,或者自己指定的value:
      >>> d.get(‘Thomas’)
      >>> d.get(‘Thomas’, -1)
      -1
【6】sorted() 按classCount字典的第2个元素(即类别出现的次数)从大到小排序

发布了6 篇原创文章 · 获赞 6 · 访问量 8365

猜你喜欢

转载自blog.csdn.net/u011969000/article/details/82256788