Hallo, das ist Sumiyama Wasser.
Fortsetzung der vorherigen Sitzung. [Einführung in die Informatik Teil 2: Versuchen wir es mit maschinellem Lernen] Implementieren wir die k-Mittelungsmethode in Java-Abstand zwischen Daten-
Wenn Sie sich freuen, Sie kennenzulernen, schauen Sie sich bitte den Anfang der Serie an. [Einführung in die Informatik Nr. 0: Versuchen wir es mit maschinellem Lernen] Implementieren wir die k-Mittelungsmethode in Java
Dieses Mal werde ich über die Idee des "Zentrums des Datensatzes" sprechen.
Ich habe in diesem Artikel über die Vorbereitung dieser Umgebung geschrieben. Hinweise zum Starten der Neuentwicklung mit IntelliJ + Gradle + SpringBoot + JUnit5 (Jupiter)
Ich werde etwas früher über „Warum brauchen Sie so eine Denkweise?“ Sprechen, aber ich werde darüber sprechen, was ich tun möchte.
Es ist schneller, die Figur zu sehen, als sie in Worten zu erklären. Bitte sehen Sie hier.
Wenn es mehrere Daten wie diese blauen Punkte gibt, wo befindet sich das Zentrum dieser Gruppe? Ich würde gerne definieren.
0th sprach ebenfalls darüber, aber Menschen können beurteilen, dass es sich um "diesen Bereich" handelt, aber er wird numerisch auf dem Computer berechnet. Ich muss eine Definition geben, damit ich es tun kann.
Ich bin schon lange damit betraut, aber hier werde ich den ** arithmetischen Durchschnitt (zusätzlicher Durchschnitt) ** verwenden, der im Alltag bekannt ist. [^ 1]
Es ist diejenige, die für "durchschnittliche Punktzahl der Mathematik" verwendet wird. Es ist die Summe aller Mitglieder und geteilt durch die Anzahl der Personen.
Vollständiger Name | Mathematik-Punktzahl |
---|---|
Herr A. | 70 Punkte |
Herr B. | 60 Punkte |
Herr C. | 90 Punkte |
Herr D. | 50 Punkte |
In diesem Fall beträgt die durchschnittliche Punktzahl
(70+60+90+50)/4 = 67.5
Mit anderen Worten, es werden 67,5 Punkte sein.
Wir werden diese Idee auf die numerischen Werte von Koordinaten anwenden. Es sieht aus wie die Abbildung, wenn man es mit zweidimensionalen Daten betrachtet. Der Durchschnitt der Zahlen in horizontaler und vertikaler Richtung ist die "Mittelkoordinate".
Ich habe die getCentroid-Methode zu den Klassen hinzugefügt, die ich bisher erstellt habe.
package net.tan3sugarless.clusteringsample.lib.data;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.ToString;
import lombok.Value;
import net.tan3sugarless.clusteringsample.exception.DimensionNotUnifiedException;
import net.tan3sugarless.clusteringsample.exception.NullCoordinateException;
import net.tan3sugarless.clusteringsample.exception.UnexpectedCentroidException;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
/**
*Koordinatensatz auf dem euklidischen Distanzraum
*/
@Getter
@ToString
@EqualsAndHashCode
@Value
public class EuclideanSpace {
private final List<List<Double>> points;
private final int dimension;
//
//~~ weggelassen ~~
//
/**
*Suchen Sie die Koordinaten, die die Mittelpunkte jedes Punkts sind, der zur Instanz gehört
* <p>
*Das Zentrum ist der arithmetische Durchschnitt
*
* <pre>
*Nr. I im n-dimensionalen Raum,(x11+x21+....+xm1)/m,Sei xij das j-te Element des Augenpunktes,*
* [x11, x12,...,x1n],[x21, x22,...,x2n]
*Und m Punkte sind gegeben, die Koordinaten des Mittelpunkts sind
*
* [(x11+x21+....+xm1)/m,(x12+x22+....+xm2)/m,...,(x1n+x2n+....+xmn)/m]
*Wird sein.
*
*Mach die Berechnung.
* </pre>
*
* @Rückgabekoordinaten zurückgeben
* @löst UnexpectedCentroidException aus Grundsätzlich grundsätzlich unmöglich
*/
public List<Double> getCentroid() {
return IntStream
.range(0, dimension)
.boxed()
.map(i -> points.stream().mapToDouble(point -> point.get(i)).average().orElseThrow(UnexpectedCentroidException::new))
.collect(Collectors.toList());
}
}
Und testen
/**
* points :0 Dimension/2D x 3 Elemente
*/
static Stream<Arguments> testGetCentroidProvider() {
return Stream.of(
//@formatter:off
Arguments.of(Collections.emptyList(), Collections.emptyList()),
Arguments.of(asList(Collections.emptyList(), Collections.emptyList(), Collections.emptyList()), Collections.emptyList()),
Arguments.of(asList(asList(2.0, -4.0), asList(1.0, 0.0), asList(6.0, 1.0)), asList(3.0, -1.0))
//@formatter:on
);
}
@ParameterizedTest
@MethodSource("testGetCentroidProvider")
@DisplayName("Mittelberechnungstest")
void testGetCentroid(List<List<Double>> points, List<Double> centroid) {
EuclideanSpace space = new EuclideanSpace(points);
Assertions.assertEquals(centroid, space.getCentroid());
}
Das ist alles für heute. Nachdem wir alle Teile haben, werden wir das nächste Mal die Hauptlogik der k-Mittelungsmethode erklären.
Ich habe die Version dieses Mal auf Github mit Tag erklärt, also schauen Sie bitte, wenn Sie möchten. https://github.com/tan3nonsugar/clusteringsample/releases/tag/v0.0.3
[^ 1]: Es gibt andere Typen wie den Medianwert in der Definition von "Mitte", aber da die Geschichte verwirrend ist, ist die Geschichte auf den arithmetischen Durchschnitt festgelegt.
Recommended Posts