【问题标题】:Weka Custom DistanceWeka 自定义距离
【发布时间】:2016-02-19 05:24:47
【问题描述】:

我正在使用 Weka Java API 并尝试实现自定义距离类。

我创建了一个扩展“NormalizableDistance”的新类“CustomDistance”,并赋予它与“EuclideanDistance”相同的主体。我的目标是修改“距离”函数,以便名义属性不被视为距离 0(不匹配)或 1(匹配),而是更复杂的东西。但是,通过调试代码(并在每次调用方法时向控制台发送消息),我发现从该类调用的唯一方法是:

 protected double updateDistance(double currDist, double diff) {
        System.out.println("HERE3");
        double result = currDist + diff * diff;
        return result;
    }

所以我想知道,如果不在距离类中,两个实例之间的距离在哪里计算?

【问题讨论】:

  • 如果您找到了一种方法来替换名义属性的默认距离函数,请分享您的发现。我正在尝试做同样的事情,但不知道如何继续。

标签: java weka


【解决方案1】:

实际距离计算(以及对您发布的更新函数的调用)在NormalizableDistance#distance(Instance,Instance,double,PerformanceStats stats) 中完成,这是DistanceFunction 接口中方法的实现。 (有几个distance 方法,但最终,它们都委托给这个方法)。

文档:http://weka.sourceforge.net/doc.dev/weka/core/NormalizableDistance.html#distance(weka.core.Instance,%20weka.core.Instance,%20double,%20weka.core.neighboursearch.PerformanceStats)

源代码(SVN):https://svn.cms.waikato.ac.nz/svn/weka/trunk/weka/src/main/java/weka/core/NormalizableDistance.java

(我不确定这是否已经有资格作为答案,或者它是否可以被视为“仅链接”......所以还有一些话:)

为了创建这样的距离函数,您可能需要更深入地研究 Weka 的概念和源代码。最终,您可能必须从 NormalizableDistance 重写此方法,在该方法中进行实际比较,并为名义属性返回 0 或 1:

protected double difference(int index, double val1, double val2) {
    switch (m_Data.attribute(index).type()) {
        case Attribute.NOMINAL:
            if (Utils.isMissingValue(val1) || Utils.isMissingValue(val2)
                || ((int) val1 != (int) val2)) {
                return 1;
            } else {
                return 0;
            }
        ....
}

也许已经有更简单或更优雅(内置)的方法来实现这一点 - 我对 weka 不太熟悉)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 2015-09-16
    • 2016-08-31
    • 1970-01-01
    相关资源
    最近更新 更多