{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Usage Example" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import numpy as np \n", "import pandas as pd \n", "import torch\n", "from anglepy import ANGLE\n", "from anglepy.metrics import mean_absolute_angular_deviation, circular_mean_directional_error, mean_circular_crps, accuracy, med_err\n", "from anglepy.kernels import c2_wendland\n", "from sklearn.model_selection import train_test_split\n", "from tqdm.auto import tqdm\n", "import math" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. Indian Wind Dataset - Prediction" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "trusted": true }, "outputs": [], "source": [ "df = pd.read_csv('India_Wind_Data.csv')\n", "random_state=18\n", "device= torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n", "X, y = df[['Latitude', 'Longitude']], df['Direction_Rad']\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, shuffle=True, random_state=random_state)\n", "X_train, X_test, y_train, y_test = torch.from_numpy(X_train.values).float().to(device), torch.from_numpy(X_test.values).float().to(device), torch.from_numpy(y_train.values).float().to(device), torch.from_numpy(y_test.values).float().to(device)\n", "y_train = y_train.unsqueeze(-1)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "trusted": true }, "outputs": [], "source": [ "# ANGLE-Geodesic\n", "\n", "accuracies, mederrs, crpss, cmdes, maads, times = [], [], [], [], [], []\n", "\n", "for _ in tqdm(range(50)):\n", " model = ANGLE(\n", " X_train, y_train, \n", " num_layer=3, hidden_dim=100, noise_dim=64, \n", " add_bn=True, resblock=False, noise_std=1,\n", " print_every_nepoch=10000, print_times_per_epoch=0, \n", " lr=0.05, num_epochs=500, batch_size=None, \n", " standardize=False, device=device,\n", " dist_method='geodesic', verbose=False, circular_indices=None,\n", " kernel_func=c2_wendland(), circular_projection='atan2'\n", " )\n", " \n", " y_pred = model.predict(X_test)\n", " y_pred_ensemble = model.sample(X_test, sample_size=100)\n", " maad_mean = mean_absolute_angular_deviation(y_pred, y_test, return_degrees=True).item()\n", " cmde = circular_mean_directional_error(y_pred, y_test).item()\n", " crps = mean_circular_crps(y_pred_ensemble, y_test, return_degrees=True)[0]\n", " acc = accuracy(y_pred, y_test, theta=torch.pi/6)\n", " median_err = med_err(y_pred, y_test)\n", " accuracies.append(round(acc,3))\n", " mederrs.append(round(median_err,3))\n", " crpss.append(round(crps, 3))\n", " maads.append(round(maad_mean, 3))\n", " cmdes.append(round(cmde,3))\n", "print(f\"{np.mean(accuracies):.2f}\\pm{np.std(accuracies):.2f}\")\n", "print(f\"{np.mean(mederrs):.2f}\\pm{np.std(mederrs):.2f}\")\n", "print(f\"{np.mean(crpss):.2f}\\pm{np.std(crpss):.2f}\")\n", "print(f\"{np.mean(maads):.2f}\\pm{np.std(maads):.2f}\")\n", "print(f\"{np.mean(cmdes):.2f}\\pm{np.std(cmdes):.2f}\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "trusted": true }, "outputs": [], "source": [ "# ANGLE-Chordal\n", "accuracies, mederrs, crpss, cmdes, maads, times = [], [], [], [], [], []\n", "\n", "for _ in tqdm(range(50)):\n", " model = ANGLE(\n", " X_train, y_train, \n", " num_layer=3, hidden_dim=100, noise_dim=64, \n", " add_bn=True, resblock=False, gamma=1, noise_std=1,\n", " print_every_nepoch=10000, print_times_per_epoch=0, \n", " lr=0.05, num_epochs=800, batch_size=None, \n", " standardize=False, device=device,\n", " dist_method='chordal', verbose=False, circular_indices=None\n", " )\n", " \n", " y_pred = model.predict(X_test)\n", " y_pred_ensemble = model.sample(X_test, sample_size=100)\n", " maad_mean = mean_absolute_angular_deviation(y_pred, y_test, return_degrees=True).item()\n", " cmde = circular_mean_directional_error(y_pred, y_test).item()\n", " crps = mean_circular_crps(y_pred_ensemble, y_test, return_degrees=True)[0]\n", " acc = accuracy(y_pred, y_test, theta=torch.pi/6)\n", " median_err = med_err(y_pred, y_test)\n", " accuracies.append(round(acc,3))\n", " mederrs.append(round(median_err,3))\n", " crpss.append(round(crps, 3))\n", " maads.append(round(maad_mean, 3))\n", " cmdes.append(round(cmde,3))\n", "\n", "print(f\"{np.mean(accuracies):.2f}\\pm{np.std(accuracies):.2f}\")\n", "print(f\"{np.mean(mederrs):.2f}\\pm{np.std(mederrs):.2f}\")\n", "print(f\"{np.mean(crpss):.2f}\\pm{np.std(crpss):.2f}\")\n", "print(f\"{np.mean(maads):.2f}\\pm{np.std(maads):.2f}\")\n", "print(f\"{np.mean(cmdes):.2f}\\pm{np.std(cmdes):.2f}\")\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. Indian Wind Dataset - Sufficient Dimension Reduction" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df = pd.read_csv('India_Wind_Data.csv')\n", "random_state=18\n", "device= torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n", "X, y = df[['Latitude', 'Longitude']], df['Direction_Rad']\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, shuffle=True, random_state=random_state)\n", "X_train, X_test, y_train, y_test = torch.from_numpy(X_train.values).float().to(device), torch.from_numpy(X_test.values).float().to(device), torch.from_numpy(y_train.values).float().to(device), torch.from_numpy(y_test.values).float().to(device)\n", "y_train = y_train.unsqueeze(-1)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "model = ANGLE(\n", " X_train, y_train, \n", " num_layer=3, hidden_dim=100, noise_dim=64, \n", " add_bn=True, resblock=False, gamma=1, noise_std=1,\n", " print_every_nepoch=10000, print_times_per_epoch=0, \n", " lr=0.05, num_epochs=800, batch_size=None, \n", " standardize=True, device=device,\n", " dist_method='chordal', verbose=False, circular_indices=None, sdr=True, reduced_dim=1\n", " )\n", "beta_matrix = model.beta_proj\n", "print(beta_matrix.shape) \n", "# Output: (1, d)\n", "\n", "# Project your data to 1D for fitting stage-2 ANGLE, or plotting\n", "reduced_X = X_train @ beta_matrix.T" ] } ], "metadata": { "kaggle": { "accelerator": "none", "dataSources": [], "dockerImageVersionId": 28755, "isGpuEnabled": false, "isInternetEnabled": false, "language": "python", "sourceType": "notebook" }, "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.12.13" } }, "nbformat": 4, "nbformat_minor": 4 }