1、惰性学习法
说到惰性学习法,就要提到急切学习法。
急切学习法:给定训练集, 在接收待分类的新元祖(如检验元组)之前,就构造泛化(即分类)模型。如:决策树归纳、贝叶斯分类、基于规则的分类、后向传播分类、支持向量机和基于关联规则挖掘的分类等。
惰性学习法(也称为基于实例的学习法):给定一个训练元组,简单地存储它 (或只是稍加处理) ,一直等到给定一个检验元组。仅当看到检验元组时,它才进行泛化,以便根据存储的训练元组的相似性对该元组进行分类。
优点:原理简单,实现起来比较方便。支持增量学习。能对超多边形的复杂决策空间建模。
缺点:计算开销大,需要有效的存储技术和并行硬件的支撑。
K近邻算法就是惰性学习法的例子。
2、K近邻算法(KNN算法)
k最近邻分类法是20世纪50年代早期首次引进的。给定大量训练集时,该方法是劳动密集的,直到20世纪60年代计算能力大大增强之后才流行起来。此后被广泛用于模式识别领域。
工作原理:存在一个样本数据集合(训练样本集),并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据。最后,选择k个最相似数据中出现次数最多的分类,最为新数据的分类。
例子:下图中,绿色圆要被决定赋予哪个类,是红色三角形还是蓝色四方形?如果K=3,由于红色三角形所占比例为2/3,绿色圆将被赋予红色三角形那个类,如果K=5,由于蓝色四方形比例为3/5,因此绿色圆被赋予蓝色四方形类。
2.1 邻近性的度量方法
“邻近性”用距离度量,距离越大,表示两个点越不相似。
计算距离的方法:欧几里得距离、曼哈顿距离或其它距离。但多采用欧几里得距离(简单)。
例:两个点或元组X1=(x11,x12,...,x1n)和X2=(x21,x22,...,x2n)的欧几里得距离是:
换言之,对于每个数值属性,取元组X1和X2该属性对应值的差,取差的平方并累计。并取累计距离计数的平方根。
2.2 属性的数值规范化
有助于防止具有较大初始值域的属性(如收入)比具有较小初始值域的属性(如二元属性)的权重过大。
例如,可以通过计算下式,使用最小—最大规范化将数值属性A的值v变换到[0,1]区间中的v'
其中minA和maxA分别是属性A的最小值和最大值。
2.3 比较的属性不是数值类型而是分类类型(如颜色),如何计算距离?
对于分类属性,一种简单的方法是比较元组X1和X2中对应属性的值。如果二者相同(例如,元组X1和X2都是蓝色),则二者之间的差为0。如果二者不同(例如,元组X1是蓝色,而元组X2是红色),则二者之间的差为1。
其他方法可采用更复杂的方案。(例如,对蓝色和白色赋予比蓝色和黑色更大的差值。)
2.4 缺失值的处理
解决办法:取最大的可能差。
对于分类属性,假设每个属性都已经映射到[0,1]区间,如果属性A的一个或两个对应值丢失,则取差值为1;
如果A是数值属性,若两个比较的元组属性A的值均缺失,则取差值为1,若只有一个缺失,另一个存在并且已经规范化(记作v'),则取差值为|1-v'|和|0-v'|中的最大者。
2.5 确定近邻数k的值
引用李航博士的书【统计学习方法】中的内容:
K值的选择会对k近邻法的结果产生重大影响。
如果选择较小的K值,就相当于用较小的邻域中的训练实例进行预测,“学习”的近似误差会减小,只有与输入实例较近或相似的训练实例才会对预测结果起作用。但缺点是“学习”的估计误差会增大,预测结果会对近邻的实例点非常敏感。如果近邻的实例点恰巧是噪声,预测就会出错。换句话说,K值的减小就意味着整体模型变得复杂,容易发生过拟合。
如果选择较大的K值,就相当于用较大邻域中的训练实例进行预测。其优点是可以减少学习的估计误差。但缺点是学习的近似误差会增大。这时,与输入实例较远(不相似的)训练实例也会对预测起作用,使预测发生错误。K值的增大就意味着整体的模型变得简单。
如果K=N,则完全不足取,因为此时无论输入实例是什么,都只是简单的预测它属于在训练实例中最多的类。模型过于简单,忽略了训练实例中大量有用信息。
在实际应用中,K值一般取一个比较小的数值。例如采用交叉验证法(简单来说,就是一部分样本做训练集,一部分做测试集)来选择最优的K值。
引用【数据挖掘概念与技术】中的内容:
可以通过实验确定。
从k=1开始,使用检验集估计分类器的误差率。重复该过程,每次k增值1,允许增加一个近邻。选取产生最小误差率的k。
一般,训练元组数越多,k的值越大。
2.6 对噪声数据或不相关属性的处理
最近邻分类法使用基于距离的比较,本质上赋予每个属性相等的权重。因此,当数据存在噪声或不相关属性时,它们的准确率可能会受到影响。
对属性赋予相关性权重w,w越大说明属性对分类的影响越相关。对噪声数据可以将所在的元组直接cut掉。
2.7 算法流程
2.8 算法的改进策略
最近邻分类法在对检验元组分类时可能非常慢。如果D是具有|D|个元组的训练数据库,而k=1,则对一个给定的检验元组分类需要O(|D|)次比较。改进如下:
3、kd树
上面“算法的改进策略”已经提到了搜索树。
其实,实现k近邻算法时,考虑的主要问题是如何对训练数据进行快速k近邻搜索。这点在特征空间的维数大及训练数据容量大时尤其重要。
K近邻法最简单的实现方法是线性扫描。这时要计算输入实例与每一个训练实例的距离。当训练集很大时,计算耗时,这种方法是不可行的。
为了提高k近邻搜索的效率,可以考虑使用特殊的结构存储训练数据,以减少计算距离的次数。具体方法很多,其中比较常见的是kd树方法。
Kd树的详细介绍:
参见:
1、李航博士的《统计学习方法》中的章节(k近邻法的实现:kd树)
2、大牛的博客
更多文献:可以参见大牛的博客