(一)K-近邻算法概述
1. 𝑘 近邻法是基本且简单的分类与回归方法。 𝑘 近邻法的基本做法是:对给定的训练实例点和输入实例点,首先确定输入实例点的 𝑘 个最近邻训练实例点,然后利用这 𝑘 个训练实例点的类的多数来预测输入实例点的类。
2. 𝑘 近邻模型对应于基于训练数据集对特征空间的一个划分。 𝑘 近邻法中,当训练集、距离度量、 𝑘 值及分类决策规则确定后,其结果唯一确定。
3. 𝑘 近邻法三要素:距离度量、 𝑘 值的选择和分类决策规则。常用的距离度量是欧氏距离及更一般的pL距离。 𝑘 值小时, 𝑘 近邻模型更复杂; 𝑘 值大时, 𝑘 近邻模型更简单。 𝑘 值的选择反映了对近似误差与估计误差之间的权衡,通常由交叉验证选择最优的 𝑘 。
常用的分类决策规则是多数表决,对应于经验风险最小化。
4. 𝑘 近邻法的实现需要考虑如何快速搜索k个最近邻点,并用分类决策规则确定最终点的归类。
(二)算法步骤 k-近邻算法步骤如下:
计算已知类别数据集中的点与当前点之间的距离; 按照距离递增次序排序; 选取与当前点距离最小的k个点; 确定前k个点所在类别的出现频率; 返回前k个点所出现频率最高的类别作为当前点的预测分类。 ? ? ? ? 使用K-近邻算法分类爱情片和动作片,图1-1显示了6部电影的打斗和接吻镜头数。我们可以使用KNN算法,对一部未看过的电影,确定它是爱情片还是动作片。
(三)代码实现?
# -*- coding: UTF-8 -*-
import collections
import numpy as np
def createDataSet():
#四组二维特征
group = np.array([[1,101],[5,89],[108,5],[115,8]])
print(group)
#四组特征的标签
labels = ['爱情片','爱情片','动作片','动作片']
return group, labels
def classify(inx, dataset, labels, k):
# 计算距离 其实就是计算点一定之间的距离
dist = np.sum((inx - dataset)**2, axis=1)**0.5
#print("dist",dist)
# k个最近的标签
# dist.argsort 将x中的元素从小到大排列,提取其对应的index(索引)
k_labels = [labels[index] for index in dist.argsort()[0 : k]]
print('k_labels', k_labels)
# 出现次数最多的标签即为最终类别
#主要功能:可以支持方便、快速的计数,将元素数量统计,然后计数并返回一个字典,键为元素,值为元素个数。
print('k_labels',collections.Counter(k_labels).most_common(1)[0][0])
label = collections.Counter(k_labels).most_common(1)[0][0]
return label
if __name__ == '__main__':
#创建数据集
group, labels = createDataSet()
#测试集
test = [55,20]
#kNN分类
#test_class = classify0(test, group, labels, 3)
test_class = classify(test, group, labels, 3)
#打印分类结果
print(test_class)
(四)总结
优点:
1.k近邻算法理论简单,容易实现。
2.准确性高,对异常值和噪声有较高的容忍度
缺点:
1.k取值很小容易受异常点影响;k取值很小容易受数量波动影响
|