Weka自定义距离
Weka Custom Distance
我正在使用 Weka Java API 并尝试实现自定义距离 class。
我创建了一个新的 class "CustomDistance" 扩展 "NormalizableDistance" 并赋予它与 "EuclideanDistance" 完全相同的正文。我的目标是修改 "distance" 函数,使标称属性不被视为距离 0(不匹配)或 1(匹配),而是更复杂的东西。但是,通过调试代码(并在每次调用方法时弹出控制台),我发现从 class 调用的唯一方法是:
protected double updateDistance(double currDist, double diff) {
System.out.println("HERE3");
double result = currDist + diff * diff;
return result;
}
所以我想知道,如果不在距离class中,两个实例之间的距离是在哪里计算的?
实际距离计算(以及对您发布的更新函数的调用)在 NormalizableDistance#distance(Instance,Instance,double,PerformanceStats stats)
中完成,这是 DistanceFunction
接口中方法的实现。 (有几个 distance
方法,但最终,它们都委托给了这个方法)。
源代码(SVN):https://svn.cms.waikato.ac.nz/svn/weka/trunk/weka/src/main/java/weka/core/NormalizableDistance.java
(我不确定这是否已经可以作为答案,或者它是否可以被视为 "link only"...所以再多说几句:)
为了创建这样的距离函数,您可能需要更深入地研究 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 不太熟悉)
我正在使用 Weka Java API 并尝试实现自定义距离 class。
我创建了一个新的 class "CustomDistance" 扩展 "NormalizableDistance" 并赋予它与 "EuclideanDistance" 完全相同的正文。我的目标是修改 "distance" 函数,使标称属性不被视为距离 0(不匹配)或 1(匹配),而是更复杂的东西。但是,通过调试代码(并在每次调用方法时弹出控制台),我发现从 class 调用的唯一方法是:
protected double updateDistance(double currDist, double diff) {
System.out.println("HERE3");
double result = currDist + diff * diff;
return result;
}
所以我想知道,如果不在距离class中,两个实例之间的距离是在哪里计算的?
实际距离计算(以及对您发布的更新函数的调用)在 NormalizableDistance#distance(Instance,Instance,double,PerformanceStats stats)
中完成,这是 DistanceFunction
接口中方法的实现。 (有几个 distance
方法,但最终,它们都委托给了这个方法)。
源代码(SVN):https://svn.cms.waikato.ac.nz/svn/weka/trunk/weka/src/main/java/weka/core/NormalizableDistance.java
(我不确定这是否已经可以作为答案,或者它是否可以被视为 "link only"...所以再多说几句:)
为了创建这样的距离函数,您可能需要更深入地研究 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 不太熟悉)