<jupyter_start><jupyter_text>クロネッカー積のテスト+ ガウスカーネル行列のクロネッカー積で格子点のカーネル行列を表現できるかということ+ クロネッカー積の固有値が掛けられた2つの行列の固有値の積であるかということ+ クロネッカー積の固有ベクトルが2つの行列の固有ベクトルのクロネッカー積になるといったことを確認する<jupyter_code>%matplotlib inline
import itertools

import numpy as np
from scipy.spatial import distance_matrix
from sklearn.utils.extmath import cartesian<jupyter_output><empty_output><jupyter_text>2軸の格子点の定義域を設定する<jupyter_code>n1 = 10
n2 = 15
X1_domain = (-10, 5)
X2_domain = (-8, -3)
X1_candidate = np.linspace(start = X1_domain[0], stop = X1_domain[1], num = n1).reshape(n1, 1)
X2_candidate = np.linspace(start = X2_domain[0], stop = X2_domain[1], num = n2).reshape(n2, 1)<jupyter_output><empty_output><jupyter_text>格子点の各座標を求める+ X1とX2の直積を求める<jupyter_code>X_candidate = cartesian([X1_candidate.squeeze(), X2_candidate.squeeze()])<jupyter_output><empty_output><jupyter_text>カーネル行列を定義する+ 今回は、ガウスカーネルを考える<jupyter_code>gauss_kernel = lambda x,y: np.exp(-distance_matrix(x,y, p=2)**2/2)
quasi_gauss_kernel = lambda x,y: np.exp(-distance_matrix(x,y, p=2)/2)<jupyter_output><empty_output><jupyter_text>クロネッカー積が正しく動くか検証する<jupyter_code>K1 = gauss_kernel(X1_candidate, X1_candidate)
K2 = gauss_kernel(X2_candidate, X2_candidate)
K = gauss_kernel(X_candidate, X_candidate)
K_kron = np.kron(K1, K2)
np.allclose(K, K_kron)<jupyter_output><empty_output><jupyter_text>クロネッカー積の固有値が2つの行列の固有値の積かどうか検証する<jupyter_code>(eig1_val, eig1_vec) = np.linalg.eigh(K1)
(eig2_val, eig2_vec) = np.linalg.eigh(K2)
(eig_val, eig_vec) = np.linalg.eigh(K)
kron_eig_val = np.kron(eig1_val, eig2_val)
np.allclose(np.sort(kron_eig_val), eig_val)<jupyter_output><empty_output><jupyter_text>クロネッカー積の固有ベクトルが2つの行列の固有ベクトルのクロネッカー積かどうか検証する+ 固有ベクトル同士を完全に同じにするのは難しい(長さの自由度がある)ので以下が成り立つかどうかを考えた:$$K = P V P^T.$$$V$は固有値のクロネッカー積を対角成分に持つ行列(大きい順にソート), Pは固有ベクトルのクロネッカー積をVに対応するように並べ替えたもの<jupyter_code>kron_eig_vec = np.kron(eig1_vec, eig2_vec)
kron_perm_ind = np.argsort(kron_eig_val)
np.allclose(K, kron_eig_vec[:,kron_perm_ind] @ np.diag(np.sort(kron_eig_val))  @ kron_eig_vec[:,kron_perm_ind].T)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1259765625, 'fraction_numerical': 0.02978515625, 'mean_word_length': 11.648148148148149, 'pattern_counts': {'":': 0, '<': 29, '<?xml version=': 0, '>': 29, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '7', 'dir': 'jupyter-structured-clean-dedup', 'id': '540304', 'license': 'MIT', 'n_tokens_mistral': 1239, 'n_tokens_neox': 1245, 'n_words': 96, 'path': 'gp_regression/kronecker_test.ipynb', 'repo_name': 'fumish/LearningModels', 'size': '2048'}