《机器学习实战》详细读书笔记...KNN算法

#第二章 KNN算法
KNN算法又名K-近邻算法,这是我接触的第一个机器学习算法,非常有效且易于掌握。简单的来说它是通过测量不同特征值之间的距离来进行分类。它具体的工作机制为:

给定测试样本,基于某种距离度量法则找出训练集中与其最靠近的k个训练样本,然后基于这k个“邻居”的信息进行预测,通常在分类任务当中使用“投票法”,即选择这k个样本当中出现最多的类别标记作为预测结果,在回归任务当中可以使用“平均法”,即将k个样本的实值输出标记的平均值作为预测结果,还可以基于距离的远近进行加权平均或者加权投票,距离越近的样本权重越大。

k 近邻算法的输入为实例的特征向量,对应于特征空间的点;输出为实例的类别,可以取多类。k 近邻算法实际上利用训练数据集对特征向量空间进行划分,并作为其分类的“模型”。 k值的选择、距离度量以及分类决策规则是k近邻算法的三个基本要素。显然k近邻算法在训练阶段只保存样本不进行学习,训练的开销时间为0,只有收到测试样本才开始进行学习。

对于该算法在二分类任务的泛化错误率不会超过贝叶斯最优分类器的错误率两倍!简略的证明见西瓜书Page 226。

##1.KNN原理
###1.1KNN分类算法思想

对输入的未知类别属性的数据集中的每个点依次执行以下的操作:
1.计算已知类别数据集中的点与当前点之间的距离
2.按照距离递增次序排序
3.选取与当前点距离最小的k个点
4.统计k个点所在类别的出现频率
5.返回前k个点出现频率最高的类别作为当前点的预测分类

kNN近邻算法的输入样例createDataSet():

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

kNN近邻算法用python函数classify0()表示如下:

def classify0(inX,dataSet,labels,k):
    """
    description: 计算当前点和已知数据集中的点的距离,选取升序排序之后选取距离最小的
    K个点,统计k个点最多的所属类别作为预测类别
    :param inX: 目标向量
    :param dataSet: 已知类别的数据集
    :param labels: 类别
    :param k: 距离最短的k个点
    :return: 该目标向量可能属于的一个类别
    """
    # 取得数据集矩阵的行数,shape返回行列数
    dataSetRowSize = dataSet.shape[0]
    # tile函数复制inX,和数据集矩阵保持大小一致
    diffMat = tile(inX,(dataSetRowSize,1)) - dataSet
    sqDiffMat = diffMat ** 2
    sqDistance = sqDiffMat.sum(axis = 1) # sum方法,axis=0,按列相加,axis=1,按行相加
    distances = sqDistance ** 0.5
    # 返回列表中由小到大的排列索引值,如[4,0,1]返回[1,2,0]
    sortedDistanceIndicies = distances.argsort()
    classCount ={
   }
    for i in range(k):
        # 按照距离给标签计数
        votelabel =labels[sortedDistanceIndicies[i]]
        # 统计字典中标签的个数,第一查找没有标签置0,每次都加1
        classCount[votelabel] = classCount.get(votelabel,0) + 1
        # 返回一个列表,按第二个元素降序排列
        sortedClassCount = sorted(classCount.iteritems(),
         key = operator.itemgetter(1),reverse = True)
        # 返回出现次数最多的一个标签
        return sortedClassCount[0][0]

这个函数里面使用的距离度量方法是欧式距离公式,计算两个向量 x A x_A xA x B x_B xB之间的距离 d d

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值