Автор оригинала: Mathias Gatti.
Вступление
Некоторое время назад я создал этот небольшой скрипт для преобразования чисел в шаблоны. Я не собираюсь подробно объяснять, как работает скрипт, но он вдохновлен Элементарными клеточными автоматами Стивена Вольфрама , которые преобразуют числа, такие как 30, в двоичные (00011110), а затем интерпретируют цифры как включение или выключение 8 различных основных правил (в этом случае активировано 4 правила, правило 4, 5, 6 и 7), которые определяют, когда включать и выключать пиксель на изображении.
Используя это, я могу генерировать бесконечное количество различных шаблонов, проблема в том, что большинство из них не очень интересны, и у меня нет времени проверять их один за другим. Вот почему в этом посте я объясняю, как я пытался автоматизировать процесс поиска самых интересных/красивых клеточных автоматов.
Кластеризация
Моя цель – сгруппировать узоры по их красоте. Я делаю это с помощью алгоритма кластеризации, основанного на особенностях, часто приписываемых красоте, таких как фрактальная размерность и эффективность сжатия. Вы можете прочитать больше об этих функциях здесь: Forsythe, Alex и др. “Предсказание красоты: фрактальная размерность и визуальная сложность в искусстве”. .
Код
Полный код находится здесь , но я также загрузил его в colab здесь , чтобы вы могли запускать все из своего веб-браузера.
Определение атрибутов кластеризации
Сначала я определяю ранее упомянутые атрибуты, фрактальную размерность (код, взятый из здесь ) и оценку сжатия (вес необработанного изображения tiff по сравнению с его весом, сжатым в виде изображения gif).
from fractaldimension import fractal_dimension import cv2 import os def fractalDimension(number): im = cv2.imread('images/'+str(number)+'.tiff', cv2.IMREAD_GRAYSCALE) newDimension = fractal_dimension(im, 0.9) return newDimension def compressionScore(number): statinfo = os.stat('images/'+str(number)+'.gif') gif = statinfo.st_size # size of the file statinfo = os.stat('images/'+str(number)+'.tiff') tiff = statinfo.st_size # size of the file return tiff/gif
Кластеризация
Существует несколько алгоритмов кластеризации, вы можете выбрать тот, который лучше всего подходит для вашего варианта использования.
В моем случае я в конечном итоге использовал агломеративную кластеризацию, которая лучше фиксирует кластеры, созданные этим набором данных.
Вам нужно указать количество кластеров, я пробовал с разными числами, в конце я выбрал 5, так как он хорошо сгруппировал их от нулевых шаблонов до сумасшедших и хаотичных.
from sklearn.cluster import AgglomerativeClustering import matplotlib.pyplot as plt from matplotlib import cm # Applying clustering algorithm clustering = AgglomerativeClustering(n_clusters=5).fit(df[['Fractal Dimension','Compression Eficciency']].values) df["cluster"] = clustering.labels_ # Plotting results fig, ax = plt.subplots() cmap = cm.get_cmap('gist_rainbow') ax = df.plot(kind='scatter', x='Fractal Dimension', y='Compression Eficciency',cmap=cmap, c='cluster',ax=ax) plt.show()
Результаты
Здесь я показываю несколько образцов каждого кластера. Я отсортировал их от самых простых до самых сложных. Как вы можете видеть, этот метод полезен для выявления и отбрасывания неинтересных шаблонов, таких как шаблоны из кластера 0. Также полезно определить самые красивые паттерны, большинство лучших паттернов, которые я нашел, относятся к кластеру 3, тому, который имеет большую сложность, но не самую большую фрактальную размерность.