教育技术前沿讲座计算机科学学院教育技术学0141109020105刘泽成KNN-简介是K最邻近结点算法(k-NearestNeighboralgorithm)的缩写形式,是电子信息分类器算法的一种。KNN方法对包容型数据的特征变量筛选尤其有效。KNN-算法描述该算法的基本思路是:在给定新文本后,考虑在训练文本集中与该新文本距离最近(最相似)的K篇文本,根据这K篇文本所属的类别判定新文本所属的类别,具体的算法步骤如下:一、:根据特征项集合重新描述训练文本向量二、:在新文本到达后,根据特征词分词新文本,确定新文本的向量表示三、:在训练文本集中选出与新文本最相似的K个文本,计算公式为:【图】公式(1)-KNN其中,K值的确定目前没有很好的方法,一般采用先定一个初始值,然后根据实验测试的结果调整K值,一般初始值定为几百到几千之间。四、:在新文本的K个邻居中,依次计算每类的权重,计算公式如下:【图】】公式(2)-KNN其中,x为新文本的特征向量,Sim(x,di)为相似度计算公式,与上一步骤的计算公式相同,而y(di,Cj)为类别属性函数,即如果di属于类Cj,那么函数值为1,否则为0。五、:比较类的权重,将文本分到权重最大的那个类别中。除此以外,支持向量机和神经网络算法在文本分类系统中应用得也较为广泛,支持向量机的基本思想是使用简单的线形分类器划分样本空间。对于在当前特征空间中线形不可分的模式,则使用一个核函数把样本映射到一个高维空间中,使得样本能够线形可分。而神经网络算法采用感知算法进行分类。在这种模型中,分类知识被隐式地存储在连接的权值上,使用迭代算法来确定权值向量。当网络输出判别正确时,权值向量保持不变,否则进行增加或降低的调整,因此也称为奖惩法。KNN-不足该算法在分类时有个主要的不足是,当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。因此可以采用权值的方法(和该样本距离小的邻居权值大)来改进。该方法的另一个不足之处是计算量较大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最近邻点。目前常用的解决方法是事先对已知样本点进行剪辑,事先去除对分类作用不大的样本。该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分。KNN-图示图示-KNN右图中,绿色圆要被决定赋予哪个类,是红色三角形还是蓝色四方形?如果K=3,由于红色三角形所占比例为2/3,绿色圆将被赋予红色三角形那个类,如果K=5,由于蓝色四方形比例为3/5,因此绿色圆被赋予蓝色四方形类。KNN-主要应用领域·文本分类·聚类分析·数据挖掘·机器学习·预测分析·减少维度·模式识别·图像处理文本分类-文本分类的定义用电脑对文本集(或其他实体或物件)按照一定的分类体系或标准进行自动分类标记基於分类体系的自动分类基於资讯过滤和用户兴趣的自动分类基於分类体系的自动分类所谓分类体系就是针对词的统计来分类关键字分类,现在的全文检索词的正确切分不易分辨(白痴造句法)基於资讯过滤和用户兴趣的自动分类学习人类对文本分类的知识和策略从人对文本和类别之间相关性判断来学习文件用字和标记类别之间的关联文本分类-文本分类的过程文本分类一般包括了文本的表达、分类器的选择与训练、分类结果的评价与反馈等过程,其中文本的表达又可细分为文本预处理、索引和统计、特征抽取等步骤。文本分类系统的总体功能模块为:(1)预处理:将原始语料格式化为同一格式,便于后续的统一处理;(2)索引:将文档分解为基本处理单元,同时降低后续处理的开销;(3)统计:词频统计,项(单词、概念)与分类的相关概率;(4)特征抽取:从文档中抽取出反映文档主题的特征;(5)分类器:分类器的训练;(6)评价:分类器的测试结果分析。文本分类-文本分类方法文本分类问题与其它分类问题没有本质上的区别,其方法可以归结为根据待分类数据的某些特征来进行匹配,当然完全的匹配是不太可能的,因此必须(根据某种评价标准)选择最优的匹配结果,从而完成分类。词匹配法词匹配法是最早被提出的分类算法。这种方法仅根据文档中是否出现了与类名相同的词(顶多再加入同义词的处理)来判断文档是否属于某个类别。很显然,这种过于简单机械的方法无法带来良好的分类效果。知识工程方法后来兴起过一段时间的知识工程的方法则借助于专业人员的帮助,为每个类别定义大量的推理规则,如果一篇文档能满足这些推理规则,则可以判定属于该类别。这里与特定规则的匹配程度成为了文本的特征。由于在系统中加入了人为判断的因素,准确度比词匹配法大为提高。但这种方法的缺点仍然明显,例如分类的质量严重依赖于这些规则的好坏,也就是依赖于制定规则的“人”的好坏;再比如制定规则的人都是专家级别,人力成本大幅上升常常令人难以承受;而知识工程最致命的弱点是完全不具备可推广性,一个针对金融领域构建的分类系统,如果要扩充到医疗或社会保险等相关领域,则除了完全推倒重来以外没有其他办法,常常造成巨大的知识和资金浪费。统计学习法后来人们意识到,究竟依据什么特征来判断文本应当隶属的类别这个问题,就连人类自己都不太回答得清楚,有太多所谓“只可意会,不能言传”的东西在里面。人类的判断大多依据经验以及直觉,因此自然而然的会有人想到何让机器像人类一样自己来通过对大量同类文档的观察来自己总结经验,作为今后分类的依据。这便是统计学习方法的基本思想。统计学习方法需要一批由人工进行了准确分类的文档作为学习的材料(称为训练集,注意由人分类一批文档比从这些文档中总结出准确的规则成本要低得多),计算机从这些文档中挖掘出一些能够有效分类的规则,这个过程被形象的称为训练,而总结出的规则集合常常被称为分类器。训练完成之后,需要对计算机从来没有见过的文档进行分类时,便使用这些分类器来进行。这些训练集包括sogou文本分类分类测试数据、中文文本分类分类语料库,包含Arts、Literature等类别的语料文本、可用于聚类的英文文本数据集、网易分类文本分类文本数据、tc-corpus-train(语料库训练集,适用于文本分类分类中的训练)、2002年中文网页分类训练集CCT2002-v1.1等。现如今,统计学习方法已经成为了文本分类领域绝对的主流。主要的原因在于其中的很多技术拥有坚实的理论基础(相比之下,知识工程方法中专家的主观因素居多),存在明确的评价标准,以及实际表现良好。文本分类-统计分类算法将样本数据成功转化为向量表示之后,计算机才算开始真正意义上的“学习”过程。常用的分类算法为:决策树,Rocchio,朴素贝叶斯,神经网络,支持向量机,线性最小平方拟合,KNN,遗传算法,最大熵,GeneralizedInstanceSet等。在这里只挑几个最具代表性的算法侃一侃。Rocchio算法Rocchio算法应该算是人们思考文本分类问题时最先能想到,也最符合直觉的解决方法。基本的思路是把一个类别里的样本文档各项取个平均值(例如把所有“体育”类文档中词汇“篮球”出现的次数取个平均值,再把“裁判”取个平均值,依次做下去),可以得到一个新的向量,形象的称之为“质心”,质心就成了这个类别最具代表性的向量表示。再有新文档需要判断的时候,比较新文档和质心有多么相像(八股点说,判断他们之间的距离)就可以确定新文档属不属于这个类。稍微改进一点的Rocchio算法不仅考虑属于这个类别的文档(称为正样本),也考虑不属于这个类别的文档数据(称为负样本),计算出来的质心尽量靠近正样本同时尽量远离负样本。Rocchio算法做了两个很致命的假设,使得它的性能出奇的差。一是它认为一个类别的文档仅仅聚集在一个质心的周围,实际情况往往不是如此(这样的数据称为线性不可分的);二是它假设训练数据是绝对正确的,因为它没有任何定量衡量样本是否含有噪声的机制,因而也就对错误数据毫无抵抗力。不过Rocchio产生的分类器很直观,很容易被人类理解,算法也简单,还是有一定的利用价值的,常常被用来做科研中比较不同算法优劣的基线系统(BaseLine)。朴素贝叶斯算法贝叶斯算法关注的是文档属于某类别概率。文档属于某个类别的概率等于文档中每个词属于该类别的概率的综合表达式。而每个词属于该类别的概率又在一定程度上可以用这个词在该类别训练文档中出现的次数(词频信息)来粗略估计,因而使得整个计算过程成为可行的。使用朴素贝叶斯算法时,在训练阶段的主要任务就是估计这些值。朴素贝叶斯算法的公式并不是只有一个。首先对于每一个样本中的元素要计算先验概率。其次要计算一个样本对于每个分类的概率,概率最大的分类将被采纳。所以其中P(d|Ci)=P(w1|Ci)P(w2|Ci)…P(wi|Ci)P(w1|Ci)…P(wm|Ci)(式1)P(w|C)=元素w在分类为C的样本中出现次数/数据整理后的样本中元素的总数(式2)这其中就蕴含着朴素贝叶斯算法最大的两个缺陷。首先,P(d|Ci)之所以能展开成(式1)的连乘积形式,就是假设一篇文章中的各个词之间是彼此独立的,其中一个词的出现丝毫不受另一个词的影响(回忆一下概率论中变量彼此独立的概念就可以知道),但这显然不对,即使不是语言学专家的我们也知道,词语之间有明显的所谓“共现”关系,在不同主题的文章中,可能共现的次数或频率有变化,但彼此间绝对谈不上独立。其二,使用某个词在某个类别训练文档中出现的次数来估计P(wi|Ci)时,只在训练样本数量非常多的情况下才比较准确(考虑扔硬币的问题,得通过大量观察才能基本得出正反面出现的概率都是二分之一的结论,观察次数太少时很可能得到错误的答案),而需要大量样本的要求不仅给前期人工分类的工作带来更高要求(从而成本上升),在后期由计算机处理的时候也对存储和计算资源提出了更高的要求。但是稍有常识的技术人员都会了解,数据挖掘中占用大量时间的部分是数据整理。在数据整理阶段,可以根据词汇的情况生成字典,删除冗余没有意义的词汇,对于单字和重要的词组分开计算等等。这样可以避免朴素贝叶斯算法的一些问题。其实真正的问题还是存在于算法对于信息熵的计算方式。朴素贝叶斯算法在很多情况下,通过专业人员的优化,可以取得极为良好的识别效果。最为人熟悉的两家跨国软件公司在目前仍采用朴素贝叶斯算法作为有些软件自然语言处理的工具算法。kNN算法最近邻算法(kNN):在给定新文档后,计算新文档特征向量和训练文档集中各个文档的向量的相似度,得到K篇与该新文档距离最近最相似的文档,根据这K篇文档所属的类别判定新文档所属的类别(注意这也意味着kNN算法根本没有真正意义上的“训练”阶段)。这种判断方法很好的克服了Rocchio算法中无法处理线性不可分问题的缺陷,也很适用于分类标准随时会产生变化的需求(只要删除旧训练文档,添加新训练文档,就改变了分类的准则)。kNN唯一的也可以说最致命的缺点就是判断一篇新文档的类别时,需要把它与现存的所有训练文档全都比较一遍,这个计算代价并不是每个系统都能够承受的(比如我将要构建的一个文本分类系统,上万个类,每个类即便只有20个训练样本,为了判断一个新文档的类别,也要做20万次的向量比较!)。一些基于kNN的改良方法比如GeneralizedInstanceSet就在试图解决这个问题。kNN也有另一个缺点,当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。支持向量机(svm)SVM(SupportVectorMachine)是Cortes和Vapnik于1995年首先提出的,它在解决小样本、非线性及高维模式识别中表现出许多特有的优势,并能够推广应用到函数拟合等其他机器学习问题中。支持向量机方法是建立在统计学习理论的vc维理论和结构风险最小原理基础上的,根据有限的样本信息在模型的复杂性(即对特定训练样本的学习精度,Accuracy)和学习能力(即无错误地识别任意样本的能力)之间寻求最佳折衷,以期获得最好的推广能力(或称泛化能力)。SVM方法有很坚实的理论基