weka开发[21]ibk(knn)源代码分析_第1页
weka开发[21]ibk(knn)源代码分析_第2页
weka开发[21]ibk(knn)源代码分析_第3页
weka开发[21]ibk(knn)源代码分析_第4页
weka开发[21]ibk(knn)源代码分析_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、新西兰黑秧鸡开发21IBk(KNN)源代码分析如果你没有看上一篇IB1,请先看一下,因为重复的内容我在这里不会介绍了。直接看构建分类器,这里只列出在IB1中也没有出现的代码:尝试m _ NumCallus=实例。numcalus();m _ ClassType=实例。ClassAttribute().类型();捕获(例外情况)抛出新错误(”永远不应该到达这个位置”;/丢弃初始实例,直到达到指定的窗口大小if(m _ WindowSize 0)(实例。NumMinInstances()m _ WindowSize)m _火车=新实例(m_Train,m_Train.numInstances()-

2、 m_WindowSize,m _ WindowSize);/计算贡献的属性数量/每个预测m _ NumAttributesUsed=0.0对于(整数1=0;我是火车乘客i ) 如果(我!=m_Train.classIndex()属性.isNominal() | m_Train。属性.isNumeric()m _ NumAttributesUsed=1.0/使任何当前交叉验证选择的k无效m _ kNNValid=falseIB1中不关心m _ NumClasses是因为它就找一个邻居,当然就一个值了。m_WindowSize是指用多少样本用于分类,这里不是随机选择而是直接选前m_WindowS

3、ize个。这里下面是看有多少属性参与预测。KNN也是一个可以增量学习的分器量,下面看一下它的更新分类器代码:公共void UpdateDiceptor(实例实例)引发异常如果是火车。equalHeaders(实例。dataset()=false)引发新的异常(”不兼容的实例类型”;if(实例。分类()返回;如果(!m_DontNormalize) 更新最大值(实例);添加(实例);m _ kNNValid=falseif(m _ WindowSize 0)(m _ Train。NuMinStatences()m _ WindowSize)而(火车。NuminStatences()m _ Win

4、dowSize)删除(0);同样很简单,更新最大值,如果超出窗口大小,循环删除超过窗口大小的第一个样本。这里注意牛传染性角膜结膜炎没有实现classifyInstance,它只实现了物质分布:public doubleDistributionForInstance(实例实例)引发异常if(m _ train。numministrations()=0)抛出新异常(”无培训实例!”);if(m _ WindowSize 0)(m _ Train。NuMinStatences()m _ WindowSize)m _ kNNValid=false布尔deletedInstance=false而(火车。

5、NuminStatences()m _ WindowSize)删除(0);/重建数据结构KDTree当前无法删除如果(删除实例=真)集合实例(火车);/通过交叉验证选择k如果(!m _ KNnValid(m _ CrossValidate)(m _ KNnUpper=1)交叉验证();m_NNSearch.addInstanceInfo(实例);实例邻居=m _ NnSearch。knealerestNeighbours(实例,m _ KNn);doubledistance=m _ NnSearch。getDistance();doubledistribution=进行分配(邻居,距离);收益

6、分配;前面两个判断不讲了,交叉验证()马上讲,寻找K个邻居在我第18篇里已经讲过了,现在我们看一下进行分发函数。受保护的双进行分发(实例邻居,双倍距离)抛出异常双倍总计=0,重量;双分布=新双m _ Numcallass;/设置对估计器的校正if (m_ClassType=属性。标称值)对于(整数1=0;I m _ Numclasesi)分布i=1.0 /数学最大值(1,m _ Train。NumStates();总计=(双倍)m _ NumClasses数学最大值(1,(m _ train。num instances();对于(整数1=0;我是邻居。内政部();i ) /收集类计数实例当前=

7、邻居。距离i=距离i *距离一;距离i=数学平方(距离I/m _ numattributesused;开关(m _距离)行李箱重量_倒置:重量=1.0 /(距离10.001);/以避免div为零休息;箱子重量_相似:重量=1.0 -距离一;休息;default: /WEIGHT_NONE:重量=1.0;休息;重量*=当前重量();尝试开关(m_ClassType) 案例属性。名词:分布(int) current.classValue()=权重;休息;案例属性。数字:分布0=current.classValue() *权重;休息;捕获(例外情况)抛出新错误(”数据没有类属性!”);总计=重量;/

8、标准化分布如果(总计0) Utils.normalize(分布,总计);收益分配;第一行注释设置一个校正,我感觉没什么必要,又不是贝叶斯还有除0错误,没什么可修正的。这里可以看见它实现了三种距离权重计算方法,倒数,与1的差,另外就是固定权重1 .然后如果类别是离散值把对应的类值加上权重,如果是连续值,就加上当前类别值剩权重。交叉验证简单地说就是用蛮力找在到底用多少个邻居好,它对火车中的样本进行循环,对每个样本找邻居,然后统计看寻找多少个邻居时最好。受保护的空的交叉验证()double performanceStats=新的双m _ KNnUpper;doublePerformanceStatSq=新的双m _ KNnUpper;对于(整数1=0;i m _ kNNUpperi ) 性能统计1=0;性能状态qI=0;m _ kNN=m _ kNNUpper实例实例。邻居实例;双原点距离,转换距离;对于(整数1=0;我是火车司机i ) 实例;neighbors=m _ NnSearch。knealerestNeighbours(实例,m _ KNn);原始距离=m _ NnSearch。getDistance();对于(int

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论