gpt4 book ai didi

java - Weka 自定义距离

转载 作者:行者123 更新时间:2023-11-30 03:10:10 27 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

文档: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 和源代码的概念。最终,您可能必须从 NormalizedDistance 重写此方法,在该方法中进行实际比较,并为标称属性返回 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 不太熟悉)

关于java - Weka 自定义距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33763741/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com