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')