[PYTHON] Wissenschaft "Ist Saito der Vertreter von Saito?"

Saito Problem

Was ist zu tun

"Saito" als Kanji erkannt

  • 4 Typen (2 neue Schriftarten, 2 alte Schriftarten). Laut Oriental Economy Online
  • ① Saito ist die Quelle,
  • ② Saito ist die alte Schriftart der Quelle (①).
  • ③ Saito hat beim Schreiben der neuen Schriftart (①) einen Fehler gemacht. (Erstaunliche Tatsache 1)
  • ④ Saito hat beim Schreiben der alten Schrift (②) einen Fehler gemacht. (Erstaunliche Tatsache # 2
  • Die Bevölkerung in Japan in Klammern unten ist ** ①, was die größte ist, und Saito ist die Quelle **.
Neue Schriftart Alte Schrift
Quelle ①U+658E (542,000 Menschen)
33.jpg
<fontcolor=red>Quelle
②U+9F4B(86,800Personen)
13.jpg
Quelle(①)Alte Schrift
Eigentlich,
SchreibenFehler
③U+6589(323,000 Menschen)
32.jpg
Quelle(①)のSchreibenFehler
④U+9F4A(37,300Personen)
2.jpg
AlteSchrift(②)のSchreibenFehler

Und emotional

Schließlich möchte ich, dass ** "Sai" ** ((1) Quelle) ** repräsentativ (Mitte) ** aller Sai-Zeichen (4 Typen) ist.

Also lasst uns nachsehen

  • Ich möchte eine Saito-Karte erstellen, um den ** Vertreter (Mitte) ** von Saito zu bestätigen.
  • Das verwendete Bild ist 58 x 58 = 3.364 Pixel (3.364 Dimensionen) und kann nicht auf XY-Koordinaten (2 Dimensionen) abgebildet werden.
  • Daher möchte ich eine Technik namens ** Dimensionskomprimierung ** verwenden, um auf ** 3.364 Dimensionen ⇒ 2 Dimensionen ** zu komprimieren.
  • Die Komprimierung von Zeichendimensionen wird in diesem Artikel behandelt, daher werde ich darauf verlinken.
  • Dieses Mal wird ** UMAP ** als Dimensionskomprimierungsalgorithmus verwendet.

image.png

  • Dann mit UMAP dimensional komprimieren.
from umap import UMAP
# Umap decomposition
decomp = UMAP(n_components=2,random_state=42)
# fit_transform umap(Saito 4 Zeichendaten)
embedding4 = decomp.fit_transform(all.T[[1,12,31,32]])

Überprüfung 1) Bestimmen Sie die Vertreter der vier Saito

  • Ordnen Sie mit UMap ** Kanji-Bild ** ** 2D (Ebene) ** zu und aktivieren Sie ** "Repräsentant" **.
  • Betrachten wir den ** "Schwerpunkt" für alle Daten als "Repräsentanten" **, nicht als "Mittelpunkt" (0,5, 0,5).
  • Der "Schwerpunkt" wird durch die ** x-Markierung ** dargestellt, aber wie wäre es damit? .. (Es liegt unterhalb des Schwerpunkts x.)
from sklearn.cluster import KMeans

#Clustering (1 Cluster)
clustering = KMeans(n_clusters=1,random_state=42,)
# fit_predict cluster
cl_y = clustering.fit_predict(embedding4)

# visualize (Die Implementierung wird später beschrieben)
showScatter(
    embeddings    = embedding4,
    clusterlabels = cl_y,
    centers       = clustering.cluster_centers_,
    imgs          = all.T[[1,12,31,32]].reshape(-1,h,w)
)

image.png

  • ** Es ist subtil, **
  • Bei der Berechnung des euklidischen Abstands vom "Schwerpunkt" zu "jedem Zeichen" sieht es so aus.
  • In diesem Ergebnis wurde ** ② Quellschwert (alte Schrift) ** zum Repräsentanten. ..
In der Reihenfolge der Nähe vom Schwerpunkt Brief Entfernung vom Schwerpunkt Memo
Platz 1 13.jpg 0.6281 ②Quelle(alteSchriftart)
2. Platz 32.jpg 0.6889 ③Fehler(neueSchriftart)
3. Platz 33.jpg 0.7339 ①Quelle(neueSchriftart)
4. Platz 02.jpg 0.8743 ④Fehler(alteSchriftart)

Überprüfung 2) Bestimmen Sie den "Vertreter" von 33 Saito

Wie viele Arten von Saito gibt es übrigens?

  • Es gibt nur vier Arten von Kanji, aber um die Wahrheit zu sagen, laut wikipedia
  • Es gibt 31 Muster anderer Varianten als "Sai, Sai".
  • Andererseits erkennt das Justizministerium nur vier Sai-Zeichen an: "Sai, Sai, Sai, Sai".
  • Mit anderen Worten, ** Von allen 33 Mustern werden nur 4 als Kanji akzeptiert **
  • Zusätzlich zu Saito, das als Kanji anerkannt ist, würde ich gerne ** "Vertreter" aller 33 Saito ** sehen

image.png

  • Jetzt komprimieren wir die Abmessungen von 33 Zeichen mit UMAP.
from umap import UMAP
# Umap decomposition
decomp = UMAP(n_components=2,random_state=42)
# fit_transform umap(Alle 33 Zeichendaten)
embeddings = decomp.fit_transform(all.T)

Was ist der "Vertreter" der 33 "Saito"?

  • Verwenden Sie UMAP, um die Abmessungen zu komprimieren und die Kanji zu überprüfen, die sich in der Nähe des "Schwerpunkts" befinden.
from sklearn.cluster import KMeans
# clustering(Anzahl der Cluster: 1)
clustering = KMeans(n_clusters=1, random_state=42)
# fit_predict cluster
cl_y = clustering.fit_predict(embeddings)
# visualize
showScatter(embeddings, cl_y, clustering.cluster_centers_)
download.png
Anstelle des erwarteten "sai" wird befindet sich in der Nähe des Vertreters (Mitte). ..
  • Die Reihenfolge des Abstands vom Schwerpunkt (oben) ist wie folgt. Ww das läuft nicht wie erwartet
In der Reihenfolge der Nähe vom Schwerpunkt Brief Entfernung vom Schwerpunkt Memo
Platz 1 28.jpg 0.494
2. Platz 30.jpg 0.787
3. Platz 27.jpg 1.013
4. Platz 31.jpg 1.014

Überprüfung 3) Wählen Sie 4 Zeichen des Vertreters "Saito"

  • "Nicht in der Mitte" hat nicht funktioniert, aber ** 4 Typen ** werden als Kanji akzeptiert.
  • Dann ist das Kanji auf dieser Karte in 4 Cluster unterteilt. Welches Kanji ist der Schwerpunkt jedes Clusters?
  • Mit anderen Worten, ich möchte die repräsentativen 4 Zeichen ** aus allen 33 Zeichen auswählen und sehen.
  • Unter Verwendung des Clustering-Algorithmus KMeans wird dieser wie unten gezeigt in 4 Cluster unterteilt.
from sklearn.cluster import KMeans
# clustering(Anzahl der Cluster: 4)
clustering = KMeans(n_clusters=4, random_state=42)
# fit_predict cluster
cl_y = clustering.fit_predict(embeddings)
# visualize
showScatter(embeddings, cl_y, clustering.cluster_centers_)
download.png
  • Die Zeichen jedes Clusters und die Zeichen in der Nähe des Schwerpunkts sind wie folgt.
  • Irgendwie scheint es ein Cluster zu sein, der die Eigenschaften von Kanji (Monat und Anzeige) erfasst.
  • Erfassen die Punkte nahe der Mitte des Clusters die Eigenschaften des Clusters? Ist subtil.
  • 4 Es kann nicht als Cluster klassifiziert werden und roter Cluster </ font> enthält mehrere Muster.
  • Es scheint, dass wir es etwas mehr klassifizieren müssen **
  • Wenn Sie einen kurzen Blick darauf werfen, scheint es, dass Sie, wenn Sie ** mal 8 Cluster ** haben, in der Lage sind, es schön zu teilen.
No Cluster Schwerpunkt Andere Zeichen enthalten
1 rot 25.jpg 19.jpg33.jpg20.jpg21.jpg 27.jpg28.jpg 30.jpg31.jpg
2 Orange 26.jpg 13.jpg14.jpg15.jpg16.jpg17.jpg18.jpg22.jpg23.jpg24.jpg
3 Blau 29.jpg 10.jpg32.jpg 11.jpg
4 Grün 08.jpg 01.jpg02.jpg03.jpg04.jpg05.jpg06.jpg07.jpg08.jpg 12.jpg

Überprüfung 4) 8 Versuchen Sie es mit Clustering

  • Früher gab es 4 Cluster, um 4 repräsentative Kanji-Zeichen auszuwählen.
  • Bei Betrachtung der Ergebnisse gab es jedoch einige Cluster, die nicht sauber getrennt werden konnten. Stellen Sie daher die Anzahl der Cluster auf 8 ein.
  • Die Ergebnisse sind wie folgt.
from sklearn.cluster import KMeans
# clustering(Anzahl der Cluster: 8)
clustering = KMeans(n_clusters=8, random_state=42)
# fit_predict cluster
cl_y = clustering.fit_predict(embeddings)
# visualize
showScatter(embeddings, cl_y, clustering.cluster_centers_)
download.png
  • Es ist nicht so, dass sie ordentlich getrennt sind, aber es fühlt sich an, als wären sie sortiert.
No Cluster Clusterに含まれる字
1 Pfirsich 13.jpg15.jpg33.jpg18.jpg
2 rot 14.jpg22.jpg24.jpg26.jpg
3 Tee 16.jpg17.jpg23.jpg
4 Asche 30.jpg31.jpg 28.jpg
5 Orange 19.jpg20.jpg21.jpg25.jpg 27.jpg
6 Blau 10.jpg32.jpg29.jpg
7 lila 11.jpg12.jpg01.jpg
8 Grün 02.jpg03.jpg04.jpg05.jpg06.jpg07.jpg08.jpg09.jpg
  • Leider orange </ b> </ font>![27.jpg](https: //qiita-image-store.s3.ap-northeast-1) .amazonaws.com / 0/183826 / 666133d0-3d55-6c0a-de96-ef8ab943afbe.jpeg) und grey </ b> </ font>![28.jpg] Unter (https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/0ba6a86b-3e46-d8a4-d2ac-6443ecda4d83.jpeg) ist der Cluster beschädigt.
  • Da es sich bei beiden jedoch um Daten an der Grenze des Clusters handelt, werden meine Gedanken vermittelt (lacht). image.png

Überprüfung 5) Überprüfen Sie, wie viele Cluster gültig sind

  • 4 Cluster, die den 4 als Kanji registrierten Zeichen entsprechen.
  • Dann habe ich mir die Ergebnisse von 4 Clustern angesehen und versucht, sie in 8 Cluster zu unterteilen.
  • Wirklich ** Wie viele Cluster sind angemessen? ** ** **
  • Als Methode zur Auswahl der Anzahl der Cluster möchte ich hier den Status der Cluster mithilfe der folgenden drei Methoden visualisieren und untersuchen.
  1. Elbow Chart
  2. Silhouette Chart
  3. dendrogram

Elbow Chart

  • Das Ellbogendiagramm ist ein Diagramm mit ** Datenvariationen in jedem Cluster ** auf der vertikalen Achse und ** Anzahl der Cluster ** auf der horizontalen Achse.
  • Sie können die Abweichung verringern, indem Sie die Anzahl der Cluster erhöhen. Es ist jedoch auch ein Problem, dass zu viele Cluster vorhanden sind.
  • Daher werden in dieser Abbildung ** die Anzahl der Cluster ** und ** die Anzahl der Cluster berücksichtigt, die Datenschwankungen unterdrücken können **.
  • Yellowbrick wird zum Zeichnen verwendet.
from yellowbrick.cluster import KElbowVisualizer
vis = KElbowVisualizer(
    KMeans(random_state=42),
    k=(1,34) #Anzahl der Cluster (Bereich auf der horizontalen Achse))
)
vis.fit(embeddings)
vis.show()
download.png
  • Das Gefühl, das Sie sehen, ist
  • Bis zu 5 Cluster, ** Datenvariabilität (Durchschnitt) nahm ab **, danach wurde sie jedoch flach.
  • Daher scheint ** in 5 Cluster eingeteilt ** gut zu sein = repräsentatives Kanji ist ** 5 Typen ** scheint gut zu sein.
  • Aber schauen wir uns die vergrößerte Version an (vergrößert um 4-18)
  • Es scheint einen Wendepunkt in 5 zu geben, aber er ist von ** um 10 ** flach geworden.
  • Mit anderen Worten, es scheint kein Fehler zu sein, ** in 8 Cluster zu klassifizieren und 8 repräsentative Kanji zu entscheiden **.
from yellowbrick.cluster import KElbowVisualizer
vis = KElbowVisualizer(
    KMeans(random_state=42),
    k=(4,19) #Anzahl der Cluster (Bereich auf der horizontalen Achse))
)
vis.fit(embeddings)
vis.show()
download.png

Silhouette Chart

  • Silhouette Chart ist ein Diagramm, das für jeden Cluster Folgendes ausdrückt.
  • Vertikale Achse (Dicke des Diagramms): Anzahl der Proben im Cluster
  • Horizontale Achse (Diagrammlänge): Silhouette-Koeffizient des Clusters
  • Gestrichelte Linie: Durchschnittlicher Silhouette-Koeffizient
  • Aus der Perspektive geht es darum, die Anzahl der Glasta zu ermitteln, die die folgenden Anforderungen erfüllt.
  • Gleiche Anzahl von Proben für alle Cluster = gleiche Dicke
  • Der Silhouette-Koeffizient aller Glasta liegt nahe am Durchschnitt = die Länge liegt nahe an der gestrichelten Linie
  • Ebenso wird Yellowbrick zum Zeichnen verwendet.
from yellowbrick.cluster import silhouette_visualizer
fig = plt.figure(figsize=(15,25))
#Zeichnen Sie 4 bis 9 Cluster zusammen
for i in range(4,10):
    ax = fig.add_subplot(4,2,i-1)
    silhouette_visualizer(KMeans(i),embeddings)
  • Wie Sie sehen können, ist das Muster oben rechts (** 5 Cluster) schön. download.png

dendrogram

  • Es ist ein Diagramm, das die ** Nähe ** zwischen Clustern wie eine Turniertabelle ausdrückt.
  • Da es sich um ein Diagramm handelt, das beim hierarchischen Clustering verwendet werden kann, wird das hierarchische Clustering von Scipy anstelle von KMeans verwendet.
  • Die Ansicht ist wie folgt.
  • Cluster mit Blättern als Daten und Zweige derselben Farbe mit demselben Bereich
  • Höhe ist der Abstand zwischen Clustern
from scipy.cluster.hierarchy import linkage, dendrogram
Z = linkage(
    y = embeddings,
    method = 'weighted',
    metric = "euclidean",
)

R = dendrogram(
    Z=Z,
    color_threshold=1.2, #Passen Sie die Anzahl der Cluster mit diesem Schwellenwert an
    show_contracted=False,
)
  • ** Es wäre schön, wenn die Anzahl der Zweige jeder Farbe gut ausbalanciert und die Höhen gleich wären. Ist die Anzahl der Cluster schließlich etwa 5?
Anzahl der Cluster Dendrogramm Kommentar
download.png rotNur ein bisschen teuer
download.png Die Höhe ist gleichmäßig
lilaIch mache mir Sorgen um ein paar
Es fühlt sich ziemlich gut an
download.png Die Höhe und Anzahl sind gleich,
Ist es zu fein geteilt?

Überprüfung 6) Versuchen Sie, 5 Cluster zu erstellen

  • Da ich die Anzahl der Cluster untersucht habe, möchte ich noch einmal darstellen, wie es mit 5 Clustern aussehen wird.
  • Klingt ziemlich gut. Immerhin sind es 5 Cluster?
from sklearn.cluster import KMeans
# clustering(Anzahl der Cluster: 5)
clustering = KMeans(n_clusters=5, random_state=42)
# fit_predict cluster
cl_y = clustering.fit_predict(embeddings)
# visualize
showScatter(embeddings, cl_y, clustering.cluster_centers_)
download.png
No Cluster Schwerpunkt Andere Zeichen enthalten
1 Blau 15.jpg 13.jpg14.jpg33.jpg18.jpg
2 lila 23.jpg 16.jpg17.jpg22.jpg24.jpg26.jpg21.jpg
3 Grün 27.jpg 19.jpg20.jpg25.jpg 27.jpg28.jpg 30.jpg31.jpg
4 rot 29.jpg 32.jpg10.jpg 11.jpg
5 Orange 08.jpg 01.jpg02.jpg03.jpg04.jpg05.jpg06.jpg07.jpg09.jpg 12.jpg

Zusammenfassung

Impressionen

  • Als Fluss,
  • Wählen Sie zunächst einen Vertreter mit 4 als Kanji registrierten Zeichen aus
  • Wählen Sie für alle 33 Zeichen, die nicht als Kanji registriert sind, 1, 4 oder 8 Zeichen aus.
  • In Anbetracht der angemessenen Anzahl von Clustern habe ich am Ende 5 Zeichen ausgewählt, da 5 Cluster gut zu sein schienen.
  • Die repräsentativen Kanji sind wie folgt, aber mehr als die Entscheidung über den Vertreter
  • Es ist auch interessant, dass ** Kanji mit ähnlichen Formen in der Nähe ** auf der XY-Ebene mit 3000 komprimierten Dimensionen platziert werden.
  • Es war interessant, ** Gruppen nach Kopf ** mit entfernungsbasiertem Clustering erstellen zu können.
  • Die Anzahl der Cluster wurde basierend auf den Ergebnissen der Ellbogenmethode, der Silhouette-Methode und des Dendogramms ebenfalls mit 5 Clustern bewertet.
  • Es war auch interessant, dass die ** Ergebnisse der Cluster-Visualisierung von 5 Clustern ziemlich gut waren **.

Bestätigungsliste

No Wie man wählt Vertreter Saito
1 Von 4 erkannten Kanji
1 ZeichenWenn Sie möchten, ist der Vertreter
13.jpg
2 Von allen 33 Kanji
1 ZeichenWenn du wählst
28.jpg
3 Von allen 33 Kanji
4 ZeichenWenn du wählst
25.jpg26.jpg29.jpg08.jpg
4 Von allen 33 Kanji
8 CharaktereWenn du wählst
21.jpg26.jpg29.jpg31.jpg07.jpg12.jpg15.jpg19.jpg
5 Alle 33 Kanji
Wie viele ClusterSollte unterteilt werden in
Über 5 ClusterSieht gut aus
6 Von allen 33 Kanji
5 ZeichenWenn du wählst
08.jpg15.jpg23.jpg27.jpg29.jpg

Schließlich

  • Danke, dass du dich mit so einer dummen Geschichte befasst hast.
  • Wenn Sie möchten, würde ich es begrüßen, wenn Sie es teilen könnten.

Referenzinformationen

  • Über UMAP
    • https://umap-learn.readthedocs.io/en/latest/index.html
  • Diskussion über Clustering in UMAP (scheint zu sein)
    • https://umap-learn.readthedocs.io/en/latest/index.html
  • Über KMeans
    • https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html
  • Untersuchen der Anzahl der Cluster (gelber Backstein)
    • https://www.scikit-yb.org/en/latest/api/cluster/elbow.html
    • https://www.scikit-yb.org/en/latest/api/cluster/silhouette.html
  • Dendogrammzeichnung
    • https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.cluster.hierarchy.dendrogram.html

Visualisierungsfunktion

  • Ich habe auf [diesen Artikel] verwiesen (https://qiita.com/stwind/items/1c1025799b8e7a274c0f). Vielen Dank. Ich werde verlinken.
%matplotlib inline
%config InlineBackend.figure_format = 'retina'

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.lines as mlines
from matplotlib import offsetbox
from sklearn.preprocessing import MinMaxScaler
from PIL import Image
import matplotlib.patches as patches

rc = {
  'font.family': ['sans-serif'],
  'font.sans-serif': ['Open Sans', 'Arial Unicode MS'],
  'font.size': 12,
  'figure.figsize': (8, 6),
  'grid.linewidth': 0.5,
  'legend.fontsize': 10,
  'legend.frameon': True,
  'legend.framealpha': 0.6,
  'legend.handletextpad': 0.2,
  'lines.linewidth': 1,
  'axes.facecolor': '#fafafa',
  'axes.labelsize': 10,
  'axes.titlesize': 14,
  'axes.linewidth': 0.5,
  'xtick.labelsize': 10,
  'xtick.minor.visible': True,
  'ytick.labelsize': 10,
  'figure.titlesize': 14
}
sns.set('notebook', 'whitegrid', rc=rc)

def colorize(d, color, alpha=1.0):
  rgb = np.dstack((d,d,d)) * color
  return np.dstack((rgb, d * alpha)).astype(np.uint8)

colors = sns.color_palette('tab10')

def showScatter(
    embeddings,
    clusterlabels,
    centers = [],
    imgs = all.T.reshape(-1,h,w),
):
    fig, ax = plt.subplots(figsize=(15,15))
    
    #Skalierung vor dem Zeichnen des Streudiagramms
    scaler = MinMaxScaler()
    embeddings = scaler.fit_transform(embeddings)
    
    source = zip(embeddings, imgs ,clusterlabels)
    
    #Zeichnen Sie Kanji auf ein Streudiagramm
    cnt = 0
    for pos, d , i in source:
        cnt = cnt + 1
        img = colorize(d, colors[i], 0.5)
        ab = offsetbox.AnnotationBbox(offsetbox.OffsetImage(img),0.03 + pos * 0.94,frameon=False)
        ax.add_artist(ab)
          
    #Zeichnen Sie konzentrische Kreise vom Schwerpunkt
    if len(centers) != 0:
        for c in scaler.transform(centers):
            for r in np.arange(3,0,-1)*0.05:
                circle = patches.Circle(
                    xy=(c[0], c[1]),
                    radius=r,
                    fc='#FFFFFF', 
                    ec='black'
                )
                circle.set_alpha(0.3)
                ax.add_patch(circle)

            ax.scatter(c[0],c[1],s=300,marker="X")
  

    #Achsenzeichnungsbereich
    limit = [-0.1,1.1]
    plt.xlim(limit)
    plt.ylim(limit)
    plt.show()

Recommended Posts