Эффективный способ визуализации и интерпретации большого набора данных каротажа

Уменьшение размерности - распространенный этап обработки данных. Этот процесс полезен для проектирования функций или визуализации данных. Слишком много функций в наборе данных может впоследствии усложнить визуализацию и анализ данных. Следовательно, для решения этой проблемы необходимо уменьшение размерности.

Уменьшение размерности не приводит к автоматическому уменьшению существующих функций. Этот метод сначала объединит все функции в наборе данных на несколько компонентов в соответствии с используемым нами алгоритмом. Существует два разных метода уменьшения размерности: Линейный (анализ главных компонентов) или Нелинейный (изучение многообразия). В этой статье мы реализуем и сравним эти два метода, используя данные каротажа.

Основная теория

Анализ главных компонентов

Анализ главных компонентов - это неконтролируемый метод, который выполняет линейное преобразование для уменьшения размера наших данных. PCA (анализ главных компонентов) может сократить данные до более низкого измерения, сохраняя при этом информацию (дисперсию) в наших данных.

PCA преобразует наши данные в собственный вектор и собственное значение. Собственный вектор также может называться основными компонентами (ПК), как показано на рис. 1. Количество ПК можно выбрать в зависимости от того, какое измерение мы хотим использовать.

Многообразное обучение

Подобно PCA, Manifold Learning - это неконтролируемые методы, которые могут уменьшить количество функций в наших данных. Однако Manifold Learning - это метод уменьшения размерности на нелинейной основе. В этой статье будут рассмотрены разнообразные методы обучения: Ядро PCA и Спектральное встраивание.

Ядро PCA

Kernel PCA (kPCA) в основном представляет собой PCA, использующий параметр ядра. Ядро - это функция, которую можно настроить так, чтобы она могла преобразовывать данные в нелинейную форму. Некоторые популярные функции ядра - радиальные, полиномиальные и косинусные.

Функция ядра преобразует исходные данные в нелинейное пространство функций (на основе выбора функции ядра), а затем извлечет компоненты PCA в этих измененных измерениях, как показано на рисунке 2.

Спектральное встраивание

Spectral Embedding - это метод нелинейного уменьшения размерности, который работает на основе лапласовских собственных карт. Короче говоря, лапласианские собственные карты создают граф из нашего набора данных, где нам нужно настроить соединение между узлами (каждая точка в наших данных действует как узел).

Хотя этот метод имеет другую процедуру работы с ядром PCA, мы также можем указать несколько ядер в Spectral Embedding, например, радиальный базис. В этой статье мы будем использовать одну и ту же функцию ядра между PCA ядра и методом Spectral Embedding.

Пример использования

Как упоминалось ранее, в этой статье мы применим эти 3 метода уменьшения размерности к данным каротажа скважины. Эти данные имеют 9 параметров, перечисленных в таблице 1.

Визуализация разделения данных по пористости с использованием 8 параметров явно невозможна, поскольку размер данных будет слишком большим (8D). Кроме того, нет уверенности в том, что визуализация даст четкое разделение между хорошей и плохой пористостью.

Это когда требуется уменьшение размерности, поскольку этот метод может преобразовать размерность из 8D в меньшую размерность, которая нам нужна (в этой статье, 3D), путем оптимизации всей информации, содержащейся в параметрах 8-скважинного каротажа.

Итак, теперь давайте реализуем эти три метода уменьшения размерности, чтобы визуализировать разделение пористости.

Обработка данных

Прежде всего, нам нужно загрузить данные и определить «порог» для пористости, независимо от того, хорошая она или плохая, как в следующем коде.

#read well log data
import pandas as pd
df = pd.read_csv(‘well_log_sample.csv’,index_col = ‘DEPT’)
#define porosity category (poor vs good)
def por(x):
 if x <0.1:
 return(0)
 else:
 return(1)
#apply function to NPHI log 
df[‘POR’] = df[‘NPHI’].map(lambda x: por(x))

Поскольку есть только 8 параметров (не включая столбец POR или NPHI), размеры которых мы хотим уменьшить, нам нужно удалить столбцы «POR» и «NPHI» в фрейме данных, чтобы он не перепутался во время обработки. после.

#set porosity as target
target = df.POR
#define new dataframe without porosity log
df = df.drop([‘NPHI’,’POR’],axis=1)

Имейте в виду, что переменная df используется для процесса уменьшения размерности, а переменная target используется в качестве цветового ключа для разделения в более поздней визуализации. Мы можем просматривать наши данные, используя print (df) и print (target), как показано на рисунке 4 и рисунке 5.

Чтобы избежать смещения, необходимо сначала отмасштабировать переменную df, прежде чем проводить дальнейшие действия.

#data scaling
from sklearn.preprocessing import StandardScaler
sc = StandardScaler().fit(df)
df_std = sc.transform(df)

PCA

Когда наши данные будут готовы, мы можем перейти к следующему шагу, который должен выполнить методы уменьшения линейной размерности, а именно PCA (анализ главных компонентов), как показано в следующем коде.

#PCA
from sklearn.decomposition import PCA
# take pca minimum components 3
pca3 = PCA(n_components=3)
pca = pca3.fit_transform(df_std)

Для n_components было выбрано значение 3, потому что мы преобразуем размеры в 3D. Следовательно, если мы выполним команду print (pca), результат массива numpy будет состоять из трех основных компонентов, как показано на рисунке 6.

Обратите внимание, что изменились только размеры (столбцы), а длина (строки) не изменилась. Мы можем провести перекрестную проверку, используя print (len (pca)), чтобы проверить, совпадает ли длина с предыдущей переменной df.

Ядро PCA

Как упоминалось ранее, ядро ​​PCA имеет тот же базовый принцип, что и PCA. Разница лишь в том, что этот метод использует функцию ядра для нелинейного преобразования данных. В этой статье будет использоваться ядро ​​RBF (радиальная базисная функция), как показано в следующей формуле.

γ (гамма) = Постоянная

xᵢ - xⱼ = разность векторов между каждой переменной в объекте

Гамма - это коэффициент, определяющий вес функции ядра при преобразовании данных. Величину гаммы можно регулировать по данным. В этой статье мы будем использовать gamma = 0.008, как показано в следующем коде.

#kernel PCA
from sklearn.decomposition import KernelPCA
kernelpca = KernelPCA(n_components=3, kernel='rbf',gamma=0.008)
kpca = kernelpca.fit_transform(df_std)

Затем, используя print(kpca), мы можем увидеть результат компонентов kPCA в 3D, как показано на рисунке 7.

Спектральное вложение

Подобно ядру PCA, Spectral Embedding также использует ядро ​​RBF, как показано в следующем коде.

#Spectral Embedding
from sklearn.manifold import SpectralEmbedding
emb3 = SpectralEmbedding(n_components=3, affinity = ‘rbf’, gamma = 0.008)
emb = emb3.fit_transform(df_std)

Затем, используя print (emb), мы можем увидеть результат его трехмерных компонентов (Рисунок 8).

Сюжет

Построение графика - последний шаг в этой статье. На этом этапе мы можем увидеть, какой метод дает лучший результат в визуализации разделения данных по пористости. Чтобы упростить построение графика, нам нужно преобразовать результаты компонентов из этих трех методов в формат dataframe, как показано в следующем коде.

#convert result to dataframe
df_kpca = pd.DataFrame(kpca)
df_pca = pd.DataFrame(pca)
df_emb = pd.DataFrame(emb)

Затем создайте функцию построения графика, которую можно применить к этим трем переменным.

#import library for plotting
from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt
import matplotlib.colors as colors
# Creating plot 
def plot3d (df):
 x=df[0]
 y=df[1]
 z=df[2]
 
 fig = plt.figure() 
 ax = Axes3D(fig)
 
 #create dummy colormap
 dummy_colors = [‘black’,’red’]
 cmap_dummy = colors.ListedColormap(dummy_colors[0:len(dummy_colors)], ‘indexed’)
 sctt=ax.scatter3D(x, y, z, c = target, cmap = cmap_dummy)
 
 # set axis label
 ax.set_xlabel(‘Comp1’)
 ax.set_ylabel(‘Comp2’)
 ax.set_zlabel(‘Comp3’)
 
 # clear axis numbers
 ax.set_xticklabels([])
 ax.set_yticklabels([])
 ax.set_zticklabels([])
 
 ax.set_title(“Porosity Visualization in Dimensionality Reduction”) 
 
 import matplotlib.lines as lines
 # create a “dummy plot” with the same characteristics and put a legend
 dummy_scat1 = lines.Line2D([0],[0], linestyle=” “, c=dummy_colors[0], marker = ‘o’ )
 dummy_scat2 = lines.Line2D([0],[0], linestyle=” “, c=dummy_colors[1], marker = ‘o’)
 
plt.legend([dummy_scat1, dummy_scat2], [‘Poor Porosity’, ‘Good Porosity’])
 
 
 plt.show()

После этого мы можем ввести эти три dataframe в созданную функцию построения графика.

#show plot
plot3d(df_emb)
plot3d(df_kpca)
plot3d(df_pca)

Наконец, мы можем увидеть результаты визуализации, как показано на рисунке 9.

Рисунок 9 показывает, что эти три метода дают разные результаты. Кроме того, метод нелинейного уменьшения размерности (ядро PCA и Spectral Embedding) более четко визуализирует разделение пористости. При визуализации PCA между красной точкой (хорошая пористость) и черной точкой (плохая пористость) все еще есть много совпадений.

Нелинейные методы более гибкие в настройке совместимости между данными и параметрами, поэтому эти методы легче адаптировать к данным высокой размерности. Эти результаты визуализации, безусловно, будут очень полезны для дальнейшего анализа или интерпретации, особенно когда мы хотим использовать другие скважинные данные.

Этот метод также может быть применен к другим параметрам каротажа скважины, таким как звуковой каротаж, каротаж плотности, каротаж гамма-излучения, путем настройки параметра или алгоритма для каждого метода.

Закрытие

Техника уменьшения размерности проста, но достаточно хороша для более четкой визуализации данных. Помимо этих трех методов, описанных выше, есть еще много методов уменьшения размерности, которые можно изучить. Удачи и надеюсь, что эта статья окажется полезной. Ваше здоровье!