关闭

MachineLearning--Knn

标签: 算法knn机器学习监督学习懒惰学习
119人阅读 评论(0) 收藏 举报
分类:

Knn (k-Nearest Neighbor)
一、算法描述

一种常用的监督学习方法,其工作机制非常简单:给定测试样本,基于某种距离的度量方式(欧氏距离、闵氏距离、曼哈顿距离等)找出训练集中与该样本距离最近的前k个训练样本,并依据k个“邻居”的样本信息进行预测。属于懒惰学习方法[1]。

[1]:懒惰学习(lazy learning)训练阶段仅仅保存样本,训练时间开销为0,待新样本得到后再进行处理;相应的,急切学习(eager learning) 在训练阶段就对样本进行学习处理的方法

KNN图示

二、算法要点
1、距离的度量
欧氏距离、Minkowski距离、曼哈顿距离
参见:
http://www.cnblogs.com/wentingtu/archive/2012/05/03/2479919.html

2、K值选取
K值选取较大,即使用较大邻域内的训练实例进行预测,可以减少学习估计误差,但近似误差会增大;与样本距离较远的训练样本也会对预测结果有影响;
K值选取较小,则近似误差会减小,估计误差会增大;与样本距离较近的训练样本才会对预测结果有影响;预测结果对近邻的训练样本会很敏感。
一般来说,K值取一个比较小的值,通常采用交叉验证法来选择。

3、类别判定
投票法:在分类预测中,选择k个样本中出现最多的类别标记作为预测结果;改进的为加权投票法(按照距离远近进行加权)。
平均法:在回归预测中,将K个样本的实值输出标记的均值作为预测结果

4、优缺点
优点:易理解、易实现、无需训练过程;可用于分类和回归任务中。尤其是多分类问题。
缺点:当训练样本较大时,计算量会很大,并且可解释性较差。

三、代码实现

如下代码为测试knn代码:给定训练样本及对应标签,对测试样本的标签进行预测(分类)。

# -*- coding: utf-8 -*-
# @Date     : 2016/05/25


#this script is used for testing KNN algorithm

from numpy import * 
import operator

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

def classify0(testData, trainData, labels, k):
    trainDataSize = trainData.shape[0]
    diffMat = tile(testData, (trainDataSize,1)) - trainData
    sDiffMat = diffMat**2
    sqDistance = sDiffMat.sum(axis = 1)
    distances = sqDistance**0.5
    sortedDistances = distances.argsort()

    classCount = {}
    for i in range(k):
        voteLabel = labels[sortedDistances[i]]
        classCount[voteLabel] = classCount.get(voteLabel, 0) +1

    sortedClassCount = sorted(classCount.iteritems(), key = operator.itemgetter(1), reverse = True)
    return sortedClassCount[0][0]

if __name__ == '__main__':
    testData = [0, 0]
    trainData, labels = createDataSet()
    k = 3
    print classify0(testData, trainData, labels, k)

四 、参考文献

【1】Peter. 机器学习实战[M]. 人民邮电出版社, 2013.
【2】周志华.机器学习.清华大学出版社,2015.
【3】李航. 统计学习方法[M]. 清华大学出版社, 2012.
【4】http://blog.csdn.net/jmydream/article/details/8644004

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:233次
    • 积分:15
    • 等级:
    • 排名:千里之外
    • 原创:1篇
    • 转载:2篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档