Weka开发[18]——寻找K个邻居
来源:互联网 发布:雪山白凤凰知乎 编辑:程序博客网 时间:2024/05/19 18:38
转自 Koala++'s blog
寻找K个邻居,这里先给出一个例子,大部分是王义写的,进行了一点点改动:
publicstatic Instances getKNeighbour( Instances sourceIns, Instance target,int kNN,int numLabels){Instances neighbours = null;try{EuclideanDistance dfunc = new EuclideanDistance();int predictors = sourceIns.numAttributes() - numLabels;dfunc.setAttributeIndices("first-" + predictors);LinearNNSearch lnn = new LinearNNSearch();lnn.setDistanceFunction(dfunc);lnn.setInstances( sourceIns );lnn.addInstanceInfo(target);neighbours = lnn.kNearestNeighbours(target, kNN);}catch(Exception e){System.out.println("Util.getKNeighbour(LinearNNSearch m_NNSearch,Instance mean, int m_kNN) is wrong!");}return neighbours;}
参数分别是sourceIns表示你在哪个数据集中找邻居,target就是找邻居的样本,kNN是指多少邻居。最后一个参数是我自己在多标签中用的。如果你不需要对特征进行选择,只是想除去类别,那么用下面的代码就可以了:
sourceIns.setClassIndex( sourceIns.numAttributes() -1 );
lnn.setInstances( sourceIns);
EuclideanDistance表示是我用的是欧几里德距离,下面的predictors表示最后一个index,也就是说算距离我只算0-predictors这么多特征,如果你不明白为什么要这样,因为你不懂多标签。下面是设置你考虑哪些特征,这里的”first-“+predictors就表示只考虑0-predictors。LinearNNSearcher是寻找邻居的类,用setDistanceFunction进行距离计算设置,再对数据源和样本信息设置用setInstances和addInstanceInfo,最后设置目标样本和找多少邻居。
这里的setAttributeIndices对我很重要,所以我看了一下:
publicvoid setAttributeIndices(String value) {
m_AttributeIndices.setRanges(value);
invalidate();
}
m_AttributeIndices是一个Range对象。下面是一个Range的例子:
publicstatic Instances getInstances( String filename )
{
try{
FileReader frData = new FileReader( filename );
Instances trainData =new Instances(frData);
return trainData;
}catch( FileNotFoundException e )
{
e.printStackTrace();
}
catch( IOException e )
{
e.printStackTrace();
}
returnnull;
}
publicstaticvoid outputRange( Instances ins )
{
Range range = new Range();
range.setRanges("first-2, 4, 10, last");
range.setUpper(ins.numAttributes() - 1);
boolean[] activeIndices =newboolean[ins.numAttributes()];
for (int i = 0; i < activeIndices.length; i++)
{
activeIndices[i] = range.isInRange(i);
System.out.print( activeIndices[i] +" " );
}
}
publicstaticvoid main(String[] args)throws Exception
{
Instances ins = getInstances("D:/DOWNLOAD/data/soybean.arff" );
outputRange( ins );
}
设置Range我用的是”first-2,4,10,last”,first表示第0个下标,last表示最后一个下标,整个的意思就是选择从第0个到第2个,和第4个,第10个,最后一个特征。setUpper表示最大下标是多少,注意setUpper函数:
publicvoid setUpper(int newUpper) {
if (newUpper >= 0) {
m_Upper = newUpper;
setFlags();
}
}
这里setFlags函数是得到哪一些特征被选中,最后在我的例子中,我用isRange来判断是否第i个特征被选中了。
其它的函数特别简单,也没什么好讲的。
- Weka开发[18]——寻找K个邻居
- Weka开发[-1]——在你的代码中使用Weka
- Weka开发[-1]——在你的代码中使用Weka
- Weka开发[-1]——在你的代码中使用Weka
- Weka开发[19]——NaiveBayes源代码分析
- Weka开发[20]——IB1源代码分析
- Weka开发[9]—KMeans源码介绍
- Weka开发[10]—NBTree源码介绍
- Weka开发[11]—J48源代码介绍
- Weka开发[0]-导入Weka包
- Weka开发[0]-导入Weka包
- 寻找前k个最小元素——用最小堆实现…
- 《剑指offer》——寻找链表中倒数第k个结点
- 每日一题——寻找倒数第k个节点
- Weka开发[17]——关联规则之Apriori
- Weka开发[6]-参数设置
- Weka开发[7]-LibSVM
- Weka开发[13]-Ensemble
- 剑指offer第4题 空格替换
- Java序列化的作用和反序列化
- iOS 协议
- MyISAM InnoDB 区别
- Frankenstein——3
- Weka开发[18]——寻找K个邻居
- mysql存储方式的区别
- 关于(++a)+(++a)
- DrectX托管net4版本异常
- Kinect测量身高
- C语言快速交换2数字
- Starling中Touch TypeError: Error #1009
- Canopy算法原理
- Set Matrix Zeros