从 Weka 的 Java API 获取欧几里得距离

发布于 2024-11-24 15:31:47 字数 802 浏览 2 评论 0原文

我正在使用 Weka 机器学习库的 Java API...

我正在尝试使用 EuclidianDistance 类计算两个实例之间的距离:

http://weka.sourceforge.net/doc.dev/weka/core/EuclideanDistance.html

我有以下代码:

      EuclideanDistance ed = new EuclideanDistance(finalInst);
      double dist;

      dist = ed.distance(finalInst.firstInstance(),finalInst.lastInstance());

finalInst 是一个有效的 Instances 对象,其中包含有效的 Instance 对象...

这是使用 System.out.println 时的第一个和最后一个实例:

finalInst.firstInstance():

?,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1

finalInst.lastInstance():

?,?,?,?,1,1,?,1,?,1,?,?,1,?,?,?,?,?,1

但是当我运行时代码,它返回空指针异常...

我哪里出错了?

I'm using Weka Machine learning library's Java API...

I'm trying to calculate the distance between two instances using the EuclidianDistance class:

http://weka.sourceforge.net/doc.dev/weka/core/EuclideanDistance.html

I have this code:

      EuclideanDistance ed = new EuclideanDistance(finalInst);
      double dist;

      dist = ed.distance(finalInst.firstInstance(),finalInst.lastInstance());

finalInst is a valid Instances object that contains valid Instance objects...

Here's what the first and last instance are when you use System.out.println:

finalInst.firstInstance():

?,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1

finalInst.lastInstance():

?,?,?,?,1,1,?,1,?,1,?,?,1,?,?,?,?,?,1

But then when I run the code, it returns a null pointer exception...

Where did I go wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

极致的悲 2024-12-01 15:31:47

我有两个实用的建议:

1)深入研究 WEKA 的代码。它是开源的,因此您实际上可以将源代码添加到您的 Eclipse 项目中并使用 F3 浏览相关功能(我确实希望您使用 Eclipse 或其他一些合理的 IDE)。

2)实现你自己的欧几里德距离。这真的很简单。在这里,我什至已经为你做到了:

public double distance(List<Double> instance1, List<Double> instance2) {
    double dist = 0.0;

    for (int i = 0; i < instance1.size(); i++) {
        double x = instance1.get(i);
        double y = instance2.get(i);

        if (Double.isNaN(x) || Double.isNaN(y)) {
            continue; // Mark missing attributes ('?') as NaN.
        }

        dist += (x-y)*(x-y);
    }

    return Math.sqrt(dist);
}

I've got two practical suggestions:

1) Dig in WEKA's code. It's open-source, so you can actually add the source to your Eclipse project and browse the relevant functions with F3 (I do hope you're using Eclipse or some other reasonable IDE).

2) Implement your own Euclidean distance. It's really simple. Here, I've even done it for you:

public double distance(List<Double> instance1, List<Double> instance2) {
    double dist = 0.0;

    for (int i = 0; i < instance1.size(); i++) {
        double x = instance1.get(i);
        double y = instance2.get(i);

        if (Double.isNaN(x) || Double.isNaN(y)) {
            continue; // Mark missing attributes ('?') as NaN.
        }

        dist += (x-y)*(x-y);
    }

    return Math.sqrt(dist);
}
能否归途做我良人 2024-12-01 15:31:47

旧线程,但是:
您必须将 Instances(通常来自 ARFF 文件)对象传递给 EuclideanDistance 构造函数。
重新实现轮子通常会导致将来出现问题。
例如,属性可以是名义的。

Old thread, but:
You have to pass an Instances (that usually comes from an ARFF file) object to the EuclideanDistance constructor.
Re-implementing the wheel usually leads to problems in the future.
For example, attributes can be nominal.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文