机器学习算法-KNN(一)

1、KNN分类算法原理

        KNN(K-Nearest-Neighbors Classification),从字面意思上理解就是一种近邻算法,因此又被称为K近邻算法。其算法的本质就是,寻找所有训练样本中与该测试样本“距离”最近的前K个样本,然后看这K个样本大部分属于哪一类,那么就认为这个测试样本也属于哪一类。这里说的“距离”是指欧式距离。

                                    

       我们通过下面这张图来详细解释:

   

       假设,有以上红蓝绿三种已经知道分类情况的数据,然后当数据X进入这个数据集的时候,分别求出X与每个数据的距离,然后挑选出其中最近几组的距离,然后看与X距离最近的数据分别属于哪一类,然后依照少数服从多数的原则给新的数据分类。

2、KNN算法的优缺点

        1、优点:简单、易于实现、无需估计参数、无需训练。

      2、缺点:对测试样本分类时的计算量大,内存开销大,评分慢,可解释性差,无法给出决策树那样的规则

3、常见问题

      1、K值的设定

      2、类别如何判定

      3、训练样本是否要一视同仁

      4、性能问题

4、最简单的实例-Python实现

         接下来我们通过一个实例来练习一下。

#coding:utf-8

from numpy import *
import operator

#定义训练数据
def creatDataSet():
    group = array([[1.0,2.0],[1.2,0.1],[0.1,1.4],[0.3,3.5]])
    labels = ['A','A','B','B']
    return group,labels

#分类
def classify(input,dataSet,label,k):
    
    dataSize = dataSet.shape[0]

    ###计算欧式距离
    diff = tile(input,(dataSize,1))-dataSet
    sqdiff = diff ** 2
    squareDist = sum(sqdiff, axis = 1)
    dist = squareDist ** 0.5

    #对距离进行排序
    sortedDistIndex = argsort(dist)  
    #argsort根据元素的值从大到小对元素进行排序,返回下标

    classCount = {}
    for i in xrange(k):
        voteLabel = label[sortedDistIndex[i]]
        #对选取的k个样本所属的类别个数进行统计
        classCount[voteLabel] = classCount.get(voteLabel,0) + 1

    #选取出现的类别次数做多的类别
    maxCount = 0
    for key,value in classCount.items():
        if value > maxCount:
            maxCount = value
            classes = key

    return classes

执行过程


>>> import sys
>>> sys.path.append("/home/ts/PycharmProjects/KNN")
>>> import knn
>>> from numpy import *
>>> dataSet,labels = knn.creatDataSet()
>>> input = array([1.1,0.3])
>>> k =3
>>> output = knn.classify(input,dataSet,labels,k)
>>> print(input,output)
(array([ 1.1,  0.3]), 'A')


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值