0

Javaでいくつかの点の幾何学的中央値を計算しています。(x,y)を計算するGeometric medianには、まずcentroidすべてのポイントを計算し、次にこれcentroidを使用して を計算しますGeometric median。私のコードは正常に動作しますが、時々無限ループに陥ります (私はそう思います)。問題は私のwhile状態にあります。このwhile条件は、入力ポイントに応じて変更する必要がありますが、方法がわかりません。以下に完全なコードを入れます。

import java.util.ArrayList;

public class GeometricMedian {

    private static ArrayList<Point> points = new ArrayList<Point>();

    private class Point {
        private double x;
        private double y;

        Point(double a, double b) {
            x = a;
            y = b;
        }
    }

    public static void main(String[] args) {
        GeometricMedian gm = new GeometricMedian();
        gm.addPoints();
        Point centroid = gm.getCentroid();
        Point geoMedian = gm.getGeoMedian(centroid);
        System.out.println("GeometricMedian= {" + (float) geoMedian.x + ", "
                + (float) geoMedian.y + "}");
    }

    public void addPoints() {
        points.add(new Point(0, 1));
        points.add(new Point(2, 5));
        points.add(new Point(3, 1));
        points.add(new Point(4, 0));
    }

    public Point getCentroid() {
        double cx = 0.0D;
        double cy = 0.0D;
        for (int i = 0; i < points.size(); i++) {
            Point pt = points.get(i);
            cx += pt.x;
            cy += pt.y;
        }
        return new Point(cx / points.size(), cy / points.size());
    }

    public Point getGeoMedian(Point start) {
        double cx = 0;
        double cy = 0;

        double centroidx = start.x;
        double centroidy = start.y;
        do {
            double totalWeight = 0;
            for (int i = 0; i < points.size(); i++) {
                Point pt = points.get(i);
                double weight = 1 / distance(pt.x, pt.y, centroidx, centroidy);
                cx += pt.x * weight;
                cy += pt.y * weight;
                totalWeight += weight;
            }
            cx /= totalWeight;
            cy /= totalWeight;
        } while (Math.abs(cx - centroidx) > 0.5
                || Math.abs(cy - centroidy) > 0.5);// Probably this condition
                                                    // needs to change

        return new Point(cx, cy);
    }

    private static double distance(double x1, double y1, double x2, double y2) {
        x1 -= x2;
        y1 -= y2;
        return Math.sqrt(x1 * x1 + y1 * y1);
    }
}

Geometric medianバグを修正するのを手伝ってください。また、いくつかの 2D ポイントを計算するためのより良い方法がある場合は、ここに書いてください。ありがとうございました。

4

2 に答える 2

0

2 つのループが必要な理由がわかりません。すべてのポイントのループのみが必要です。あなたの見解では、もう一方の理由は何ですか?

于 2012-04-15T13:08:47.930 に答える
0

これを解決する 1 つの方法は、特定の回数反復することです。これは、特定のしきい値に収束するか、定義済みの反復回数後に停止する K 平均法に似ています。

于 2013-01-25T02:17:03.600 に答える