# 下記によって,skfda を事前にインストールする。
!pip install cvxopt
# 第 4 章のプログラムは,事前に下記が実行されていることを仮定する。
import numpy as np
import pandas as pd
from sklearn.decomposition import PCA
import cvxopt
from cvxopt import solvers
from cvxopt import matrix
import matplotlib.pyplot as plt
from matplotlib import style
style.use("seaborn-ticks")
from numpy.random import randn # 正規乱数
from scipy.stats import norm
def kernel_pca_train(x, k):
# データ x とカーネル k から Gram 行列を求める。
val, vec = np.linalg.eig(K)
idx = val.argsort()[::-1]
val = val[idx]
vec = vec[:, idx]
alpha = np.zeros((n, n))
for i in range(n):
alpha[:, i] = vec[:, i] / val[i]**0.5
return alpha
def kernel_pca_test(x, k, alpha, m, z):
# x, k, alpha, m, z から m 次までのスコア pca を求める。
return pca
sigma2 = 0.01
def k(x, y):
return np.exp(-np.linalg.norm(x - y)**2 / 2 / sigma2)
X = pd.read_csv(
"https://raw.githubusercontent.com/selva86/datasets/master/USArrests.csv")
x = X.values[:, :-1]
n = x.shape[0]
p = x.shape[1]
alpha = kernel_pca_train(x, k)
z = np.zeros((n, 2))
for i in range(n):
z[i, :] = kernel_pca_test(x, k, alpha, 2, x[i, :])
min1 = np.min(z[:, 0])
min2 = np.min(z[:, 1])
max1 = np.max(z[:, 0])
max2 = np.max(z[:, 1])
plt.xlim(min1, max1)
plt.ylim(min2, max2)
plt.xlabel("First")
plt.ylabel("Second")
plt.title("Kernel PCA (Gauss 0.01)")
for i in range(n):
if i != 4:
plt.text(x=z[i, 0], y=z[i, 1], s=i)
plt.text(z[4, 0], z[4, 1], 5, c="r")
sigma = 10
sigma2 = sigma**2
def z(x):
return np.sqrt(2/m) * np.cos(w * x + b)
def zz(x, y):
return np.sum(z(x) * z(y))
def alpha_m(K, x, y, m):
n = len(x)
U, D, V = np.linalg.svd(K[:m, :m])
u = np.zeros((n, m))
for i in range(m):
for j in range(n):
u[j, i] = np.sqrt(m/n) * np.sum(K[j, :m] * U[:m, i] / D[i])
mu = D * n / m
R = np.zeros((n, m))
for i in range(m):
R[:, i] = np.sqrt(mu[i]) * u[:, i]
Z = np.linalg.inv(np.dot(R.T, R) + lam * np.eye(m))
alpha = np.dot((np.eye(n) - np.dot(np.dot(R, Z), R.T)), y) / lam
return(alpha)