Ich habe Tribuo von Oracle ausprobiert. Tribuo - Eine Java-Vorhersagebibliothek (v4.0)

Ich habe es tatsächlich versucht. Von der Schlussfolgerung war ich sehr besorgt. Wenn Sie sich selbst als Framework bezeichnen, können Sie Javadoc auch ordnungsgemäß auf Englisch schreiben. Dann sollten Sie den Implementierungscode richtig korrigieren, anstatt das Handbuch zu reparieren.

installieren

Ich habe Maven verwendet, um die Abhängigkeit aufzulösen. Setzen Sie nach dem Erstellen des Projekts Tribuo in der POM-Datei wie unten gezeigt.

<dependency>
    <groupId>org.tribuo</groupId>
    <artifactId>tribuo-all</artifactId>
    <version>4.0.0</version>
    <type>pom</type>
</dependency>

Um das logistische Regressionsmodell zu lernen und zu bewerten, heißt es Folgendes tun. Schreiben Sie also den folgenden Code in die Java-Klasse. Machen.

var trainSet = new MutableDataset<>(new LibSVMDataSource("train-data",new LabelFactory()));
var model    = new LogisticRegressionTrainer().train(trainSet);
var eval     = new LabelEvaluator().evaluate(new LibSVMDataSource("test-data",trainSet.getOutputFactory()));

Der Klassenname lautet TribuoSample. Was? Nanikore?

コンストラクタがないエラー01.png

Dies ist der Konstruktorteil von LibSVMDataSource. Es gibt keinen Konstruktor, der einen String als Argument verwendet.

LibSVMDataSourceコンストラクタ.png

Und was ist diese java.nio.file.Path-Schnittstelle? Die Tatsache, dass java.nio.file.Paths keine Implementierung ist ... Ist es modern, weil es statischen Zugriff auf Path.of hat?

python


        //Wollen Sie damit sagen, dass Sie so schreiben können?
        var trainSet = new MutableDataset<>(new LibSVMDataSource<>(Path.of(new URL("file:train-data").getPath()),new LabelFactory()));

        //Oder ist es so?
        var trainSet = new MutableDataset<>(new LibSVMDataSource<>(Paths.get("train-data"),new LabelFactory()));

        //Wenn ja, ist die URL nicht in Ordnung? Es ist überflüssig.
        var trainSet = new MutableDataset<>(new LibSVMDataSource<>(new URL("file:train-data"),new LabelFactory()));

Sie können es entweder manuell reparieren oder String im Hauptteil dieser Klasse akzeptieren, aber Sie sollten MutableDataset.class reparieren. Sie können es vorerst so machen.

MutableDataset



    public LibSVMDataSource(String url, OutputFactory<T> outputFactory) throws IOException {
        this(null,new URL(url),outputFactory,false,false,0);
    }

    public LibSVMDataSource(String url, OutputFactory<T> outputFactory, boolean zeroIndexed, int maxFeatureID) throws IOException {
        this(null,new URL(url),outputFactory,true,zeroIndexed,maxFeatureID);
    }

Bei der Verarbeitung des Konstruktors werden jedoch weder URL noch Pfad überprüft. Unten finden Sie den entsprechenden Code von MutableDataset.class.

LibSVMDataSource


    private LibSVMDataSource(Path path, URL url, OutputFactory<T> outputFactory, boolean rangeSet, boolean zeroIndexed, int maxFeatureID) throws IOException {
        this.outputFactory = outputFactory;
        this.path = path;
        this.url = url;
        this.rangeSet = rangeSet;
        if (rangeSet) {
            this.zeroIndexed = zeroIndexed;
            this.minFeatureID = zeroIndexed ? 0 : 1;
            if (maxFeatureID < minFeatureID + 1) {
                throw new IllegalArgumentException("maxFeatureID must be positive, found " + maxFeatureID);
            }
            this.maxFeatureID = maxFeatureID;
        }
        read();
    }

Wenn es darum geht, wie weit wir gehen In LibSVMDataSource wird # read vom Konstruktor aufgerufen. Unten ist der entsprechende Code.

LibSVMDataSource#read



    private void read() throws IOException {
        int pos = 0;
        ArrayList<HashMap<Integer,Double>> processedData = new ArrayList<>();
        ArrayList<String> labels = new ArrayList<>();

        // Idiom copied from Files.readAllLines,
        // but this doesn't require keeping the whole file in RAM.
        String line;
        // Parse the libsvm file, ignoring malformed lines.
        try (BufferedReader r = new BufferedReader(new InputStreamReader(url.openStream(),StandardCharsets.UTF_8))) {
            for (;;) {
                line = r.readLine();
                if (line == null) {
                    break;
                }
                pos++;
                String[] fields = splitPattern.split(line);
                try {
                    boolean valid = true;
                    HashMap<Integer, Double> features = new HashMap<>();
                    for (int i = 1; i < fields.length && valid; i++) {
                        int ind = fields[i].indexOf(':');
                        if (ind < 0) {
                            logger.warning(String.format("Weird line at %d", pos));
                            valid = false;
                        }
                        String ids = fields[i].substring(0, ind);
                        int id = Integer.parseInt(ids);
                        if ((!rangeSet) && (maxFeatureID < id)) {
                            maxFeatureID = id;
                        }
                        if ((!rangeSet) && (minFeatureID > id)) {
                            minFeatureID = id;
                        }
                        double val = Double.parseDouble(fields[i].substring(ind + 1));
                        Double value = features.put(id, val);
                        if (value != null) {
                            logger.warning(String.format("Repeated features at line %d", pos));
                            valid = false;
                        }
                    }
                    if (valid) {
                        // Store the label
                        labels.add(fields[0]);
                        // Store the features
                        processedData.add(features);
                    } else {
                        throw new IOException("Invalid LibSVM format file");
                    }
                } catch (NumberFormatException ex) {
                    logger.warning(String.format("Weird line at %d", pos));
                    throw new IOException("Invalid LibSVM format file", ex);
                }
            }
        }

Ich mache url.openStream () im Versuch. Es ist nur eine NumberFormatException zu fangen. In der Beschreibung der Mitgliedsvariablen ist entweder die URL oder der Pfad erforderlich.

LibSVMDataSource


    // url is the store of record.
    @Config(description="URL to load the data from. Either this or path must be set.")
    private URL url;

    @Config(description="Path to load the data from. Either this or url must be set.")
    private Path path;

Ich überprüfe, ob beide in LibSVMDataSource # postConfig null sind, aber das ist nicht gut.

LibSVMDataSource#postConfig


    @Override
    public void postConfig() throws IOException {
        if (maxFeatureID != Integer.MIN_VALUE) {
            rangeSet = true;
            minFeatureID = zeroIndexed ? 0 : 1;
            if (maxFeatureID < minFeatureID + 1) {
                throw new IllegalArgumentException("maxFeatureID must be positive, found " + maxFeatureID);
            }
        }
        if ((url == null) && (path == null)) {
            throw new PropertyException("","path","At most one of url and path must be set.");
        } else if ((url != null) && (path != null) && !path.toUri().toURL().equals(url)) {
            throw new PropertyException("","path","At most one of url and path must be set");
        } else if (path != null) {
            // url is the store of record.
            try {
                url = path.toUri().toURL();
            } catch (MalformedURLException e) {
                throw new PropertyException(e,"","path","Path was not a valid URL");
            }
        }
        read();
    }

Wenn Sie diese Art von Code schreiben, wird er von niemandem verarbeitet.

TribuoSample


public class TribuoSample {

    /**
     * @param args Hauptmethodenargumente.
     */
    public static void main(String[] args) {

        URL url = null;

        try {
            var trainSet = new MutableDataset<>(
                    new LibSVMDataSource<>(url, new LabelFactory()));
        } catch (IOException e) {
            //TODO automatisch generierter Fangblock
            e.printStackTrace();
        }
    }
}

Wenn Sie dies tun ...

StackTrace


Exception in thread "main" java.lang.NullPointerException
	at org.tribuo.datasource.LibSVMDataSource.read(LibSVMDataSource.java:204)
	at org.tribuo.datasource.LibSVMDataSource.<init>(LibSVMDataSource.java:125)
	at org.tribuo.datasource.LibSVMDataSource.<init>(LibSVMDataSource.java:105)
	at org.project.eden.adam.TribuoSample.main(TribuoSample.java:28)

In diesem Fall lautet die Nachricht, die Sie dem Benutzer übermitteln möchten: "Es ist wichtig, dass entweder die URL oder der Pfad festgelegt ist, aber Der Wert, den Sie für die URL festgelegt haben, wurde auf null gesetzt. Ich hätte dir das sagen sollen, aber es ist ein unerwarteter Fehler oder ein Stack-Trace wird ausgespuckt und der Prozess stoppt. Wenn es sich um eine Geschäftsanwendung handelt, handelt es sich immer noch um ein Framework unter dem Namen Oracle. Ich frage mich also, wie diese Art von Sturz ist. Im Fall eines Pfads greift der Konstruktor auf das Pfadobjekt zu, sodass es an Ort und Stelle nullpo ist.

Dies ist seine Umsetzung

LibSVMDataSource


    public LibSVMDataSource(Path path, OutputFactory<T> outputFactory) throws IOException {
        this(path,path.toUri().toURL(),outputFactory,false,false,0);
    }

Führen Sie das Beispiel wie folgt aus.

TribuoSample


public class TribuoSample {

    /**
     * @param args Hauptmethodenargumente.
     */
    public static void main(String[] args) {

        Path path = null;

        try {
            var trainSet = new MutableDataset<>(
                    new LibSVMDataSource<>(path, new LabelFactory()));

        } catch (IOException e) {
            //TODO automatisch generierter Fangblock
            //e.printStackTrace();
        }
    }
}

Das Ergebnis ist nicht zu sehen, NullPointerException.

Exception in thread "main" java.lang.NullPointerException
	at org.tribuo.datasource.LibSVMDataSource.<init>(LibSVMDataSource.java:97)
	at org.project.eden.adam.TribuoSample.main(TribuoSample.java:28)

Ich habe nicht erwartet, dass dies ab der ersten Zeile auf der obersten Seite des Dokuments geschieht. Beispielausführung auf einer anderen Seite.

Recommended Posts

Ich habe Tribuo von Oracle ausprobiert. Tribuo - Eine Java-Vorhersagebibliothek (v4.0)
Ich habe Tribuo von Oracle berührt. Document Tribuo - Eine Java-Vorhersagebibliothek (v4.0)
Ich erinnerte mich an Tribuo, das von Oracle veröffentlicht wurde. Tribuo - Eine Java-Vorhersagebibliothek (v4.0)
Ich habe Tribuo von Oracle berührt. Dokument Tribuo --Intro-Klassifizierung mit Iris
[Java] Ich habe versucht, mit der Grabmethode ein Labyrinth zu erstellen ♪
Java Ich habe versucht, einen einfachen Block zu brechen
Ich habe versucht, eine Java-Methode von ABCL zu verwenden
Ich habe versucht, den Block mit Java zu brechen (1)
Ich habe versucht, Java in einem Mac-Terminal auszuführen
Ich habe versucht, eine Clova-Fähigkeit in Java zu erstellen
Ich habe versucht, eine Anmeldefunktion mit Java zu erstellen
Ich habe versucht, Log4j2 auf einem Java EE-Server zu verwenden
Ich habe versucht, mit OCR eine PDF-Datei mit Java zu verarbeiten
Ich habe versucht, ein Aktienchart mit Java (Jsoup) zu kratzen.
Ich habe versucht, mit Chocolatey eine Java8-Entwicklungsumgebung zu erstellen
Ich habe versucht, das GitHub-Repository als Bibliotheksserver zu verwenden
Ich habe versucht, eine Java EE-Anwendung mit OpenShift zu modernisieren.
Ich habe versucht, in Java von einer Zeichenfolge in einen LocalDate-Typ zu konvertieren
Ich habe einen RESAS-API-Client in Java erstellt
Ich habe versucht, eine PDF-Datei mit Java part2 zu verarbeiten
Ich habe versucht, die CameraX-Bibliothek mit Android Java Fragment zu verwenden
Ich habe eine Docker-Datei erstellt, um Glassfish 5 mit Oracle Java zu starten
Ich habe Drools (Java, InputStream) ausprobiert.
Ich habe versucht, Java REPL zu verwenden
Ich habe versucht, Metaprogrammierung mit Java
Als ich mich wieder an Tribuo erinnerte, das von Oracle veröffentlicht wurde, war die Person in mir eine heiße Person.
Java hatte eine QR-Code-Erstellungsbibliothek namens QRGen, die ZXing gut umschließt, also habe ich es versucht
Ich habe ein PDF mit Java erstellt.
Ich habe eine shopify App @java erstellt
Ich habe ein wenig digdags docker.run_options ausprobiert
Eine Person, die C ++ schreibt, hat versucht, Java zu schreiben
Ich habe versucht, mit Java zu interagieren
Ich habe versucht, UDP mit Java zu kommunizieren
Ich habe das Java-Framework "Quarkus" ausprobiert.
Ich habe versucht, die Java8 Stream API zu verwenden
Ich habe versucht, JWT in Java zu verwenden
Ich habe versucht, das Java-Lernen zusammenzufassen (1)
Ich habe jetzt versucht, Java 8 zusammenzufassen
Ich habe versucht, Java Memo LocalDate zu verwenden
Ich habe versucht, Google HttpClient von Java zu verwenden
Ich habe versucht, Java mit einer Reihe zu lernen, die Anfänger klar verstehen können
Ich war süchtig nach einem einfachen Test von Jedis (Java-> Redis-Bibliothek)
Ich habe versucht, mit AI "A3RT" eine Talk-App in Java zu erstellen.