1、KNN算法介绍
KNN全称K-Nearest Neighbor,K-近邻算法。它是一种分类算法,通过测量不同特征值之间的距离进行分类。
优点:精度高、对异常值不敏感、无数据输入假定
缺点:计算复杂度高、空间复杂度高
适用数据范围:数值型和标称型
2、KNN算法实现步骤
- 计算测试数据与训练集之间的欧式距离(distance = sqrt(a-x1)**2 + (b-y1)**2)
- 将距离distance从小到大排序
- 取前K个距离最小值,并统计这些数据的类别出现次数
- 次数最大的那个类别作为被测数据的类别
3、算法实现
import numpy as np
import operator
from matplotlib.font_manager import FontProperties
import matplotlib.lines as mlines
import matplotlib.pyplot as plt
import time
def createDataSet():
'''
函数说明:创建数据集
:return:
group: 数据集
labels:分类标签
'''
# 创建四组二维特征(打斗镜头、接吻镜头)
group = np.array([[1, 101], [5, 89], [108, 5], [115, 8]])
labels = ["爱情片", "爱情片", "动作片", "动作片"]
return group, labels
def classify0(inx, dataSet, labels, k):
'''
函数说明:k近邻算法
:param inx: 测试集
:param dataSet: 训练集
:param labels: 训练集对应的标签
:param k: 选取k个值
:return: sortClassify[0][0] 测试集对应的类别
'''
# 获取训练集的个数
number = dataSet.shape[0]
# 将测试的点扩展,并与训练集作差值
diffVal = np.tile(inx, (number, 1)) - dataSet
# 求距离 sqrt(x**2+y**2)
squareDiffVal = diffVal**2
sumDiffVal = squareDiffVal.sum(axis=1)
distance = sumDiffVal**0.5
# argsort()函数返回距离从小到大的索引值
sortIndex = distance.argsort()
# 前k个距离最小的值的字典
# 键:类别 值:类别对应的数量
classifyDict = {}
for i in range(k):
# 前k个数据对应的标签
dataLabel = labels[sortIndex[i]]
# classifyDict.get(dataLabel, 0) 当dataLabel标签不存在时,返回0值;若存在,则这个dataLabel键对应的值
classifyDict[dataLabel] = classifyDict.get(dataLabel, 0) + 1
# 按照值对classifyDict进行排序 operator.itemgetter(1)按照值进行排序 reverse=True 从大到小排序
sortClassify = sorted(classifyDict.items(), key=operator.itemgetter(1), reverse=True)
return sortClassify[0][0]
if __name__=="__main__":
dataSet, labels = createDataSet()
inx = [92, 2]
classInx = classify0(inx, dataSet, labels, 3)
print(classInx)
# 结果
# ‘动作片’
4、一点点感想
KNN算法是比较简单的分类算法,仅通过欧式距离来进行分类。