Многомасштабная корреляция графов (MGC)#

С scipy.stats.multiscale_graphcorr, мы можем проверить независимость на многомерных и нелинейных данных. Прежде чем начать, импортируем некоторые полезные пакеты:

>>> import numpy as np
>>> import matplotlib.pyplot as plt; plt.style.use('classic')
>>> from scipy.stats import multiscale_graphcorr

Давайте используем пользовательскую функцию построения графиков для отображения взаимосвязи данных:

>>> def mgc_plot(x, y, sim_name, mgc_dict=None, only_viz=False,
...              only_mgc=False):
...     """Plot sim and MGC-plot"""
...     if not only_mgc:
...         # simulation
...         plt.figure(figsize=(8, 8))
...         ax = plt.gca()
...         ax.set_title(sim_name + " Simulation", fontsize=20)
...         ax.scatter(x, y)
...         ax.set_xlabel('X', fontsize=15)
...         ax.set_ylabel('Y', fontsize=15)
...         ax.axis('equal')
...         ax.tick_params(axis="x", labelsize=15)
...         ax.tick_params(axis="y", labelsize=15)
...         plt.show()
...     if not only_viz:
...         # local correlation map
...         plt.figure(figsize=(8,8))
...         ax = plt.gca()
...         mgc_map = mgc_dict["mgc_map"]
...         # draw heatmap
...         ax.set_title("Local Correlation Map", fontsize=20)
...         im = ax.imshow(mgc_map, cmap='YlGnBu')
...         # colorbar
...         cbar = ax.figure.colorbar(im, ax=ax)
...         cbar.ax.set_ylabel("", rotation=-90, va="bottom")
...         ax.invert_yaxis()
...         # Turn spines off and create white grid.
...         for edge, spine in ax.spines.items():
...             spine.set_visible(False)
...         # optimal scale
...         opt_scale = mgc_dict["opt_scale"]
...         ax.scatter(opt_scale[0], opt_scale[1],
...                    marker='X', s=200, color='red')
...         # other formatting
...         ax.tick_params(bottom="off", left="off")
...         ax.set_xlabel('#Neighbors for X', fontsize=15)
...         ax.set_ylabel('#Neighbors for Y', fontsize=15)
...         ax.tick_params(axis="x", labelsize=15)
...         ax.tick_params(axis="y", labelsize=15)
...         ax.set_xlim(0, 100)
...         ax.set_ylim(0, 100)
...         plt.show()

Давайте сначала посмотрим на некоторые линейные данные:

>>> rng = np.random.default_rng()
>>> x = np.linspace(-1, 1, num=100)
>>> y = x + 0.3 * rng.random(x.size)

Отношение моделирования можно построить ниже:

>>> mgc_plot(x, y, "Linear", only_viz=True)
" "

Теперь мы можем увидеть тестовую статистику, p-значение и визуализированную карту MGC ниже. Оптимальный масштаб показан на карте красным крестиком "x":

>>> stat, pvalue, mgc_dict = multiscale_graphcorr(x, y)
>>> print("MGC test statistic: ", round(stat, 1))
MGC test statistic:  1.0
>>> print("P-value: ", round(pvalue, 1))
P-value:  0.0
>>> mgc_plot(x, y, "Linear", mgc_dict, only_mgc=True)
" "

Отсюда ясно, что MGC способен определить связь между входными матрицами данных, потому что p-значение очень низкое, а статистика теста MGC относительно высока. Карта MGC указывает на сильная линейная зависимость. Интуитивно это объясняется тем, что большее количество соседей поможет в выявлении линейной зависимости между \(x\) и \(y\). Оптимальный масштаб в этом случае эквивалентно глобальному масштабу, отмеченный красной точкой на карте.

То же самое можно сделать для нелинейных наборов данных. Следующий \(x\) и \(y\) массивы получены из нелинейного моделирования:

>>> unif = np.array(rng.uniform(0, 5, size=100))
>>> x = unif * np.cos(np.pi * unif)
>>> y = unif * np.sin(np.pi * unif) + 0.4 * rng.random(x.size)

Отношение моделирования можно построить ниже:

>>> mgc_plot(x, y, "Spiral", only_viz=True)
" "

Теперь мы можем увидеть тестовую статистику, p-значение и визуализированную карту MGC ниже. Оптимальный масштаб показан на карте красным крестиком "x":

>>> stat, pvalue, mgc_dict = multiscale_graphcorr(x, y)
>>> print("MGC test statistic: ", round(stat, 1))
MGC test statistic:  0.2  # random
>>> print("P-value: ", round(pvalue, 1))
P-value:  0.0
>>> mgc_plot(x, y, "Spiral", mgc_dict, only_mgc=True)
" "

Отсюда ясно, что MGC способен определить взаимосвязь снова, поскольку p-значение очень низкое, а статистика теста MGC относительно высока. Карта MGC указывает на сильно нелинейная зависимость. Оптимальный масштаб в этом случае эквивалентно локальному масштабу, отмеченный красной точкой на карте.