注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Koala++'s blog

计算广告学 RTB

 
 
 

日志

 
 

Weka开发[18]——寻找K个邻居  

2009-05-03 15:34:05|  分类: 机器学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

         寻找K个邻居,这里先给出一个例子,大部分是王义写的,进行了一点点改动:

public static 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,也就是说算距离我只算0predictors这么多特征,如果你不明白为什么要这样,因为你不懂多标签。下面是设置你考虑哪些特征,这里的”first-“+predictors就表示只考虑0-predictorsLinearNNSearcher是寻找邻居的类,用setDistanceFunction进行距离计算设置,再对数据源和样本信息设置用setInstancesaddInstanceInfo,最后设置目标样本和找多少邻居。

这里的setAttributeIndices对我很重要,所以我看了一下:

public void setAttributeIndices(String value) {

    m_AttributeIndices.setRanges(value);

invalidate();

}

m_AttributeIndices是一个Range对象。下面是一个Range的例子:

public static 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();

        }

       

        return null;

    }

   

    public static void outputRange( Instances ins )

    {

        Range range = new Range();

        range.setRanges("first-2, 4, 10, last");

        range.setUpper(ins.numAttributes() - 1);

         boolean[] activeIndices = new boolean[ins.numAttributes()];

         for (int i = 0; i < activeIndices.length; i++)

         { 

            activeIndices[i] = range.isInRange(i);

            System.out.print( activeIndices[i] + " " );

         }

    }

   

    public static void 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函数:

public void setUpper(int newUpper) {

         if (newUpper >= 0) {

          m_Upper = newUpper;

              setFlags();

         }

}

    这里setFlags函数是得到哪一些特征被选中,最后在我的例子中,我用isRange来判断是否第i个特征被选中了。

    其它的函数特别简单,也没什么好讲的。

  评论这张
 
阅读(1930)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017