[PYTHON] J'ai essayé l'analyse de dimension fractale par la méthode de comptage de boîtes en 3 dimensions

introduction

Evaluons quantitativement la ** beauté ** de la structure. Je fais des recherches. En tant que méthode de quantification, la ** dimension fractale ** est utilisée comme un indice.

Et, pour trouver la dimension fractale, nous utilisons une méthode appelée ** méthode de comptage de boîtes **. Je n'ai pas trouvé d'exemple de gestion de cela en 3D, alors je l'ai écrit sous forme d'article.

Quelle est la dimension fractale?

[Dimension fractale](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) C'est ce que dit Wikipedia. Pour faire simple, les dimensions entre la 1ère et la 2ème dimension et entre la 2ème et la 3ème dimension peuvent être exprimées par des ** valeurs non entières **. Vous pouvez exprimer la ** complexité **. Une évaluation quantitative des paysages et des peintures est effectuée à partir de cela.

Analyse des dimensions fractales

Cette fois, à titre d'exemple, nous utiliserons un cube * 200 × 200 × 200 *. Expérimentons comme un tableau 3D * numpy * initialisé avec * 1 *.

Lire réellement le fichier * STL * numpy-stlOrganisez en utilisant. (Les détails seront écrits dans le futur)

Méthode de comptage des boîtes

Je pense que cet article est facile à comprendre sur la méthode de comptage des boîtes, je vais donc y faire un lien. Analyse fractale de la courbe de rugosité de surface

Pensez à cela en trois dimensions.

  1. Divisez le cube en une grille
  2. Comptez si la grille contient des objets
  3. Soit grid_size la longueur du côté de la grille et n le nombre.
  4. Tracer le journal (grid_size) et le journal (n)
  5. Effectuer une régression linéaire par la méthode des moindres carrés
  6. Soit le coefficient de régression la dimension fractale

Nous modifierons la taille de cette grille une par une.

Une fonction qui compte les éléments contenus dans une boîte

Balayez le réseau 3D dans l'ordre direction x → direction y → direction z

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
            #Enrouler
            j += b_tmp2
            j_tmp += b_tmp2
            b = b_tmp2
            i = 0
        #Enrouler
        k += b_tmp2
        k_tmp += b_tmp2
        b = b_tmp2
        j = b_tmp2

        i = 0
        j = 0

fonction principale

Répétez le processus de count () jusqu'à ce que la taille du réseau passe de * 200 * à * 1/2 * par 100, 50, ... et * 1 *. Lorsque la taille de la grille est * 1 *, le nombre doit être * 200 x 200 x 200 = 80,00 000 *.

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)

Régression linéaire

Effectuez une régression linéaire à partir du résultat compté. Classe Scikit-learn pour le traitement de la régression Utilisez sklearn.linear_model.LinearRegression.

3d_fractal.py


    graph_x = np.array(graph_x).reshape((len(graph_x), 1)) #Faire une rangée
    graph_y = np.array(graph_y).reshape((len(graph_y), 1))

    model_lr = LinearRegression()

    #Création de modèles prédictifs
    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()

    #Dimension fractale=Coefficient de régression
    fractal = model_lr.coef_[0][0] * -1 

    print("Fractal : ", fractal)

résultat

Figure_1.png Voici le graphique logarithmique des résultats. Taille du treillis * log * sur l'axe horizontal

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

Le résultat ressemble à ceci. La dimension fractale est * 3.004579190748091 * C'est donc presque une valeur théorique. Lors de la répétition de * 200 *, il y avait un cas où il n'était pas divisible par * 25/2 = 12 *, donc il y avait un léger écart.

Résumé

«Nous avons pu vérifier l'analyse de dimension fractale tridimensionnelle par la méthode du comptage de boîtes. -La prochaine fois, j'aimerais écrire une méthode pour calculer la dimension fractale directement à partir du fichier * STL *.

Les références

«Analyse fractale de la courbe de rugosité de surface», Takeo Kono, (2010), Bulletin de recherche de l'Institut de technologie de la préfecture de Nagano, n ° 5, p. P52-P55.

Recommended Posts

J'ai essayé l'analyse de dimension fractale par la méthode de comptage de boîtes en 3 dimensions
J'ai essayé la méthode des moindres carrés en Python
J'ai essayé l'analyse par grappes de la carte météo
J'ai essayé de simuler "Birthday Paradox" avec Python
J'ai essayé l'analyse du SRAS avant le virus corona
J'ai essayé l'analyse technique FX par AI "scikit-learn"
J'ai essayé d'utiliser le module Datetime de Python
J'ai essayé de prédire l'évolution de la quantité de neige pendant 2 ans par apprentissage automatique
[New Corona] Le prochain pic est-il en décembre? J'ai essayé l'analyse des tendances avec Python!
Dessine un graphique avec Julia ... j'ai essayé une petite analyse
J'ai essayé de représenter graphiquement les packages installés en Python
J'ai essayé de prédire le match de la J League (analyse des données)
J'ai essayé de regrouper les données ECG en utilisant la méthode K-Shape
J'ai essayé de simuler la méthode de calcul de la moyenne des coûts en dollars
J'ai essayé d'augmenter ou de diminuer le nombre en programmant
J'ai essayé la méthode la plus simple de classification de documents multi-étiquettes
Ce que j'ai appris en participant aux qualifications ISUCON10
J'ai créé une classe pour obtenir le résultat de l'analyse par MeCab dans ndarray avec python
J'ai essayé l'algorithme de super résolution "PULSE" dans un environnement Windows
J'ai essayé l'analyse morphologique du commentaire général du putain de jeu de l'année
J'ai essayé de résumer le code souvent utilisé dans Pandas
J'ai essayé "Comment obtenir une méthode décorée en Python"
J'ai essayé d'illustrer le temps et le temps du langage C
J'ai essayé de programmer le test du chi carré en Python et Java.
J'ai essayé de résumer les commandes souvent utilisées en entreprise
J'ai essayé d'implémenter la fonction d'envoi de courrier en Python
J'ai essayé de résumer le contenu de chaque paquet enregistré par Python pip en une seule ligne
[RHEL7 / CentOS7] J'ai mis dans le swatch de l'outil de surveillance du journal et j'ai essayé de notifier par e-mail.
J'ai essayé la bibliothèque changefinder!
J'ai essayé de décrire le trafic en temps réel avec WebSocket
J'ai essayé le mouvement Python3 qui change la direction dans le système de coordonnées
J'ai eu un AttributeError en me moquant de la méthode ouverte en python
Effectuer une analyse morphologique dans l'environnement d'apprentissage automatique lancé par GCE
J'ai essayé de visualiser l'ensemble de données de préférence de boisson par décomposition tenseur.
J'ai essayé de traiter l'image en "style croquis" avec OpenCV
Le premier débutant en programmation à essayer une analyse de données simple avec programmation
J'ai essayé de résumer les commandes utilisées par les ingénieurs débutants aujourd'hui
J'ai essayé de faire 5 modèles de base d'analyse en 3 ans
J'ai fait apprendre à RNN la vague de péché et j'ai essayé de prédire
J'ai essayé de traiter l'image dans un "style de dessin au crayon" avec OpenCV
J'ai essayé de résoudre le problème de planification des équipes par diverses méthodes
J'ai essayé de résumer la méthode de mise en œuvre fréquemment utilisée de pytest-mock
J'ai essayé de résumer tous les graphiques Python utilisés dans la recherche par des étudiants diplômés en sciences actifs [Basique]