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.
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?
Dies ist der Konstruktorteil von LibSVMDataSource. Es gibt keinen Konstruktor, der einen String als Argument verwendet.
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