[PYTHON] Ich habe eine fraktale Dimensionsanalyse mit der Box-Count-Methode in 3 Dimensionen versucht

Einführung

Lassen Sie uns die ** Schönheit ** der Struktur quantitativ bewerten. Ich recherchiere. Als Quantifizierungsmethode wird ** fraktale Dimension ** als ein Index verwendet.

Und um die fraktale Dimension zu finden, verwenden wir eine Methode namens ** Boxzählmethode **. Ich habe kein Beispiel dafür gefunden, wie man damit in 3D umgeht, also habe ich es als Artikel geschrieben.

Was ist die fraktale Dimension?

[Fraktale Dimension](https://ja.wikipedia.org/wiki/%E3%83%95%E3%83%A9%E3%82%AF%E3%82%BF%E3%83%AB%E6% AC% A1% E5% 85% 83) Das sagt Wikipedia. Einfach ausgedrückt können die Dimensionen zwischen der 1. und 2. Dimension sowie zwischen der 2. und 3. Dimension durch ** nicht ganzzahlige Werte ** ausgedrückt werden. Sie können ** Komplexität ** ausdrücken. Damit wird eine quantitative Bewertung von Landschaften und Gemälden durchgeführt.

Fraktale Dimensionsanalyse

Dieses Mal verwenden wir als Beispiel einen * 200 × 200 × 200 * -Würfel. Experimentieren wir als 3D * numpy * -Array, das mit * 1 * initialisiert wurde.

Lesen Sie tatsächlich die * STL * -Datei numpy-stlOrdnen Sie mit. (Details werden in Zukunft geschrieben)

Box-Zählmethode

Ich denke, dieser Artikel ist leicht zu verstehen über die Box-Zählmethode, daher werde ich darauf verlinken. Fraktale Analyse der Oberflächenrauheitskurve

Denken Sie dreidimensional daran.

  1. Teilen Sie den Würfel in ein Gitter
  2. Zählen Sie, ob das Raster Objekte enthält
  3. Sei grid_size die Länge der Gitterseite und n die Anzahl.
  4. Zeichnen Sie das Protokoll (grid_size) und das Protokoll (n).
  5. Führen Sie eine lineare Regression nach der Methode der kleinsten Quadrate durch
  6. Der Regressionskoeffizient sei die fraktale Dimension

Wir werden die Größe dieses Gitters nacheinander ändern.

Eine Funktion, die die in einer Box enthaltenen Elemente zählt

Scannen Sie das 3D-Array in der Reihenfolge x-Richtung → y-Richtung → z-Richtung

3d_fractal.py


def count(arr, x, y, z, b):
    i = j = k = 0
    b_tmp  = b
    b_tmp2 = b
    ct = 0

    j_tmp = b
    k_tmp = b
    while k < z:
        while j < y:
            while i < x:
                if (np.any(arr[i:b, j:j_tmp, k:k_tmp] == 1)):
                    ct += 1
                i += b_tmp
                b += b_tmp
            #Zurückwickeln
            j += b_tmp2
            j_tmp += b_tmp2
            b = b_tmp2
            i = 0
        #Zurückwickeln
        k += b_tmp2
        k_tmp += b_tmp2
        b = b_tmp2
        j = b_tmp2

        i = 0
        j = 0

Hauptfunktion

Wiederholen Sie den Vorgang von count (), bis sich die Gittergröße von * 200 * auf * 1/2 * um 100, 50, ... und * 1 * ändert. Wenn die Rastergröße * 1 * ist, sollte die Anzahl * 200 x 200 x 200 = 80,00,000 * betragen.

3d_fractal.py


def main():

    x = y = z = 200

    graph_x = []
    graph_y = []

    array3d = np.ones((x, y, z))
    ct_1 = np.count_nonzero(array3d == 1)

    grid_size = max(x, y, z)

    while grid_size >= 1:
        n = count(array3d, x, y, z, grid_size)
        graph_x.append(math.log(grid_size))
        graph_y.append(math.log(n))
        print(grid_size, n)
        print (math.log(grid_size), math.log(n))
        grid_size = int(grid_size / 2)

Lineare Regression

Führen Sie eine lineare Regression aus dem gezählten Ergebnis durch. Scikit-Learn-Klasse für die Regressionsverarbeitung Verwenden Sie sklearn.linear_model.LinearRegression.

3d_fractal.py


    graph_x = np.array(graph_x).reshape((len(graph_x), 1)) #Bilden Sie eine Reihe
    graph_y = np.array(graph_y).reshape((len(graph_y), 1))

    model_lr = LinearRegression()

    #Vorausschauende Modellerstellung
    model_lr.fit(graph_x, graph_y)

    plt.xlabel("log(grid_size)")
    plt.ylabel("log(n)")

    plt.plot(graph_x, graph_y, 'o')
    plt.plot(graph_x, model_lr.predict(graph_x), linestyle="solid")

    plt.grid()
    plt.show()

    #Fraktale Dimension=Regressionskoeffizienten
    fractal = model_lr.coef_[0][0] * -1 

    print("Fractal : ", fractal)

Ergebnis

Figure_1.png Hier ist das logarithmische Diagramm der Ergebnisse. Gittergröße * log * auf der horizontalen Achse

200 1
5.298317366548036 0.0
100 8
4.605170185988092 2.0794415416798357
50 64
3.912023005428146 4.1588830833596715
25 512
3.2188758248682006 6.238324625039508
12 4913
2.4849066497880004 8.499640032168648
6 39304
1.791759469228055 10.579081573848484
3 300763
1.0986122886681098 12.614077858172898
1 8000000
0.0 15.89495209964411
Fractal :  3.004579190748091

Das Ergebnis sieht so aus. Die fraktale Dimension ist * 3.004579190748091 * Es ist also fast ein theoretischer Wert. Bei der Wiederholung von * 200 * gab es einen Fall, in dem es nicht durch * 25/2 = 12 * teilbar war, sodass es eine leichte Abweichung gab.

Zusammenfassung

――Wir konnten die dreidimensionale fraktale Dimensionsanalyse mit der Box-Count-Methode verifizieren.

Verweise

"Fraktale Analyse der Oberflächenrauheitskurve", Takeo Kono, (2010), Forschungsbulletin des Präfekturinstituts Nagano, Nr. 5, S. P52-P55.

Recommended Posts

Ich habe eine fraktale Dimensionsanalyse mit der Box-Count-Methode in 3 Dimensionen versucht
Ich habe die Methode der kleinsten Quadrate in Python ausprobiert
Ich habe versucht, die Wetterkarte einer Clusteranalyse zu unterziehen
Ich habe versucht, "Birthday Paradox" mit Python zu simulieren
Ich habe zuerst die SARS-Analyse vor dem Corona-Virus versucht
Ich habe versucht, FX technische Analyse von AI "scikit-learn"
Ich habe versucht, das Datetime-Modul von Python zu verwenden
Ich habe versucht, die Veränderung der Schneemenge für 2 Jahre durch maschinelles Lernen vorherzusagen
[New Corona] Ist der nächste Höhepunkt im Dezember? Ich habe die Trendanalyse mit Python versucht!
Zeichne ein Diagramm mit Julia ... Ich habe eine kleine Analyse versucht
Ich habe versucht, die in Python installierten Pakete grafisch darzustellen
Ich habe versucht, das Spiel in der J League vorherzusagen (Datenanalyse)
Ich habe versucht, EKG-Daten mit der K-Shape-Methode zu gruppieren
Ich habe versucht, die Methode zur Mittelung der Dollarkosten zu simulieren
Ich habe versucht, die Anzahl durch Programmieren zu erhöhen oder zu verringern
Ich habe die einfachste Methode zur Klassifizierung von Dokumenten mit mehreren Etiketten ausprobiert
Was ich durch die Teilnahme am ISUCON10-Qualifying gelernt habe
Ich habe eine Klasse erstellt, um das Analyseergebnis von MeCab in ndarray mit Python zu erhalten
Ich habe den Super-Resolution-Algorithmus "PULSE" in einer Windows-Umgebung ausprobiert
Ich habe versucht, den allgemeinen Kommentar des verdammten Spiels des Jahres morphologisch zu analysieren
Ich habe versucht, den in Pandas häufig verwendeten Code zusammenzufassen
Ich habe versucht "Wie man eine Methode in Python dekoriert"
Ich habe versucht, die Zeit und die Zeit der C-Sprache zu veranschaulichen
Ich habe versucht, den Chi-Quadrat-Test in Python und Java zu programmieren.
Ich habe versucht, die im Geschäftsleben häufig verwendeten Befehle zusammenzufassen
Ich habe versucht, die Mail-Sendefunktion in Python zu implementieren
Ich habe versucht, den Inhalt jedes von Python pip gespeicherten Pakets in einer Zeile zusammenzufassen
[RHEL7 / CentOS7] Ich habe das Farbfeld des Protokollüberwachungstools eingefügt und versucht, per E-Mail zu benachrichtigen.
Ich habe die Changefinder-Bibliothek ausprobiert!
Ich habe versucht, den Datenverkehr mit WebSocket in Echtzeit zu beschreiben
Ich habe die Bewegung Python3 ausprobiert, die die Richtung im Koordinatensystem ändert
Ich habe einen AttributeError erhalten, als ich die offene Methode in Python verspottet habe
Führen Sie eine morphologische Analyse in der von GCE gestarteten maschinellen Lernumgebung durch
Ich habe versucht, den Getränkepräferenzdatensatz durch Tensorzerlegung zu visualisieren.
Ich habe versucht, das Bild mit OpenCV im "Skizzenstil" zu verarbeiten
Zum ersten Mal versuchte ein Programmieranfänger eine einfache Datenanalyse mit Programmierung
Ich habe versucht, die Befehle zusammenzufassen, die Anfängeringenieure heute verwenden
Ich habe versucht, in 3 Jahren 5 Muster der Analysebasis zu erstellen
Ich ließ RNN Sin Wave lernen und versuchte vorherzusagen
Ich habe versucht, das Bild mit OpenCV im "Bleistift-Zeichenstil" zu verarbeiten
Ich habe versucht, das Schichtplanungsproblem mit verschiedenen Methoden zu lösen
Ich habe versucht, die häufig verwendete Implementierungsmethode von pytest-mock zusammenzufassen
Ich habe versucht, alle Python-Diagramme zusammenzufassen, die von aktiven Doktoranden in der Forschung verwendet wurden [Basic]