什么是KNN?(概述)
K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。Cover和Hart在1968年提出了最初的邻近算法。
KNN是一种分类(classification)算法,它输入基于实例的学习(instance-based learning),属于懒惰学习(lazy learning)即KNN没有显式的学习过程,也就是说没有训练阶段,数据集事先已有了分类和特征值,待收到新样本后直接进行处理。与急切学习(eager learning)相对应。
简单的说,k-近邻算法采用测量不同特征值之间的距离方法进行分类。
思路是:如果一个样本在特征空间中的k个最邻近的样本中的大多数属于某一个类别,则该样本也划分为这个类别。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。
优缺点以及适用数据范围
优点:
- 精度高
- 对异常值不敏感
- 无数据输入设定
缺点:
- 计算复杂度高
- 空间复杂度高
适用数据范围:
- 数值型和标称型
工作原理
存在一个样本数据集合, 也称作训练样本集, 并且样本集中每个数据都存在标签,即我们知道样本集中每一数据 与所属分类的对应关系。 输人没有标签的新数据后, 将新数据的每个特征与样本集中数据对应的 特征进行比较,然后算法提取样本集中特征最相似数据( 最近邻) 的分类标签。一般来说,我们 只选择样本数据集中前k个最相似的数据, 这就是k-近邻算法中k的出处,通常k是不大于20的整数。 最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。
k-近邻算法的一般流程
(1)收集数据:可以使用任何方法。
(2)准备数据:距离计算所需要的数值,最好是结构化的数据格式。
(3)分析数据:可以使用任何方法。
(4)训练算法:此步驟不适用于k-近邻算法。
(5)测试算法:计算错误率。
(6)使用算法:首先需要输入样本数据和结构化的输出结果,然后运行女-近邻算法判定输 入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理。
一般代码
from numpy import *
import operator
from os import listdir
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
group, labels = createDataSet()
# print(group)
# print(labels)
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
diffMat = tile(inX, (dataSetSize, 1)) - dataSet
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances ** 0.5
# 距离采用欧氏距离,计算*xA*和*xB*之间的距离
sortedDistIndicies = distances.argsort()
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
sortedClassCount = sorted(classCount.items(),
key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]
# 可以输入一个点[0,0]进行测试
a = classify0([0, 0], group, labels, 3)
print(a)
tile():重复inX的维度
sorted(iterable, key=None, reverse=False)
iterable -- 可迭代对象。
key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭
代对象中,指定可迭代对象中的一个元素来进行排序。
reverse -- 排序规则, reverse = True 降序, reverse = False 升序(默认)。
欧式距离: