机器学习实战-K-近邻算法(kNN)
一、k-近邻算法描述
简单的说,k-近邻算法采用测量不同特征值之间的距离办法进行分类.
k-近邻算法
优 点 :精度高、对异常值不敏感、无数据输入假定。
缺点:计算复杂度高、空间复杂度高。
适用数据范围:数值型和标称型。
工作原理
存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的 特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们 只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数。 最后 ,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。
二、k-近邻算法流程
收集数据:可以使用任何方法。
准备数据:距离计算所需要的数值,最好是结构化的数据格式。
分析数据:可以使用任何方法。
训练算法:此步驟不适用于k-近邻算法。
测试算法:计算错误率。
使用算法:首先需要输入样本数据和结构化的输出结果,然后运行k-近邻算法判定输 入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理。
三、算法实现
创建名为kNN.py的python文件,首先编写一些通用函数。
# coding=utf-8
from numpy import * # 科学计算
import operator # 运算符模块
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
导入了两个模块; 第一个是科学计算包;第二个是运算符模块。
算法核心代码:
def classify0(inX, dataSet, labels, k):
'''
:param inX:用于分类的输入向量
:param dataSet:输入的训练样本集
:param labels:标签向量
:param k:用于选择最近邻的数目
:return:
'''
dataSetSize = dataSet.shape[0] #求出dataSet矩阵的行数
diffMat = tile(inX, (dataSetSize, 1)) - dataSet
sqDiffMat = diffMat ** 2
sqDistances = sqDiffMat.sum(axis=1)#axis=1以后就是将一个矩阵的每一行向量相加
distances = sqDistances ** 0.5
sortedDistIndicies = distances.argsort()#得到每个元素的排序序号
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]
计算完所有点之间的距离后,可以对数据按照从小到大的次序排序。然后,确定前k个距离 最小元素所在的主要分类, 输人k总是正整数;最后 ,将classCount字典分解为元组列表,然后 使用程序第二行导入运算符模块的itemgetter方法,按照第二个元素的次序对元组进行排序。 此处的排序为逆序,即按照从最大到最小次序排序,最后返回发生频率最高的元素标签。
四、算法小结
K-近邻算法是分类数据最简单最有效的算法,本章通过两个例子讲述了如何使用k-近邻算法 构造分类器。k-近邻算法是基于实例的学习,使用算法时我们必须有接近实际数据的训练样本数 据。k-近邻算法必须保存全部数据集,如果训练数据集的很大,必须使用大量的存储空间。此外, 由于必须对数据集中的每个数据计算距离值,实际使用时可能非常耗时。 k-近邻算法的另一个缺陷是它无法给出任何数据的基础结构信息,因此我们也无法知晓平均 实例样本和典型实例样本具有什么特征。
转载请注明原文地址: https://ju.6miu.com/read-1296502.html