[Einführung in die Informatik Teil 3: Versuchen wir es mit maschinellem Lernen] Implementieren wir die k-Mittelungsmethode im Java-Center of data set-

Einführung

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.

Umgebung

Ich habe in diesem Artikel über die Vorbereitung dieser Umgebung geschrieben. Hinweise zum Starten der Neuentwicklung mit IntelliJ + Gradle + SpringBoot + JUnit5 (Jupiter)

Was du machen willst

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.

image.png

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.

Wie berechnet man das Zentrum?

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".

image.png

Ich werde es umsetzen

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());
    }

Fahren Sie mit dem nächsten Mal fort

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

[Einführung in die Informatik Teil 3: Versuchen wir es mit maschinellem Lernen] Implementieren wir die k-Mittelungsmethode im Java-Center of data set-
[Einführung in die Informatik Teil 2: Versuchen Sie maschinelles Lernen] Lassen Sie uns die k-Mittelungsmethode in Java-Abstand zwischen Daten implementieren.
[Einführung in die Informatik Teil 1: Versuchen wir es mit maschinellem Lernen] Implementieren wir die k-Mittelungsmethode in Java - Über das Konzept der Koordinaten -
[Einführung in die Informatik Nr. 0: Versuchen Sie maschinelles Lernen] Lassen Sie uns die k-Mittelungsmethode in Java implementieren
Einführung in das maschinelle Lernen mit Spark "Price Estimation" # 2 Datenvorverarbeitung (Umgang mit Kategorievariablen)
Versuchen Sie, Yuma in Ruby zu implementieren
Versuchen Sie, Yuma in Java zu implementieren