{
  "cells": [
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "%matplotlib inline"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "\n# Kernel CCA and Nonparametric CCA\n\nThis script demonstrates how to use kernel and nonparametric methods\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "import numpy as np\n\nfrom cca_zoo.data import generate_covariance_data\nfrom cca_zoo.model_selection import GridSearchCV\nfrom cca_zoo.models import KCCA"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "np.random.seed(42)\nn = 200\np = 100\nq = 100\nlatent_dims = 1\ncv = 3\n\n(X, Y), (tx, ty) = generate_covariance_data(\n    n, view_features=[p, q], latent_dims=latent_dims, correlation=[0.9]\n)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Custom Kernel\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "def my_kernel(X, Y, param=0):\n    \"\"\"\n    We create a custom kernel:\n\n    \"\"\"\n\n    return np.random.normal(0, param)\n\n\nkernel_custom = KCCA(\n    latent_dims=latent_dims,\n    kernel=[my_kernel, my_kernel],\n    kernel_params=[{\"param\": 1}, {\"param\": 1}],\n).fit((X, Y))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Linear\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "c1 = [0.9, 0.99]\nc2 = [0.9, 0.99]\nparam_grid = {\"kernel\": [\"linear\"], \"c\": [c1, c2]}\nkernel_reg = (\n    GridSearchCV(\n        KCCA(latent_dims=latent_dims), param_grid=param_grid, cv=cv, verbose=True\n    )\n    .fit([X, Y])\n    .best_estimator_\n)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Polynomial\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "degree1 = [2, 3]\ndegree2 = [2, 3]\nparam_grid = {\"kernel\": [\"poly\"], \"degree\": [degree1, degree2], \"c\": [c1, c2]}\nkernel_poly = (\n    GridSearchCV(\n        KCCA(latent_dims=latent_dims), param_grid=param_grid, cv=cv, verbose=True\n    )\n    .fit([X, Y])\n    .best_estimator_\n)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "kernel cca (gaussian/rbf)\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "gamma1 = [1e-1, 1e-2]\ngamma2 = [1e-1, 1e-2]\nparam_grid = {\"kernel\": [\"rbf\"], \"gamma\": [gamma1, gamma2], \"c\": [c1, c2]}\nkernel_poly = (\n    GridSearchCV(\n        KCCA(latent_dims=latent_dims), param_grid=param_grid, cv=cv, verbose=True\n    )\n    .fit([X, Y])\n    .best_estimator_\n)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Custom Kernel\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "def my_kernel(X, Y, param=0):\n    \"\"\"\n    We create a custom kernel:\n\n    \"\"\"\n    M = np.random.rand(X.shape[0], X.shape[0]) + param\n    return X @ M @ M.T @ Y.T\n\n\nkernel_custom = KCCA(\n    latent_dims=latent_dims,\n    kernel=[my_kernel, my_kernel],\n    kernel_params=[{\"param\": 1}, {\"param\": 1}],\n).fit((X, Y))"
      ]
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.7.9"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}