机器学习笔记(1)-KNN(K-近邻算法)

来源:互联网 发布:java ssh面试题 编辑:程序博客网 时间:2024/06/07 14:36

k近邻法(k-nearest neighbor. k-NIs)是一种基本分类与回归方法,k值的选择、距离度量及分类决策规则(多数表决)是k近邻法的三个基本要素。
这里写图片描述

工作原理

将没有标签的新数据的每个特征与样本集中数据对应的特征进行比较,然后提取样本集中特征最相似数据(最近邻)的分类标签。

1.假设有一个带有标签的样本数据集(训练样本集),其中包含每条数据与所属分类的对应关系。2.输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较。    2.1计算新数据与样本数据集中每条数据的距离。    2.2对求得的所有距离进行排序(从小到大,越小表示越相似)。    2.3取前k(k一般小于等于20)个样本数据对应的分类标签。3.求k个数据中出现次数最多的分类标签作为新数据的分类。

k值的选择
如果选择较小的k值,就相当于用较小的邻域中的训练实例进行预测,“学习”的近似误差( approximation ertor)会减小,只有与输入实例较近的(相似的)训练实例才会对预测结果起作用.但缺点是“学习”的估计误(estimarion ertor)会增大,预测结果会对近邻的实例点非常敏感fzl.如果邻近的实例点恰巧是噪声,预测就会出错。换句话说,k值的减小就意味着整体模型变得复杂,容易发生过拟合。如果选择较大的k值,就相当于用较大邻域中的训练实例进行预侧。其优点是可以减少学习的估计误差,但缺点是学习的近似误差会增大,这时与输入实例较远的(不相似的)训练实例也会对预测起作用,使预侧发生错误,k值的增大就意味着整体的模型变得简单。在应用中,k值一般取一个比较小的数值,通常采用交叉验证法来选取最优的k值。

代码实现

对未知类别属性的数据集中的每个点依次执行以下操作:
(1)计算已知类别数据集中的点与当前点之间的距离;
(2)按照距离递增次序排序;
(3)选取与当前点距离最小的走个点;
(4)确定前灸个点所在类别的出现频率;
(5)返回前女个点出现频率最高的类别作为当前点的预测分类。

def classify0(inX, dataSet, labels, k):  # 取前k个值,判断向量inX的标签    dataSetSize = dataSet.shape[0]    diffMat = np.array(inX) - dataSet    # diffMat = tile(inX, (dataSetSize,1)) - dataSet    sqDiffMat = diffMat**2    sqDistances = sqDiffMat.sum(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]

argsort()使用

>>> import numpy as np>>> a = np.array([4,2,1,6,9])>>> a.argsort()array([2, 1, 0, 3, 4], dtype=int64)
原创粉丝点击