机器学习实战训练营-第2章-k-近邻算法-2.1

机器学习实战训练营-第2章-k-近邻算法-2.1

核心:基于距离的测量方式,并将它应用于约会网站配对和手写识别系统中。

难点:选取的k值不好确定

注意:因为是基于距离比较,所以样本个特征之间的取值范围差别较大的时候,应该对特征进行归一化处理,提升分类效果。

2.1概述

优点:精度高,对异常值不敏感,无数据输入假定

缺点:计算复杂度高,空间复杂度高

适用数据范围:数值型和标称型

工作原理:存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一个数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。

一般流程:

(1)收集数据:可以使用任何方法

(2)准备数据:距离计算所需要的数值,最好是结构化的数据格式。

(3)分析数据:可以使用任何方法

(4)训练算法:此步骤不适用于k-近邻算法

(5)测试算法:计算错误率

(6)使用算法:首先需要输入样本数据和结构化的输出结果,然后运行k-近邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续处理。

2.1.1准备:使用python导入数据

kNN.py导入两个模块:科学计算包numpy;运算符模块

gfrom numpy import *
import opertator

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矩阵每行包含一个不同的数据,想象为某个日志文件中不同的测量点或者入口。

向量label包含了每个数据点的标签信息,label包含的元素个数等于group矩阵行数。

已知:python如何解析数据,如何加载数据,KNN算法的工作原理

2.1.2从文本文件中解析数据

对未知类别属性的数据集中的每个点依次执行以下操作:

(1)计算已知类别数据集中的点与当前点之间的距离

(2)按照距离递增次序排序

(3)选取与当前点距离最小的K个点

(4)确定前k个点所在类别的出现频率

(5)返回前K个点出现频率最高的类别作为当前点的预测分类

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
	sortDistIndicies = distances.argsort()
	classCount={}
	for i in range(k):
		voteIlabel = labels[sortedDistIndicies[i]]
		classCout[voteIlabel] = classCount.get(voteIlabel,0)+1
	sortedClassCount = sorted(classCount.iteritems(),
	key = operator.itemgetter(1),reverse = True)
	return sortedClassCount[0][0]

classify0()函数有4个输入参数:用于分类的输入向量是inx,输入的训练样本集为dataSet,标签向量为labels,最后的参数k表示用于选择最近邻居的数目,其中标签向量的元素数目和矩阵dataSet的行数相同。

2.1.3如何测试分类器

使用已知答案的数据,答案不告诉分类器,校验分类器给出结果是否符合预期结果。

分类器的错误率=分类器给出错误结果的次数除以测试执行的总数

错误率是常用的评估方法,主要用于评估分类器在某个数据集上的执行效果。

猜你喜欢

转载自blog.csdn.net/qq_44621510/article/details/89817383