机器学习之KNN

来源:互联网 发布:python图形化编程 编辑:程序博客网 时间:2024/05/16 17:47

KNN主要应用于文本分类、聚类分析、预测分析、降维等
中心思想是采用测量不同特征值之间的距离方法进行分类
算法非常简单,不过这是一个监督算法,训练数据需要经过人工标记。算法中心思想是:计算候选样本到所有训练样本之间的距离,选取k个最近距离数据中出现次数最多的分类作为新样本的类别。

from numpy import *import operatordef classify0(sample,dataSet,labels,k):    samplearray=tile(sample,(dataSet.shape[0],1))    distance=sum((samplearray-dataSet)**2,1)    s=np.argsort(distance)    counter={}    for i in arange(k):        key=labels[s[i]]        if key in counter:            counter[key]=counter[key]+1        else:            counter[key]=1    c=sorted(counter.items(),key=operator.itemgetter(1),reverse=True)    return c[0][0];

归一化

计算距离时,不同的特征的数据范围不一样。例如:样本特征包括身高、体重、飞行里程。其中飞行里程的数值相对身高和体重范围很大。计算样本之间距离时,飞行里程的差值会起到决定性作用,而一般认为所有的特征应该是同样重要,需要将数值归一化到0到1之间:

Vn=VoVmaxVmin

def autoNorm(dataSet):    datarange=dataSet.max(axis=0)-dataSet.min(axis=0)    dataSet=dataSet/tile(datarange,(dataSet.shape[0],1))    return dataSet

优化

KNN算法简单有效,但存在缺点:

  1. 计算量大,每次需要计算待分类样本和全体已知样本的距离,才能求取K个最近领域点,计算量大。因此,一般需要对已知样本点进行剪辑(只对容量大的情况,且去除分类作用不大的样本)。另外也有使用K决策树,减少计算量和存储空间。
  2. 训练样本集中某些类的样本数量大,其他类的数量小。因此,需要采用加权方法。
0 0