diff --git a/docs/src/notebooks/.ipynb_checkpoints/ce-fit-w-centering-checkpoint.ipynb b/docs/src/notebooks/.ipynb_checkpoints/ce-fit-w-centering-checkpoint.ipynb new file mode 100644 index 000000000..ffc2943ff --- /dev/null +++ b/docs/src/notebooks/.ipynb_checkpoints/ce-fit-w-centering-checkpoint.ipynb @@ -0,0 +1,1015 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "c8ed9cd2-3365-47f2-bdfd-35aba48c9a2a", + "metadata": {}, + "source": [ + "## Fitting an ionic cluster expansion with energy centering\n", + "Determining a good center for data can speed up optimization model solving and lead to sparser, more physical solutions for complex systems. Here we pick up from \"lmo-drx-ce-mc.ipynb\" and fit the data in a different way, using L1 regularization." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "f17d6396-6289-4834-ba8a-5d2ea684d666", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import json\n", + "from monty.serialization import loadfn\n", + "from pymatgen.core.structure import Structure\n", + "from smol.cofe import ClusterSubspace, StructureWrangler, ClusterExpansion, RegressionData\n", + "from smol.io import load_work" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "1d6e3b36-dc86-48f3-87a2-0181e150dac6", + "metadata": {}, + "outputs": [], + "source": [ + "prim = loadfn(\"data/lmo_drx_prim.json\")" + ] + }, + { + "cell_type": "markdown", + "id": "fa3f0d95-197b-4438-8e49-60e6a4476321", + "metadata": {}, + "source": [ + "### 1) Create the cluster subspace" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "fa8bb81c-7c34-470b-941e-53d7aa8248d8", + "metadata": {}, + "outputs": [], + "source": [ + "from smol.cofe import ClusterSubspace\n", + "from smol.cofe.extern import EwaldTerm\n", + "\n", + "CLUSTERCUTOFFS = {2: 6, 3: 4, 4:2}\n", + "LTOL, STOL, ATOL = 0.15, 0.20, 15\n", + "BASIS = 'sinusoid'\n", + "\n", + "cs = ClusterSubspace.from_cutoffs(structure=prim,\n", + " cutoffs = CLUSTERCUTOFFS,\n", + " ltol = LTOL, \n", + " stol = STOL, \n", + " angle_tol = ATOL,\n", + " supercell_size = ('O2-'),\n", + " basis = BASIS, \n", + " orthonormal=False)\n", + "cs.add_external_term(EwaldTerm())" + ] + }, + { + "cell_type": "markdown", + "id": "ddba3fd6-456e-411f-a9fa-f67d52530a59", + "metadata": {}, + "source": [ + "### 2) Load data into a Structure Wrangler" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "c94afd75-be55-4f23-9113-b78920daff6f", + "metadata": {}, + "outputs": [], + "source": [ + "# load the training structures with oxidation state assigned\n", + "from monty.serialization import loadfn\n", + "\n", + "entries = loadfn(\"data/lmo_drx_entries.json\")" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "f4f94ca8-6660-4538-9f3d-f6461a3e09a9", + "metadata": {}, + "outputs": [], + "source": [ + "from smol.cofe import StructureWrangler\n", + "\n", + "sw = StructureWrangler(cs)\n", + "for entry in entries:\n", + " sw.add_entry(entry, verbose=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "028edcd6-ee20-49d4-9c22-ee6888285f8a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Our feature matrix has the following dimensions: (238, 387)\n" + ] + } + ], + "source": [ + "print ('Our feature matrix has the following dimensions:', \n", + " sw.feature_matrix.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "id": "699dcc41-339d-4cef-8f04-b15bec8b95aa", + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Basis/Orthogonal/Orthonormal : sinusoid/True/False\n", + " Unit Cell Composition : Li+0.7 Mn2+0.7 Mn3+0.2 Mn4+0.2 O2-1\n", + " Number of Orbits : 40\n", + "No. of Correlation Functions : 386\n", + " Cluster Cutoffs : 2: 5.94, 3: 3.64\n", + " External Terms : [EwaldTerm(total)]\n", + "Orbit Summary\n", + " ------------------------------------------------------------------------\n", + " | ID Degree Cluster Diameter Multiplicity No. Functions |\n", + " | 0 0 NA 0 1 |\n", + " | 1 1 0.0000 2 2 |\n", + " | 2 1 0.0000 1 4 |\n", + " | 3 2 1.8187 8 8 |\n", + " | 4 2 2.1000 6 3 |\n", + " | 5 2 2.9698 12 3 |\n", + " | 6 2 2.9699 6 10 |\n", + " | 7 2 3.4825 24 8 |\n", + " | 8 2 3.6373 4 3 |\n", + " | 9 2 3.6373 4 3 |\n", + " | 10 2 4.2000 6 3 |\n", + " | 11 2 4.2000 3 10 |\n", + " | 12 2 4.5768 24 8 |\n", + " | 13 2 4.6957 24 3 |\n", + " | 14 2 5.1439 24 4 |\n", + " | 15 2 5.1439 12 10 |\n", + " | 16 2 5.4560 24 8 |\n", + " | 17 2 5.4560 8 8 |\n", + " | 18 2 5.9397 12 3 |\n", + " | 19 2 5.9397 6 10 |\n", + " | 20 3 2.1000 12 12 |\n", + " | 21 3 2.9699 24 6 |\n", + " | 22 3 2.9699 12 12 |\n", + " | 23 3 2.9699 12 20 |\n", + " | 24 3 2.9699 8 4 |\n", + " | 25 3 2.9699 8 4 |\n", + " | 26 3 2.9699 8 20 |\n", + " | 27 3 3.4825 48 32 |\n", + " | 28 3 3.4825 48 16 |\n", + " | 29 3 3.4825 24 16 |\n", + " | 30 3 3.4825 24 12 |\n", + " | 31 3 3.4825 24 12 |\n", + " | 32 3 3.4825 24 20 |\n", + " | 33 3 3.4825 12 12 |\n", + " | 34 3 3.4825 12 20 |\n", + " | 35 3 3.6373 24 16 |\n", + " | 36 3 3.6373 24 8 |\n", + " | 37 3 3.6373 24 8 |\n", + " | 38 3 3.6373 24 12 |\n", + " | 39 3 3.6373 4 12 |\n", + " ------------------------------------------------------------------------\n" + ] + } + ], + "source": [ + "print(sw.cluster_subspace)" + ] + }, + { + "cell_type": "markdown", + "id": "03d5810d-3666-402a-ad34-6202b66b67c6", + "metadata": {}, + "source": [ + "### 3) We will perform a \"piecewise fit\", with the first fit only using the Points and Ewald features." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "b16da32f-9fb3-47d4-a807-8ff331a5f12e", + "metadata": {}, + "outputs": [], + "source": [ + "from smol.cofe.wrangling.tools import unique_corr_vector_indices\n", + "unique_inds = unique_corr_vector_indices(sw, 'energy')" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "405984f4-78ba-4667-81ac-de61f879b37b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "There are 170 unique structure to train on.\n", + "The average energy is -20.41894778320028, while the std. dev. is 1.4573599233718875 eV/prim\n" + ] + } + ], + "source": [ + "unique_energies = sw.get_property_vector('energy')[unique_inds]\n", + "print(f'There are {len(unique_inds)} unique structure to train on.')\n", + "avg_en = np.average(unique_energies)\n", + "std_en = np.std(unique_energies)\n", + "print(f'The average energy is {avg_en}, while the std. dev. is {std_en} eV/prim')" + ] + }, + { + "cell_type": "markdown", + "id": "59c60e16-b76b-4262-b5d6-ff2745005e32", + "metadata": {}, + "source": [ + "#### Determine the feature matrix column indeces of Points and Ewald features" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "id": "0a6509aa-9dfc-408e-b5a8-d7afca5d9360", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The point indeces are [1, 2, 3, 4, 5, 6], while the Ewald index is 386\n" + ] + }, + { + "data": { + "text/plain": [ + "array([ 1, 2, 3, 4, 5, 6, 386])" + ] + }, + "execution_count": 104, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "point_inds = sw.cluster_subspace.function_inds_by_size[1]\n", + "ewald_ind = sw.feature_matrix.shape[1] - 1\n", + "print(f'The point indeces are {point_inds}, while the Ewald index is {ewald_ind}')\n", + "initial_fit_cols = np.concatenate([point_inds, [ewald_ind]])\n", + "initial_fit_cols" + ] + }, + { + "cell_type": "markdown", + "id": "ed9587fb-9add-45b8-ad5b-90f83b73321a", + "metadata": {}, + "source": [ + "### Perform initial fit with only Points and Ewald features" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "d7965706-dfb4-49d6-8449-3a3527413ff1", + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.linear_model import Lasso\n", + "from sklearn.model_selection import RepeatedKFold, GridSearchCV" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "id": "a6cf60fe-a939-4053-a1a6-8843869683c4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[-6.80864145 9.17087773 1.23408451 4.73489259 -3.1117202 -0.46576228\n", + " 0.05446231] -23.111363120607102\n" + ] + } + ], + "source": [ + "lasso = Lasso(alpha=1e-6, fit_intercept=True, max_iter=int(1e7))\n", + "lasso.fit(sw.feature_matrix[unique_inds][:, initial_fit_cols], unique_energies)\n", + "print(lasso.coef_, lasso.intercept_)" + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "id": "3fc8d80f-37a4-4f26-bb62-1750bdc106b1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[-23.11136312 -6.80864145 9.17087773 1.23408451 4.73489259\n", + " -3.1117202 -0.46576228 0.05446231]\n" + ] + } + ], + "source": [ + "initial_coefs = np.concatenate([[lasso.intercept_], lasso.coef_])\n", + "print(initial_coefs)" + ] + }, + { + "cell_type": "code", + "execution_count": 183, + "id": "070e6bad-64f6-4d6b-9486-a288c56aee47", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The effective dielectric constant is 18.361322767174926\n" + ] + } + ], + "source": [ + "print(f'The effective dielectric constant is {1 / initial_coefs[-1]}')" + ] + }, + { + "cell_type": "markdown", + "id": "74823281-ee56-45c3-a80e-e6fd89bb7f8a", + "metadata": {}, + "source": [ + "### Let's visualize the variance that these features can capture" + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "id": "34ef357a-cdde-404f-912a-6d2e2bf6bfe1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 116, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAD6CAYAAAC4RRw1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAYvklEQVR4nO3dfXBV9b3v8fe34SHKsxAoLWiwg4AICYdATSsBpYpHqaiFQ30qgoV6tSL1lFNQ57an7VRG7RE6dW4nHp5myhUYlIK2eqCUx07UJDXaINgI5QAaIYULkgNYsN/7RxYRkx32TrKTnV/yec1k1l6/vR6+K5N8svLba/2WuTsiIhKez6W6ABERaRgFuIhIoBTgIiKBUoCLiARKAS4iEigFuIhIoBIKcDP7npntNLNSM3vezNLN7BIz22hmZdG0R1MXKyIin7J414Gb2ReBHcCV7n7KzFYDvwOuBI66+wIzmwf0cPcfXGhbvXr18szMzORULiLSRhQXF//N3TNqtrdLcP12wEVmdga4GPgAmA+Mi95fDmwBLhjgmZmZFBUVJbhLEREBMLP/jtUetwvF3d8Hngb2A+XAcXffAPRx9/JomXKgd/LKFRGReOIGeNS3PQkYAHwB6GRmdye6AzObZWZFZlZUUVHR8EpFROQzEvkQ82vAX929wt3PAC8CXwEOmVlfgGh6ONbK7p7v7jnunpORUasLR0REGiiRPvD9wNVmdjFwChgPFAH/A0wDFkTTdQ0p4MyZMxw8eJDTp083ZHWRuNLT0+nXrx/t27dPdSkiSRU3wN39dTNbA/wJOAu8CeQDnYHVZnYfVSE/pSEFHDx4kC5dupCZmYmZNWQTInVyd44cOcLBgwcZMGBAqssRSaqErkJx9x8CP6zR/DFVZ+ONcvr0aYW3NBkzo2fPnujzF2mNWsSdmApvaUr6+ZLWqkUEuIiI1F+iN/I0m2c2/iWp2/ve9VfEXebDDz9kzpw5FBYW0rFjRzIzM1m4cCFXXBF/3ZqWLVvGDTfcwBe+8IWGlHtB+/btY+LEiZSWliZ1u/feey9bt26lW7dufO5zn+PZZ58lNzc3Kceyb98+hgwZwqBBg6rbHnnkEb71rW81qt6JEycyefLkz7Rv2bKFp59+mpdffrnB2xYJSZs/A3d3brvtNsaNG8eePXt45513+NnPfsahQ4catL1ly5bxwQcf1Guds2fPNmhfyfTUU09RUlLCggUL+M53vgPU/1jGjRvHvn37arV/6UtfoqSkpPqrMeEtyfPMxr8k/YRJmlebD/DNmzfTvn177r///uq27OxsxowZA1QF26hRoxg+fDg//GHV57jnzipnzpzJ0KFDueGGGzh16hRr1qyhqKiIu+66i+zsbE6dOkVxcTFjx45l5MiRTJgwgfLycqAq7B599FHGjh3LokWL6lyuuLiYrKwscnNzefbZZ2Meg7szd+5crrrqKoYNG8aqVauAqjPScePGMXnyZAYPHsxdd91FvLFv8vLyeO+992Iey7x587jyyisZPnw43//+9xv1fV+9ejWPPPIIAIsWLeLyyy8HYM+ePVxzzTUA/PjHP2bUqFFcddVVzJo1K2btr776KoMHD+aaa67hxRdfbFRNIqFp8wFeWlrKyJEjY763YcMGysrKeOONNygpKaG4uJht27YBUFZWxoMPPsjOnTvp3r07L7zwApMnTyYnJ4cVK1ZQUlJCu3bteOihh1izZg3FxcXMmDGDxx57rHr7x44dY+vWrcyePbvO5aZPn84vfvELCgoK6jyGF198kZKSEt566y1+//vfM3fu3Oo/AG+++SYLFy7knXfeYe/evfzxj3+84PfjpZdeYtiwYbWO5dSpU6xdu5adO3fy9ttv8/jjjyf8Pd6zZw/Z2dnVX9u3bycvL4/t27cDsH37dnr27Mn777/Pjh07qv94fve736WwsJDS0lJOnTpVq2vk9OnTzJw5k5deeont27fz4YcfJlyTSGvQ4vrAW5INGzawYcMGRowYAUBlZSVlZWVceumlDBgwgOzsbABGjhwZs+vg3XffpbS0lOuvvx6ATz75hL59+1a/P3Xq1Asud/z4cY4dO8bYsWMBuOeee3jllVdq7WfHjh3ccccdpKWl0adPH8aOHUthYSFdu3Zl9OjR9OvXD6j6z2Lfvn3VZ7jnmzt3Lj/96U/JyMhg8eLFtd7v2rUr6enpfPvb3+bmm29m4sSJACxdupRFixYB8N5773HTTTfRoUMHBgwYwNq1a4FPu1Bqqqys5MSJExw4cIA777yTbdu2sX37dm6//Xag6r+jJ598kpMnT3L06FGGDh3K17/+9er1d+/ezYABAxg4cCAAd999N/n5+bX2I9JatfkAHzp0KGvWrIn5nrszf/786j7hc/bt20fHjh2r59PS0jh16lTM9YcOHVrn2XOnTp0uuNyxY8cSugTuQt0iNeusq7/9qaeeqvWh4PnatWvHG2+8waZNm1i5ciW//OUv+cMf/sD06dOZPn06UNUttGzZMhIdMjg3N5elS5cyaNAgxowZw5IlSygoKODnP/85p0+f5oEHHqCoqIj+/fvzox/9KObdurpEUNqyNt+Fct111/Hxxx/z3HPPVbcVFhaydetWJkyYwJIlS6isrATg/fff5/DhmEO+VOvSpQsnTpwAYNCgQVRUVFQH85kzZ9i5c2etdeparnv37nTr1o0dO3YAsGLFipj7zMvLY9WqVXzyySdUVFSwbds2Ro8eXc/vxIWPpbKykuPHj3PTTTexcOHCmGfU9ZWXl8fTTz9NXl4eI0aMYPPmzXTs2JFu3bpVh3WvXr2orKyM+Ud28ODB/PWvf2XPnj0APP/8842uSSQkLe4MPJHL/pLJzFi7di1z5sxhwYIFpKenV19GOHDgQHbt2kVubi4AnTt35te//jVpaWl1bu/ee+/l/vvv56KLLqKgoIA1a9Ywe/Zsjh8/ztmzZ5kzZw5Dhw79zDodOnSoc7mlS5cyY8YMLr74YiZMmBBzn7fddhsFBQVkZWVhZjz55JN8/vOfZ/fu3Y363px/LK+88gqTJk3i9OnTuDvPPPNMwts51wd+zowZM5g9ezZjxozhwIED5OXlkZaWRv/+/Rk8eDAA3bt3Z+bMmQwbNozMzExGjRpVa7vp6enk5+dz880306tXL6655pqkX2Ip0pLFfSJPMuXk5HjNBzrs2rWLIUOGNFsN0jbp56y2c5cQNvdJk9SfmRW7e07N9jbfhSIiEioFuIhIoBTgIiKBUoCLiARKAS4iEigFuIhIoFrcdeBsfiK527t2ftxF2vpwsiISprhn4GY2yMxKzvv6yMzmmNklZrbRzMqiaY/mKDjZNJysiIQqboC7+7vunu3u2cBI4CSwFpgHbHL3gcCmaD44Gk4WnnvuOUaNGkVWVhbf+MY3OHnyJMePHyczM5N//OMfAJw8eZL+/ftz5swZCgsLGT58OLm5udX7FZHmV98+8PHAHnf/b2ASsDxqXw7cmsS6mo2Gk4Xbb7+dwsJC3nrrLYYMGcLixYvp1q0bWVlZbN26FagaZnbChAm0b9+e6dOn86tf/YqCgoILDisgIk2rvn3g3wTOjRjUx93LAdy93Mx6J7WyFqCtDCdbWlrK448/zrFjx6isrKwec2Xq1KmsWrWKa6+9lpUrV/LAAw9w7NgxTpw4wVe+8hUA7rzzTj3CTCRFEg5wM+sA3ALE/1Tws+vNAmYBXHrppfUqrjloONmqQat+85vfkJWVxbJly9iyZQsAt9xyC/Pnz+fo0aMUFxdz3XXX8dFHH8WtR0SaR326UP4Z+JO7n/t075CZ9QWIpjHHWXX3fHfPcfecjIyMxlXbBDScLJw4cYK+ffty5syZz+yjc+fOjB49mocffpiJEyeSlpZGjx496NKlC6+99hoAK1euTHg/IpJc9elCuYNPu08A1gPTgAXRdF1SKkrgsr9k0nCy8JOf/IQvf/nLXHbZZQwbNqz6DxBUdaNMmTKl+qwcYPHixcycOZNOnToxbtw4unXrltB+pGW5en/09KLNPZt/5838e95aJTScrJldDBwALnf341FbT2A1cCmwH5ji7kcvtB0NJ9s6VFZW0rlzZwAWLFhAeXl59WPVWir9nNVWsLjqwdS5lyvAW7q6hpNN6Azc3U8CPWu0HaHqqhRpY37729/yxBNPcPbsWS677DKWLVuW6pJE2qSWdyemtHhTp06tvoJGRFKnRYyF0pxPBZK2Rz9f0lqlPMDT09M5cuSIfsmkSbg7R44cIT09PdWliCRdyrtQ+vXrx8GDB6moqEh1KdJKpaenV9/MJNKapDzA27dvz4ABA1JdhohIcFIe4CKSWgV7j1S/TsklhdJgKe8DFxGRhlGAi4gESgEuIhIoBbiISKAU4CIigVKAi4gESgEuIhIoBbiISKAU4CIigVKAi4gESgEuIhIoBbiISKASCnAz625ma8xst5ntMrNcM7vEzDaaWVk07dHUxYqIyKcSPQNfBLzq7oOBLGAXMA/Y5O4DgU3RvIiINJO4AW5mXYE8YDGAu//d3Y8Bk4Dl0WLLgVubpkQREYklkTPwy4EKYKmZvWlm/2lmnYA+7l4OEE17x1rZzGaZWZGZFempOyIiyZNIgLcD/gn4P+4+Avgf6tFd4u757p7j7jkZGRkNLFNERGpKJMAPAgfd/fVofg1VgX7IzPoCRNPDTVOiiIjEEjfA3f1D4ICZDYqaxgPvAOuBaVHbNGBdk1QoIiIxJfpMzIeAFWbWAdgLTKcq/Feb2X3AfmBK05QoIiKxJBTg7l4C5MR4a3xSqxERkYTpTkwRkUApwEVEAqUAFxEJlAJcRCRQCnARkUApwEVEAqUAFxEJlAJcRCRQCnARkUApwEVEAqUAFxEJlAJcRCRQCnARkUApwEVEAqUAFxEJlAJcRCRQCnARkUApwEVEApXQI9XMbB9wAvgEOOvuOWZ2CbAKyAT2Af/i7v+vacoUEZGaEn2oMcC17v638+bnAZvcfYGZzYvmf5DU6kTags1PpLoCCVRjulAmAcuj18uBWxtdjYiIJCzRAHdgg5kVm9msqK2Pu5cDRNPesVY0s1lmVmRmRRUVFY2vWEREgMS7UL7q7h+YWW9go5ntTnQH7p4P5APk5OR4A2oUEZEYEjoDd/cPoulhYC0wGjhkZn0BounhpipSRERqixvgZtbJzLqcew3cAJQC64Fp0WLTgHVNVaSIiNSWSBdKH2CtmZ1b/v+6+6tmVgisNrP7gP3AlKYrU0REaoob4O6+F8iK0X4EGN8URYmISHy6E1NEJFAKcBGRQCnARUQCpQAXEQmUAlxEJFAKcBGRQCnARUQCpQAXEQmUAlxEJFAKcBGRQCnARUQCpQAXEQmUAlxEJFAKcBGRQCnARUQCpQAXEQmUAlxEJFAKcBGRQCUc4GaWZmZvmtnL0fwlZrbRzMqiaY+mK1NERGqqzxn4w8Cu8+bnAZvcfSCwKZoXEZFmklCAm1k/4GbgP89rngQsj14vB25NamUiInJBiZ6BLwT+DfjHeW193L0cIJr2jrWimc0ysyIzK6qoqGhMrSIicp64AW5mE4HD7l7ckB24e76757h7TkZGRkM2ISIiMbRLYJmvAreY2U1AOtDVzH4NHDKzvu5ebmZ9gcNNWaiIiHxW3DNwd5/v7v3cPRP4JvAHd78bWA9MixabBqxrsipFRKSWxlwHvgC43szKgOujeRERaSaJdKFUc/ctwJbo9RFgfPJLEhGRROhOTBGRQCnARUQCpQAXEQmUAlxEJFAKcBGRQCnARUQCpQAXEQmUAlxEJFAKcBGRQCnARUQCpQAXEQmUAlxEJFAKcBGRQCnARUQCpQAXEQmUAlxEJFAKcBGRQCnARUQCFTfAzSzdzN4ws7fMbKeZ/XvUfomZbTSzsmjao+nLFRGRcxI5A/8YuM7ds4Bs4EYzuxqYB2xy94HApmheRESaSdwA9yqV0Wz76MuBScDyqH05cGtTFCgiIrEl1AduZmlmVgIcBja6++tAH3cvB4imvetYd5aZFZlZUUVFRZLKFhGRhALc3T9x92ygHzDazK5KdAfunu/uOe6ek5GR0cAyRUSkpnpdheLux4AtwI3AITPrCxBNDye7OBERqVsiV6FkmFn36PVFwNeA3cB6YFq02DRgXRPVKCIiMbRLYJm+wHIzS6Mq8Fe7+8tmVgCsNrP7gP3AlCasU0REaogb4O7+NjAiRvsRYHxTFCUiIvHpTkwRkUApwEVEApVIH7iISHJtfiI1+712fmr220R0Bi4iEigFuIhIoBTgIiKBUoCLiARKAS4iEigFuIhIoBTgIiKBUoCLiARKAS4iEigFuIhIoBTgIiKBUoCLiARKAS4iEigFuIhIoBTgIiKBSuShxv3NbLOZ7TKznWb2cNR+iZltNLOyaNqj6csVEZFzEjkDPwv8q7sPAa4GHjSzK4F5wCZ3HwhsiuZFRKSZxA1wdy939z9Fr08Au4AvApOA5dFiy4Fbm6hGERGJoV594GaWSdUT6l8H+rh7OVSFPNC7jnVmmVmRmRVVVFQ0slwRETkn4QA3s87AC8Acd/8o0fXcPd/dc9w9JyMjoyE1iohIDAkFuJm1pyq8V7j7i1HzITPrG73fFzjcNCWKiEgsiVyFYsBiYJe7/8d5b60HpkWvpwHrkl+eiIjUpV0Cy3wVuAf4s5mVRG2PAguA1WZ2H7AfmNIkFYqISExxA9zddwBWx9vjk1uOiIgkSndiiogESgEuIhIoBbiISKAU4CIigVKAi4gESgEuIhIoBbiISKAU4CIigVKAi4gESgEuIhIoBbiISKAU4CIigVKAi4gESgEuIhIoBbiISKAU4CIigUrkiTwi0ooU7D2S6hIkSRJ5JuYSMztsZqXntV1iZhvNrCya9mjaMkVEpKZEulCWATfWaJsHbHL3gcCmaF5EAlew94jO0AMSN8DdfRtwtEbzJGB59Ho5cGtyyxIRkXga+iFmH3cvB4imvZNXkoiIJKLJr0Ixs1lmVmRmRRUVFU29OxGRNqOhAX7IzPoCRNPDdS3o7vnunuPuORkZGQ3cnYiI1NTQAF8PTIteTwPWJaccERFJVCKXET4PFACDzOygmd0HLACuN7My4PpoXkREmlHcG3nc/Y463hqf5FpERKQedCemtCybn0h1BSLB0FgoIiKBUoCLiARKAS4iEigFuIhIoBTgIiKBUoCLiARKAS4iEigFuIhIoBTgIiKBUoCLiARKAS4iEigFuIhIoBTgIiKB0miEUptGBGzzzj2ZPvfynimuRC5EZ+AiIoHSGbiItB2p/O/y2vlJ36TOwEVEAtWoADezG83sXTN7z8zmJasoERGJr8FdKGaWBjxL1UONDwKFZrbe3d9JVnGf0cr+9UmIPkyUAJz7wBP0oWdza8wZ+GjgPXff6+5/B1YCk5JTloiIxNOYAP8icOC8+YNRm4iINIPGXIViMdq81kJms4BZ0Wylmb2b4PZ7AX9rYG1J9miyN9iCji3pdGzhaa3HBS3q2BqVI5fFamxMgB8E+p833w/4oOZC7p4P5Nd342ZW5O45DS+v5dKxham1HltrPS5o3ccGjetCKQQGmtkAM+sAfBNYn5yyREQkngafgbv7WTP7LvBfQBqwxN13Jq0yERG5oEbdienuvwN+l6Raaqp3t0tAdGxhaq3H1lqPC1r3sWHutT53FBGRAOhWehGRQLXoADezbDN7zcxKzKzIzEanuqZkMrOHoqEIdprZk6muJ9nM7Ptm5mbWK9W1JIOZPWVmu83sbTNba2bdU11TY7XW4TDMrL+ZbTazXdHv18OprqkptOgAB54E/t3ds4H/Hc23CmZ2LVV3rg5396HA0ykuKanMrD9VwyzsT3UtSbQRuMrdhwN/AVI0xkJynDccxj8DVwJ3mNmVqa0qac4C/+ruQ4CrgQdb0bFVa+kB7kDX6HU3YlxnHrD/BSxw948B3P1wiutJtmeAfyPGzV2hcvcN7n42mn2NqnsfQtZqh8Nw93J3/1P0+gSwi1Z4p3hLD/A5wFNmdoCqM9Sgz3hquAIYY2avm9lWMxuV6oKSxcxuAd5397dSXUsTmgG8kuoiGqlNDIdhZpnACOD1FJeSdCl/oIOZ/R74fIy3HgPGA99z9xfM7F+AxcDXmrO+xohzbO2AHlT9ezcKWG1ml3sglwXFObZHgRuat6LkuNBxufu6aJnHqPoXfUVz1tYEEhoOI2Rm1hl4AZjj7h+lup5ka9GXEZrZcaC7u7uZGXDc3bvGWy8EZvYqVV0oW6L5PcDV7l6R0sIaycyGAZuAk1HTuSEWRrv7hykrLEnMbBpwPzDe3U/GW74lM7Nc4EfuPiGanw/g7q1iHGMzaw+8DPyXu/9HqutpCi29C+UDYGz0+jqgLIW1JNtvqDomzOwKoAMtZtCdhnP3P7t7b3fPdPdMqv4t/6dWEt43Aj8Abgk9vCOtdjiM6IRvMbCrtYY3tIAulDhmAovMrB1wmk9HNWwNlgBLzKwU+DswLZTukzbsl0BHYGNVPvCau9+f2pIarpUPh/FV4B7gz2ZWErU9Gt093mq06C4UERGpW0vvQhERkToowEVEAqUAFxEJlAJcRCRQCnARkUApwEVEAqUAFxEJlAJcRCRQ/x/dCDyHIGXXcgAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "centered_energies = unique_energies - np.dot(sw.feature_matrix[unique_inds][:, np.concatenate([[0], initial_fit_cols])], initial_coefs)\n", + "plt.hist(centered_energies, alpha=0.5, label='Centered on Pts+Ewald')\n", + "plt.hist(unique_energies - avg_en, alpha=0.5, label='Centered on avg')\n", + "plt.legend()" + ] + }, + { + "cell_type": "markdown", + "id": "20596585-3de9-4c35-9d9a-b78cb57eef24", + "metadata": {}, + "source": [ + "## 4) Perform cross validation on the rest of features to train the L1 hyperparameter." + ] + }, + { + "cell_type": "code", + "execution_count": 131, + "id": "919cbcb2-8d63-4c29-b2d4-e58b48bea77a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 1, 2, 3, 4, 5, 6, 386])" + ] + }, + "execution_count": 131, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "initial_fit_cols" + ] + }, + { + "cell_type": "code", + "execution_count": 132, + "id": "3294d06a-50fc-4fa5-ac72-df5555a19485", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "high_order_cols = set(np.arange(sw.feature_matrix.shape[1])) - set(initial_fit_cols) - set([0])\n", + "high_order_cols = list(high_order_cols)" + ] + }, + { + "cell_type": "code", + "execution_count": 143, + "id": "4a230926-d120-49ed-be9d-99cb656e6203", + "metadata": {}, + "outputs": [], + "source": [ + "alpha_scan = np.logspace(-6, -3, 50)\n", + "rkf = RepeatedKFold(n_repeats=1, n_splits=5)" + ] + }, + { + "cell_type": "code", + "execution_count": 144, + "id": "7e7f1584-9895-497a-a400-3a2f81b46b05", + "metadata": {}, + "outputs": [], + "source": [ + "test_inds = [test for train, test in rkf.split(sw.feature_matrix[unique_inds], unique_energies)]\n", + "train_inds = [train for train, test in rkf.split(sw.feature_matrix[unique_inds], unique_energies)]" + ] + }, + { + "cell_type": "code", + "execution_count": 145, + "id": "4955f15a-4ebc-43bc-8a79-f8547c950c9b", + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "For hyperparameter 1e-06\n", + "Average and std of test errors are 0.023563371828414968, 0.006944566676647027\n", + "Training error is 0.012781053174431387\n", + "For hyperparameter 1.151395399326448e-06\n", + "Average and std of test errors are 0.02293354971559951, 0.006704246228834625\n", + "Training error is 0.0128531409875664\n", + "For hyperparameter 1.325711365590108e-06\n", + "Average and std of test errors are 0.022491265306204898, 0.006497581056875485\n", + "Training error is 0.01294077039585756\n", + "For hyperparameter 1.5264179671752333e-06\n", + "Average and std of test errors are 0.02248162195120036, 0.006500252501135466\n", + "Training error is 0.013021795190002268\n", + "For hyperparameter 1.757510624854793e-06\n", + "Average and std of test errors are 0.022634686221190584, 0.0066889555610161735\n", + "Training error is 0.013116645073882102\n", + "For hyperparameter 2.0235896477251557e-06\n", + "Average and std of test errors are 0.022829775463764936, 0.006885748019031812\n", + "Training error is 0.01321298400262933\n", + "For hyperparameter 2.3299518105153717e-06\n", + "Average and std of test errors are 0.02302586169340968, 0.007052560663054212\n", + "Training error is 0.013334376209673437\n", + "For hyperparameter 2.6826957952797274e-06\n", + "Average and std of test errors are 0.023127485956180856, 0.007048511864002914\n", + "Training error is 0.013453278370306989\n", + "For hyperparameter 3.0888435964774785e-06\n", + "Average and std of test errors are 0.023229610753404323, 0.0070508067397400094\n", + "Training error is 0.013539253070672138\n", + "For hyperparameter 3.5564803062231285e-06\n", + "Average and std of test errors are 0.023266548535205104, 0.006998320489812751\n", + "Training error is 0.013661416589809298\n", + "For hyperparameter 4.094915062380427e-06\n", + "Average and std of test errors are 0.023127938635561163, 0.006845356410725053\n", + "Training error is 0.013831833143129644\n", + "For hyperparameter 4.71486636345739e-06\n", + "Average and std of test errors are 0.022975996645623418, 0.0067124300138268166\n", + "Training error is 0.014021180784567013\n", + "For hyperparameter 5.428675439323859e-06\n", + "Average and std of test errors are 0.02286207688677446, 0.0065994960089153865\n", + "Training error is 0.014135613031720942\n", + "For hyperparameter 6.250551925273976e-06\n", + "Average and std of test errors are 0.02272329846417087, 0.006499493073260053\n", + "Training error is 0.014275456967733703\n", + "For hyperparameter 7.196856730011514e-06\n", + "Average and std of test errors are 0.022638905620220702, 0.006421383474862832\n", + "Training error is 0.014459661603532932\n", + "For hyperparameter 8.286427728546843e-06\n", + "Average and std of test errors are 0.02256024189177423, 0.006350046455697075\n", + "Training error is 0.01456256369146573\n", + "For hyperparameter 9.540954763499944e-06\n", + "Average and std of test errors are 0.022525874910026788, 0.00630133774625521\n", + "Training error is 0.014704724323064826\n", + "For hyperparameter 1.0985411419875572e-05\n", + "Average and std of test errors are 0.022517269462737168, 0.006264379355591736\n", + "Training error is 0.014884560053339276\n", + "For hyperparameter 1.2648552168552958e-05\n", + "Average and std of test errors are 0.0225363963006239, 0.0062373016527011585\n", + "Training error is 0.015102734537071474\n", + "For hyperparameter 1.4563484775012445e-05\n", + "Average and std of test errors are 0.022585325313955216, 0.006208592861109417\n", + "Training error is 0.015331289463222698\n", + "For hyperparameter 1.67683293681101e-05\n", + "Average and std of test errors are 0.022659032766393705, 0.006198681583730133\n", + "Training error is 0.015574023285933172\n", + "For hyperparameter 1.9306977288832496e-05\n", + "Average and std of test errors are 0.02273938967855854, 0.006196976611711143\n", + "Training error is 0.015891823043952927\n", + "For hyperparameter 2.2229964825261955e-05\n", + "Average and std of test errors are 0.02282334286833011, 0.006208006421729415\n", + "Training error is 0.01625074849499329\n", + "For hyperparameter 2.559547922699533e-05\n", + "Average and std of test errors are 0.02290195669873721, 0.006219359339510926\n", + "Training error is 0.016667022971153543\n", + "For hyperparameter 2.94705170255181e-05\n", + "Average and std of test errors are 0.022979372375563415, 0.006225351297098623\n", + "Training error is 0.017159664176712473\n", + "For hyperparameter 3.39322177189533e-05\n", + "Average and std of test errors are 0.023058584468062065, 0.006228575474097494\n", + "Training error is 0.017671070555096275\n", + "For hyperparameter 3.906939937054621e-05\n", + "Average and std of test errors are 0.023152870284827785, 0.006221497223997023\n", + "Training error is 0.018137111480914948\n", + "For hyperparameter 4.498432668969444e-05\n", + "Average and std of test errors are 0.02324341764990014, 0.006209253785450864\n", + "Training error is 0.01857631558321177\n", + "For hyperparameter 5.1794746792312125e-05\n", + "Average and std of test errors are 0.023335748327581268, 0.0061983508781675075\n", + "Training error is 0.019168024905050835\n", + "For hyperparameter 5.9636233165946365e-05\n", + "Average and std of test errors are 0.02341146988765298, 0.0061842058029032134\n", + "Training error is 0.019694089981011093\n", + "For hyperparameter 6.866488450042999e-05\n", + "Average and std of test errors are 0.023497470981836455, 0.006183577039440269\n", + "Training error is 0.020062838572648012\n", + "For hyperparameter 7.906043210907701e-05\n", + "Average and std of test errors are 0.023592971323725353, 0.006191344248965314\n", + "Training error is 0.02044988250444743\n", + "For hyperparameter 9.102981779915228e-05\n", + "Average and std of test errors are 0.02369449184258536, 0.006211235254223621\n", + "Training error is 0.02087978920274022\n", + "For hyperparameter 0.00010481131341546853\n", + "Average and std of test errors are 0.02380808041275113, 0.006241961603255449\n", + "Training error is 0.021316314449583672\n", + "For hyperparameter 0.00012067926406393288\n", + "Average and std of test errors are 0.023913508582457277, 0.00626580840854926\n", + "Training error is 0.02184390751466224\n", + "For hyperparameter 0.00013894954943731373\n", + "Average and std of test errors are 0.024007659392349744, 0.006279333029944376\n", + "Training error is 0.022398251634560287\n", + "For hyperparameter 0.00015998587196060574\n", + "Average and std of test errors are 0.024096964518648845, 0.006290855065160285\n", + "Training error is 0.02304312715442914\n", + "For hyperparameter 0.00018420699693267163\n", + "Average and std of test errors are 0.02418839892736822, 0.006307534161273502\n", + "Training error is 0.023627867356248815\n", + "For hyperparameter 0.00021209508879201905\n", + "Average and std of test errors are 0.024284842734620983, 0.00633138313874674\n", + "Training error is 0.024394124171978372\n", + "For hyperparameter 0.000244205309454865\n", + "Average and std of test errors are 0.024387978405299764, 0.006364473270875421\n", + "Training error is 0.02531806451684958\n", + "For hyperparameter 0.0002811768697974231\n", + "Average and std of test errors are 0.024500235861041383, 0.0064098649041919665\n", + "Training error is 0.026225135409746095\n", + "For hyperparameter 0.00032374575428176434\n", + "Average and std of test errors are 0.024622946025895667, 0.006467066196726164\n", + "Training error is 0.02721734790890345\n", + "For hyperparameter 0.0003727593720314938\n", + "Average and std of test errors are 0.02475864214528502, 0.006539373045265627\n", + "Training error is 0.028285250913031214\n", + "For hyperparameter 0.00042919342601287783\n", + "Average and std of test errors are 0.024912077024803657, 0.0066348372458585585\n", + "Training error is 0.029628330694152882\n", + "For hyperparameter 0.0004941713361323833\n", + "Average and std of test errors are 0.025086626567395836, 0.006760399423012437\n", + "Training error is 0.03127620918841993\n", + "For hyperparameter 0.0005689866029018293\n", + "Average and std of test errors are 0.025281528143233558, 0.00691906946597457\n", + "Training error is 0.033243789980446053\n", + "For hyperparameter 0.0006551285568595509\n", + "Average and std of test errors are 0.02550183626107064, 0.007120544431204602\n", + "Training error is 0.03528676407311314\n", + "For hyperparameter 0.0007543120063354615\n", + "Average and std of test errors are 0.02575091487187798, 0.007378019855835754\n", + "Training error is 0.03783326122135027\n", + "For hyperparameter 0.000868511373751352\n", + "Average and std of test errors are 0.02603929652880666, 0.007718568474509255\n", + "Training error is 0.04091855754174897\n", + "For hyperparameter 0.001\n", + "Average and std of test errors are 0.026375837759087296, 0.008167339428906895\n", + "Training error is 0.04458871614448672\n" + ] + } + ], + "source": [ + "from sklearn.metrics import mean_squared_error\n", + "\n", + "test_errs = []\n", + "train_errs = []\n", + "\n", + "for alpha in alpha_scan:\n", + " print(f'Fkey= hyperparameter {alpha}')\n", + " lasso = Lasso(alpha=alpha,\n", + " fit_intercept=False,\n", + " max_iter=int(1e7)\n", + " )\n", + " test_rmses = []\n", + " \n", + " # Cross validation fits\n", + " for train_index, test_index in zip(train_inds, test_inds):\n", + " act_train_inds = [unique_inds[ind] for ind in train_index] # Adjust indices to reflect actual feature matrix rows\n", + " act_test_inds = [unique_inds[ind] for ind in test_index]\n", + " \n", + " lasso.fit(sw.feature_matrix[act_train_inds][:, high_order_cols], centered_energies[train_index]) # Fit high order terms on the centered energies\n", + " all_coefs = np.concatenate([initial_coefs[:-1], lasso.coef_, [initial_coefs[-1]]])\n", + " this_pred = np.dot(sw.feature_matrix[act_test_inds], all_coefs) # Predictions on test set\n", + " this_test = mean_squared_error(this_pred, sw.get_property_vector('energy')[act_test_inds], squared=False)\n", + " test_rmses.append(this_test)\n", + " test_errs.append(test_rmses)\n", + " print(f'Average and std of test errors are {np.average(test_errs)}, {np.std(test_errs)}')\n", + " \n", + " # Fit on entire training set\n", + " full_fit = Lasso(alpha=alpha, fit_intercept=False, max_iter=int(1e7))\n", + " full_fit.fit(sw.feature_matrix[unique_inds][:, high_order_cols], centered_energies)\n", + " all_coefs = np.concatenate([initial_coefs[:-1], full_fit.coef_, [initial_coefs[-1]]])\n", + " preds = np.dot(sw.feature_matrix[unique_inds], all_coefs)\n", + " train_rmse = mean_squared_error(preds, sw.get_property_vector('energy')[unique_inds], squared=False)\n", + " train_errs.append(train_rmse)\n", + " print(f'Training error is {train_rmse}')\n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "02d35772-176f-4fd2-af91-110ca8e37c66", + "metadata": {}, + "source": [ + "#### Plot the cross validation trials" + ] + }, + { + "cell_type": "code", + "execution_count": 184, + "id": "190d317e-c67d-4ee4-989d-fcb11441ce6c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 184, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "mean_cvs = 1000 * np.array([np.average(tests) for tests in test_errs])\n", + "std_cvs = 1000 * np.array([np.std(tests) for tests in test_errs])\n", + "plt.plot(alpha_scan, mean_cvs, label='CV')\n", + "plt.fill_between(alpha_scan,\n", + " mean_cvs + std_cvs,\n", + " mean_cvs - std_cvs,\n", + " alpha=0.6\n", + " )\n", + " \n", + "plt.plot(alpha_scan, 1000 * np.array(train_errs), label='Train')\n", + "plt.xscale('log')\n", + "plt.xlabel('L1 hyperparameter', fontsize=14)\n", + "plt.xticks(fontsize=12)\n", + "plt.ylabel('RMSE (meV/prim)', fontsize=14)\n", + "plt.yticks(fontsize=12)\n", + "plt.title('L1 Hyperparameter training curve', fontsize=16)\n", + "plt.legend(fontsize=12)" + ] + }, + { + "cell_type": "code", + "execution_count": 152, + "id": "30d02a2c-240d-4849-b5b0-9ada40461758", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[(13, 20.919178970324158),\n", + " (11, 21.304634756308214),\n", + " (15, 21.38028596507715),\n", + " (14, 21.45740580491836),\n", + " (12, 21.495039780587),\n", + " (2, 21.606696487415693),\n", + " (10, 21.741839639121704),\n", + " (16, 21.976003202067727),\n", + " (1, 22.30372760278405),\n", + " (17, 22.37097685881364)]" + ] + }, + "execution_count": 152, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Find the optimal hyperparameter that minimizes the CV score\n", + "sorted_mean_cvs = sorted([(i, cv) for (i, cv) in enumerate(mean_cvs)], key=lambda t: t[1])" + ] + }, + { + "cell_type": "code", + "execution_count": 160, + "id": "546a18ee-f16d-4079-883d-f10c8f0dda3e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The optimal hyperparameter is 6.250551925273976e-06\n" + ] + } + ], + "source": [ + "opt_alpha = alpha_scan[sorted_mean_cvs[0][0]]\n", + "print(f'The optimal hyperparameter is {opt_alpha}')" + ] + }, + { + "cell_type": "markdown", + "id": "e8df21e7-e562-4721-9f98-c9f80e74beda", + "metadata": {}, + "source": [ + "## 5) Obtain the cluster expansion model that minimizes CV" + ] + }, + { + "cell_type": "code", + "execution_count": 186, + "id": "592806b2-4768-4c0d-ba46-99588e78a39b", + "metadata": {}, + "outputs": [], + "source": [ + "final_fit = Lasso(alpha=opt_alpha, fit_intercept=False, max_iter=int(1e7))\n", + "final_fit.fit(sw.feature_matrix[unique_inds][:, high_order_cols], centered_energies)\n", + "all_coefs = np.concatenate([initial_coefs[:-1], final_fit.coef_, [initial_coefs[-1]]])" + ] + }, + { + "cell_type": "code", + "execution_count": 159, + "id": "5fb06574-2441-4e0a-9840-9c8b4e97c0a2", + "metadata": {}, + "outputs": [], + "source": [ + "reg_data = RegressionData.from_sklearn(\n", + " final_fit, sw.feature_matrix[unique_inds], unique_energies\n", + ")\n", + "\n", + "expansion = ClusterExpansion(\n", + " sw.cluster_subspace, coefficients=all_coefs, regression_data=reg_data\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "9780b31c-4cf5-4ce4-a470-6e150e94d9a7", + "metadata": {}, + "source": [ + "## 6) Get an idea of the predictive capabilities of this cluster expansion" + ] + }, + { + "cell_type": "code", + "execution_count": 165, + "id": "68874fc4-fbe6-42eb-9c92-91508090589e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[(1, 1), (2, 7), (3, 112)]" + ] + }, + "execution_count": 165, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "first_inds = [(size, inds[0]) for size, inds in sw.cluster_subspace.function_inds_by_size.items()]\n", + "first_inds" + ] + }, + { + "cell_type": "code", + "execution_count": 163, + "id": "86234fa6-02b2-487a-9ac4-4d9662bc7d7a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Out-of-sample RMSE is: 0.01142790133610809 eV/prim\n", + "In-sample RMSE is: 0.014902570493376914 eV/prim\n", + "Number of Features > 1E-5: 69/387\n", + "Point correlation coeficients: [-23.11136312 -6.80864145 9.17087773 1.23408451 4.73489259\n", + " -3.1117202 -0.46576228]\n" + ] + }, + { + "data": { + "text/plain": [ + "Text(0, 0.5, 'Magnitude |$w_i$| eV/prim')" + ] + }, + "execution_count": 163, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from sklearn.model_selection import train_test_split\n", + "X_train, X_test, y_train, y_test = train_test_split(\n", + " sw.feature_matrix[unique_inds], unique_energies,\n", + " test_size=0.2\n", + ")\n", + "\n", + "final_fit = Lasso(alpha=opt_alpha, fit_intercept=False, max_iter=int(1e7))\n", + "final_fit.fit(sw.feature_matrix[unique_inds][:, high_order_cols], centered_energies)\n", + "all_coefs = np.concatenate([initial_coefs[:-1], final_fit.coef_, [initial_coefs[-1]]])\n", + "\n", + "y_predict = np.dot(X_test, all_coefs)\n", + "y_train_predict = np.dot(X_train, all_coefs)\n", + "print(f'Out-of-sample RMSE is: {mean_squared_error(y_test, y_predict, squared=False)} eV/prim')\n", + "print(f'In-sample RMSE is: {mean_squared_error(y_train, y_train_predict, squared=False)} eV/prim')\n", + "print(f'Number of Features > 1E-5: {sum(np.abs(all_coefs) > 1E-5)}/{len(all_coefs)}')\n", + "\n", + "first_pair = sw.cluster_subspace.orbits_by_size[2][0].bit_id\n", + "print(f'Point correlation coeficients: {all_coefs[:first_pair]}')\n", + "# plot the coefficients (excluding those for points))\n", + "plt.stem(range(len(all_coefs) - first_pair), all_coefs[first_pair:],\n", + " linefmt='-', markerfmt=' ')#, basefmt=' ')\n", + "plt.xlabel('Coefficient index (i in $w_i$)')\n", + "plt.ylabel('Magnitude |$w_i$| eV/prim')" + ] + }, + { + "cell_type": "markdown", + "id": "c136017e-7ea6-47b2-b0e4-e254ab59c672", + "metadata": {}, + "source": [ + "## 7) Plot the ECI" + ] + }, + { + "cell_type": "code", + "execution_count": 167, + "id": "bbc01973-50ac-4d06-8d1b-71550fd9aff8", + "metadata": {}, + "outputs": [], + "source": [ + "reg_data = reg_data = RegressionData.from_sklearn(\n", + " final_fit, sw.feature_matrix[unique_inds], unique_energies\n", + ")\n", + "expansion = ClusterExpansion(cluster_subspace=sw.cluster_subspace,\n", + " coefficients=all_coefs,\n", + " regression_data=reg_data\n", + " )\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 189, + "id": "64fa2322-0f66-40ad-b81e-b85c9a6931a8", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(array([-60., -40., -20., 0., 20., 40., 60., 80., 100.]),\n", + " [Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, '')])" + ] + }, + "execution_count": 189, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.stem(np.arange(7, len(expansion.eci)), 1000 * expansion.eci[7:]) # Plot ECI of pairs and triplets\n", + "for t in first_inds[1:]: # vertical lines denotes where points, pairs, and triplets cut off\n", + " plt.axvline(t[1]-0.5)\n", + "plt.xlabel('Coefficient index', fontsize=14)\n", + "plt.xticks(fontsize=12)\n", + "plt.ylabel('ECI (meV)', fontsize=14)\n", + "plt.yticks(fontsize=12)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "445cceb2-0786-41cb-9ba4-28437aff67a7", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/src/notebooks/ce-fit-w-centering.ipynb b/docs/src/notebooks/ce-fit-w-centering.ipynb new file mode 100644 index 000000000..fc4bf40ac --- /dev/null +++ b/docs/src/notebooks/ce-fit-w-centering.ipynb @@ -0,0 +1,2052 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "c8ed9cd2-3365-47f2-bdfd-35aba48c9a2a", + "metadata": {}, + "source": [ + "## Fitting an ionic cluster expansion with energy centering\n", + "Determining a good center for data can speed up optimization model solving and lead to sparser, more physical solutions for complex systems. Here we pick up from \"lmo-drx-ce-mc.ipynb\" and fit the data in a different way, using L1 regularization." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "f17d6396-6289-4834-ba8a-5d2ea684d666", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import json\n", + "from monty.serialization import loadfn\n", + "from pymatgen.core.structure import Structure\n", + "from smol.cofe import ClusterSubspace, StructureWrangler, ClusterExpansion, RegressionData\n", + "from smol.io import load_work" + ] + }, + { + "cell_type": "markdown", + "id": "7c9a811f-0930-4362-a225-35a59c8cc2ed", + "metadata": {}, + "source": [ + "### Load the LMO DRX prim" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "1d6e3b36-dc86-48f3-87a2-0181e150dac6", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.mp.ctk+json": { + "contents": [ + { + "contents": [ + { + "clickable": true, + "color": "#ff0d0d", + "id": "--atoms--0", + "positions": [ + [ + 1.7146436969528103, + 1.2124361854341037, + 2.96985 + ] + ], + "radius": 0.5, + "tooltip": "O2- (1.715, 1.212, 2.970)", + "type": "spheres" + }, + { + "clickable": true, + "color": "#cc80ff", + "id": "--atoms--1", + "phiEnd": 1.2566370614359172, + "phiStart": 0, + "positions": [ + [ + 2.571965545429215, + 0, + 1.4849250000000003 + ] + ], + "radius": 0.5, + "tooltip": "Li+ (0.2% occupancy) (2.572, 0.000, 1.485)", + "type": "spheres" + }, + { + "clickable": true, + "color": "#9c7ac7", + "id": "--atoms--2", + "phiEnd": 2.5132741228718345, + "phiStart": 1.2566370614359172, + "positions": [ + [ + 2.571965545429215, + 0, + 1.4849250000000003 + ] + ], + "radius": 0.5, + "tooltip": "Mn2+ (0.2% occupancy) (2.572, 0.000, 1.485)", + "type": "spheres" + }, + { + "clickable": true, + "color": "#9c7ac7", + "id": "--atoms--3", + "phiEnd": 3.769911184307752, + "phiStart": 2.5132741228718345, + "positions": [ + [ + 2.571965545429215, + 0, + 1.4849250000000003 + ] + ], + "radius": 0.5, + "tooltip": "Mn3+ (0.2% occupancy) (2.572, 0.000, 1.485)", + "type": "spheres" + }, + { + "clickable": true, + "color": "#9c7ac7", + "id": "--atoms--4", + "phiEnd": 5.026548245743669, + "phiStart": 3.769911184307752, + "positions": [ + [ + 2.571965545429215, + 0, + 1.4849250000000003 + ] + ], + "radius": 0.5, + "tooltip": "Mn4+ (0.2% occupancy) (2.572, 0.000, 1.485)", + "type": "spheres" + }, + { + "clickable": false, + "color": "#ffffff", + "id": "--atoms--5", + "phiEnd": 6.283185307179586, + "phiStart": 5.026548245743669, + "positions": [ + [ + 2.571965545429215, + 0, + 1.4849250000000003 + ], + [ + 3.4292873939056205, + 2.4248723708682074, + 2.9698500000000005 + ], + [ + 2.571965545429215, + 0, + 4.454775000000001 + ], + [ + 0, + 0, + 2.96985 + ], + [ + 0.8573218484764051, + 2.4248723708682074, + 4.454775000000001 + ], + [ + 0.8573218484764051, + 2.4248723708682074, + 1.4849250000000003 + ], + [ + 3.4292873939056205, + 2.4248723708682074, + 5.9397 + ], + [ + 0, + 0, + 0 + ] + ], + "radius": 0.5, + "type": "spheres" + }, + { + "clickable": true, + "color": "#cc80ff", + "id": "--atoms--6", + "phiEnd": 1.2566370614359172, + "phiStart": 0, + "positions": [ + [ + 3.4292873939056205, + 2.4248723708682074, + 2.9698500000000005 + ] + ], + "radius": 0.5, + "tooltip": "Li+ (0.2% occupancy) (3.429, 2.425, 2.970)", + "type": "spheres" + }, + { + "clickable": true, + "color": "#9c7ac7", + "id": "--atoms--7", + "phiEnd": 2.5132741228718345, + "phiStart": 1.2566370614359172, + "positions": [ + [ + 3.4292873939056205, + 2.4248723708682074, + 2.9698500000000005 + ] + ], + "radius": 0.5, + "tooltip": "Mn2+ (0.2% occupancy) (3.429, 2.425, 2.970)", + "type": "spheres" + }, + { + "clickable": true, + "color": "#9c7ac7", + "id": "--atoms--8", + "phiEnd": 3.769911184307752, + "phiStart": 2.5132741228718345, + "positions": [ + [ + 3.4292873939056205, + 2.4248723708682074, + 2.9698500000000005 + ] + ], + "radius": 0.5, + "tooltip": "Mn3+ (0.2% occupancy) (3.429, 2.425, 2.970)", + "type": "spheres" + }, + { + "clickable": true, + "color": "#9c7ac7", + "id": "--atoms--9", + "phiEnd": 5.026548245743669, + "phiStart": 3.769911184307752, + "positions": [ + [ + 3.4292873939056205, + 2.4248723708682074, + 2.9698500000000005 + ] + ], + "radius": 0.5, + "tooltip": "Mn4+ (0.2% occupancy) (3.429, 2.425, 2.970)", + "type": "spheres" + }, + { + "clickable": true, + "color": "#cc80ff", + "id": "--atoms--10", + "phiEnd": 1.2566370614359172, + "phiStart": 0, + "positions": [ + [ + 2.571965545429215, + 0, + 4.454775000000001 + ] + ], + "radius": 0.5, + "tooltip": "Li+ (0.2% occupancy) (2.572, 0.000, 4.455)", + "type": "spheres" + }, + { + "clickable": true, + "color": "#9c7ac7", + "id": "--atoms--11", + "phiEnd": 2.5132741228718345, + "phiStart": 1.2566370614359172, + "positions": [ + [ + 2.571965545429215, + 0, + 4.454775000000001 + ] + ], + "radius": 0.5, + "tooltip": "Mn2+ (0.2% occupancy) (2.572, 0.000, 4.455)", + "type": "spheres" + }, + { + "clickable": true, + "color": "#9c7ac7", + "id": "--atoms--12", + "phiEnd": 3.769911184307752, + "phiStart": 2.5132741228718345, + "positions": [ + [ + 2.571965545429215, + 0, + 4.454775000000001 + ] + ], + "radius": 0.5, + "tooltip": "Mn3+ (0.2% occupancy) (2.572, 0.000, 4.455)", + "type": "spheres" + }, + { + "clickable": true, + "color": "#9c7ac7", + "id": "--atoms--13", + "phiEnd": 5.026548245743669, + "phiStart": 3.769911184307752, + "positions": [ + [ + 2.571965545429215, + 0, + 4.454775000000001 + ] + ], + "radius": 0.5, + "tooltip": "Mn4+ (0.2% occupancy) (2.572, 0.000, 4.455)", + "type": "spheres" + }, + { + "clickable": true, + "color": "#cc80ff", + "id": "--atoms--14", + "phiEnd": 1.5707963267948966, + "phiStart": 0, + "positions": [ + [ + 0.8573218484764051, + 0.6062180927170518, + 1.484925 + ] + ], + "radius": 0.5, + "tooltip": "Li+ (0.25% occupancy) (0.857, 0.606, 1.485)", + "type": "spheres" + }, + { + "clickable": true, + "color": "#9c7ac7", + "id": "--atoms--15", + "phiEnd": 3.141592653589793, + "phiStart": 1.5707963267948966, + "positions": [ + [ + 0.8573218484764051, + 0.6062180927170518, + 1.484925 + ] + ], + "radius": 0.5, + "tooltip": "Mn2+ (0.25% occupancy) (0.857, 0.606, 1.485)", + "type": "spheres" + }, + { + "clickable": false, + "color": "#ffffff", + "id": "--atoms--16", + "phiEnd": 6.283185307179586, + "phiStart": 3.141592653589793, + "positions": [ + [ + 0.8573218484764051, + 0.6062180927170518, + 1.484925 + ], + [ + 2.571965545429215, + 1.8186542781511554, + 4.454775 + ] + ], + "radius": 0.5, + "type": "spheres" + }, + { + "clickable": true, + "color": "#cc80ff", + "id": "--atoms--17", + "phiEnd": 1.2566370614359172, + "phiStart": 0, + "positions": [ + [ + 0, + 0, + 2.96985 + ] + ], + "radius": 0.5, + "tooltip": "Li+ (0.2% occupancy) (0.000, 0.000, 2.970)", + "type": "spheres" + }, + { + "clickable": true, + "color": "#9c7ac7", + "id": "--atoms--18", + "phiEnd": 2.5132741228718345, + "phiStart": 1.2566370614359172, + "positions": [ + [ + 0, + 0, + 2.96985 + ] + ], + "radius": 0.5, + "tooltip": "Mn2+ (0.2% occupancy) (0.000, 0.000, 2.970)", + "type": "spheres" + }, + { + "clickable": true, + "color": "#9c7ac7", + "id": "--atoms--19", + "phiEnd": 3.769911184307752, + "phiStart": 2.5132741228718345, + "positions": [ + [ + 0, + 0, + 2.96985 + ] + ], + "radius": 0.5, + "tooltip": "Mn3+ (0.2% occupancy) (0.000, 0.000, 2.970)", + "type": "spheres" + }, + { + "clickable": true, + "color": "#9c7ac7", + "id": "--atoms--20", + "phiEnd": 5.026548245743669, + "phiStart": 3.769911184307752, + "positions": [ + [ + 0, + 0, + 2.96985 + ] + ], + "radius": 0.5, + "tooltip": "Mn4+ (0.2% occupancy) (0.000, 0.000, 2.970)", + "type": "spheres" + }, + { + "clickable": true, + "color": "#cc80ff", + "id": "--atoms--21", + "phiEnd": 1.2566370614359172, + "phiStart": 0, + "positions": [ + [ + 0.8573218484764051, + 2.4248723708682074, + 4.454775000000001 + ] + ], + "radius": 0.5, + "tooltip": "Li+ (0.2% occupancy) (0.857, 2.425, 4.455)", + "type": "spheres" + }, + { + "clickable": true, + "color": "#9c7ac7", + "id": "--atoms--22", + "phiEnd": 2.5132741228718345, + "phiStart": 1.2566370614359172, + "positions": [ + [ + 0.8573218484764051, + 2.4248723708682074, + 4.454775000000001 + ] + ], + "radius": 0.5, + "tooltip": "Mn2+ (0.2% occupancy) (0.857, 2.425, 4.455)", + "type": "spheres" + }, + { + "clickable": true, + "color": "#9c7ac7", + "id": "--atoms--23", + "phiEnd": 3.769911184307752, + "phiStart": 2.5132741228718345, + "positions": [ + [ + 0.8573218484764051, + 2.4248723708682074, + 4.454775000000001 + ] + ], + "radius": 0.5, + "tooltip": "Mn3+ (0.2% occupancy) (0.857, 2.425, 4.455)", + "type": "spheres" + }, + { + "clickable": true, + "color": "#9c7ac7", + "id": "--atoms--24", + "phiEnd": 5.026548245743669, + "phiStart": 3.769911184307752, + "positions": [ + [ + 0.8573218484764051, + 2.4248723708682074, + 4.454775000000001 + ] + ], + "radius": 0.5, + "tooltip": "Mn4+ (0.2% occupancy) (0.857, 2.425, 4.455)", + "type": "spheres" + }, + { + "clickable": true, + "color": "#cc80ff", + "id": "--atoms--25", + "phiEnd": 1.2566370614359172, + "phiStart": 0, + "positions": [ + [ + 0.8573218484764051, + 2.4248723708682074, + 1.4849250000000003 + ] + ], + "radius": 0.5, + "tooltip": "Li+ (0.2% occupancy) (0.857, 2.425, 1.485)", + "type": "spheres" + }, + { + "clickable": true, + "color": "#9c7ac7", + "id": "--atoms--26", + "phiEnd": 2.5132741228718345, + "phiStart": 1.2566370614359172, + "positions": [ + [ + 0.8573218484764051, + 2.4248723708682074, + 1.4849250000000003 + ] + ], + "radius": 0.5, + "tooltip": "Mn2+ (0.2% occupancy) (0.857, 2.425, 1.485)", + "type": "spheres" + }, + { + "clickable": true, + "color": "#9c7ac7", + "id": "--atoms--27", + "phiEnd": 3.769911184307752, + "phiStart": 2.5132741228718345, + "positions": [ + [ + 0.8573218484764051, + 2.4248723708682074, + 1.4849250000000003 + ] + ], + "radius": 0.5, + "tooltip": "Mn3+ (0.2% occupancy) (0.857, 2.425, 1.485)", + "type": "spheres" + }, + { + "clickable": true, + "color": "#9c7ac7", + "id": "--atoms--28", + "phiEnd": 5.026548245743669, + "phiStart": 3.769911184307752, + "positions": [ + [ + 0.8573218484764051, + 2.4248723708682074, + 1.4849250000000003 + ] + ], + "radius": 0.5, + "tooltip": "Mn4+ (0.2% occupancy) (0.857, 2.425, 1.485)", + "type": "spheres" + }, + { + "clickable": true, + "color": "#cc80ff", + "id": "--atoms--29", + "phiEnd": 1.5707963267948966, + "phiStart": 0, + "positions": [ + [ + 2.571965545429215, + 1.8186542781511554, + 4.454775 + ] + ], + "radius": 0.5, + "tooltip": "Li+ (0.25% occupancy) (2.572, 1.819, 4.455)", + "type": "spheres" + }, + { + "clickable": true, + "color": "#9c7ac7", + "id": "--atoms--30", + "phiEnd": 3.141592653589793, + "phiStart": 1.5707963267948966, + "positions": [ + [ + 2.571965545429215, + 1.8186542781511554, + 4.454775 + ] + ], + "radius": 0.5, + "tooltip": "Mn2+ (0.25% occupancy) (2.572, 1.819, 4.455)", + "type": "spheres" + }, + { + "clickable": true, + "color": "#cc80ff", + "id": "--atoms--31", + "phiEnd": 1.2566370614359172, + "phiStart": 0, + "positions": [ + [ + 3.4292873939056205, + 2.4248723708682074, + 5.9397 + ] + ], + "radius": 0.5, + "tooltip": "Li+ (0.2% occupancy) (3.429, 2.425, 5.940)", + "type": "spheres" + }, + { + "clickable": true, + "color": "#9c7ac7", + "id": "--atoms--32", + "phiEnd": 2.5132741228718345, + "phiStart": 1.2566370614359172, + "positions": [ + [ + 3.4292873939056205, + 2.4248723708682074, + 5.9397 + ] + ], + "radius": 0.5, + "tooltip": "Mn2+ (0.2% occupancy) (3.429, 2.425, 5.940)", + "type": "spheres" + }, + { + "clickable": true, + "color": "#9c7ac7", + "id": "--atoms--33", + "phiEnd": 3.769911184307752, + "phiStart": 2.5132741228718345, + "positions": [ + [ + 3.4292873939056205, + 2.4248723708682074, + 5.9397 + ] + ], + "radius": 0.5, + "tooltip": "Mn3+ (0.2% occupancy) (3.429, 2.425, 5.940)", + "type": "spheres" + }, + { + "clickable": true, + "color": "#9c7ac7", + "id": "--atoms--34", + "phiEnd": 5.026548245743669, + "phiStart": 3.769911184307752, + "positions": [ + [ + 3.4292873939056205, + 2.4248723708682074, + 5.9397 + ] + ], + "radius": 0.5, + "tooltip": "Mn4+ (0.2% occupancy) (3.429, 2.425, 5.940)", + "type": "spheres" + }, + { + "clickable": true, + "color": "#cc80ff", + "id": "--atoms--35", + "phiEnd": 1.2566370614359172, + "phiStart": 0, + "positions": [ + [ + 0, + 0, + 0 + ] + ], + "radius": 0.5, + "tooltip": "Li+ (0.2% occupancy) (0.000, 0.000, 0.000)", + "type": "spheres" + }, + { + "clickable": true, + "color": "#9c7ac7", + "id": "--atoms--36", + "phiEnd": 2.5132741228718345, + "phiStart": 1.2566370614359172, + "positions": [ + [ + 0, + 0, + 0 + ] + ], + "radius": 0.5, + "tooltip": "Mn2+ (0.2% occupancy) (0.000, 0.000, 0.000)", + "type": "spheres" + }, + { + "clickable": true, + "color": "#9c7ac7", + "id": "--atoms--37", + "phiEnd": 3.769911184307752, + "phiStart": 2.5132741228718345, + "positions": [ + [ + 0, + 0, + 0 + ] + ], + "radius": 0.5, + "tooltip": "Mn3+ (0.2% occupancy) (0.000, 0.000, 0.000)", + "type": "spheres" + }, + { + "clickable": true, + "color": "#9c7ac7", + "id": "--atoms--38", + "phiEnd": 5.026548245743669, + "phiStart": 3.769911184307752, + "positions": [ + [ + 0, + 0, + 0 + ] + ], + "radius": 0.5, + "tooltip": "Mn4+ (0.2% occupancy) (0.000, 0.000, 0.000)", + "type": "spheres" + } + ], + "id": "--atoms", + "name": "atoms", + "origin": [ + -1.7146436969528103, + -1.2124361854341037, + -2.96985 + ], + "visible": true + }, + { + "contents": [], + "id": "--bonds", + "name": "bonds", + "origin": [ + -1.7146436969528103, + -1.2124361854341037, + -2.96985 + ], + "visible": true + }, + { + "contents": [], + "id": "--polyhedra", + "name": "polyhedra", + "origin": [ + -1.7146436969528103, + -1.2124361854341037, + -2.96985 + ], + "visible": true + }, + { + "contents": [], + "id": "--magmoms", + "name": "magmoms", + "origin": [ + -1.7146436969528103, + -1.2124361854341037, + -2.96985 + ], + "visible": true + }, + { + "contents": [ + { + "contents": [ + { + "clickable": false, + "id": "--unit_cell--a=2.96985, b=2.9698500000000005, c=2.96985, alpha=59.99999999999999, beta=59.99999999999999, gamma=59.99999999999999--0", + "positions": [ + [ + 0, + 0, + 0 + ], + [ + 2.571965545429215, + 0, + 1.4849250000000003 + ], + [ + 0, + 0, + 0 + ], + [ + 0.8573218484764051, + 2.4248723708682074, + 1.4849250000000003 + ], + [ + 0, + 0, + 0 + ], + [ + 0, + 0, + 2.96985 + ], + [ + 2.571965545429215, + 0, + 1.4849250000000003 + ], + [ + 3.4292873939056205, + 2.4248723708682074, + 2.9698500000000005 + ], + [ + 2.571965545429215, + 0, + 1.4849250000000003 + ], + [ + 2.571965545429215, + 0, + 4.454775000000001 + ], + [ + 0.8573218484764051, + 2.4248723708682074, + 1.4849250000000003 + ], + [ + 3.4292873939056205, + 2.4248723708682074, + 2.9698500000000005 + ], + [ + 0.8573218484764051, + 2.4248723708682074, + 1.4849250000000003 + ], + [ + 0.8573218484764051, + 2.4248723708682074, + 4.454775000000001 + ], + [ + 0, + 0, + 2.96985 + ], + [ + 2.571965545429215, + 0, + 4.454775000000001 + ], + [ + 0, + 0, + 2.96985 + ], + [ + 0.8573218484764051, + 2.4248723708682074, + 4.454775000000001 + ], + [ + 3.4292873939056205, + 2.4248723708682074, + 2.9698500000000005 + ], + [ + 3.4292873939056205, + 2.4248723708682074, + 5.9397 + ], + [ + 2.571965545429215, + 0, + 4.454775000000001 + ], + [ + 3.4292873939056205, + 2.4248723708682074, + 5.9397 + ], + [ + 0.8573218484764051, + 2.4248723708682074, + 4.454775000000001 + ], + [ + 3.4292873939056205, + 2.4248723708682074, + 5.9397 + ] + ], + "type": "lines" + } + ], + "id": "--unit_cell--a=2.96985, b=2.9698500000000005, c=2.96985, alpha=59.99999999999999, beta=59.99999999999999, gamma=59.99999999999999", + "name": "a=2.96985, b=2.9698500000000005, c=2.96985, alpha=59.99999999999999, beta=59.99999999999999, gamma=59.99999999999999", + "visible": true + } + ], + "id": "--unit_cell", + "name": "unit_cell", + "origin": [ + -1.7146436969528103, + -1.2124361854341037, + -2.96985 + ], + "visible": true + } + ], + "name": "Structure", + "origin": [ + -1.7146436969528103, + -1.2124361854341037, + -2.96985 + ], + "visible": true + }, + "text/plain": [ + "If you see this text, the Crystal Toolkit Jupyter Lab \n", + "\n", + "extension is not installed. You can install it by running \n", + "\n", + "\"pip install crystaltoolkit-extension\" \n", + "\n", + "from the same environment you run \"jupyter lab\". \n", + "\n", + "This only works in Jupyter Lab 3.x or above.\n", + "\n", + "\n", + "Structure Summary\n", + "Lattice\n", + " abc : 2.96985 2.9698500000000005 2.96985\n", + " angles : 59.99999999999999 59.99999999999999 59.99999999999999\n", + " volume : 18.522028420882272\n", + " A : 2.571965545429215 0.0 1.4849250000000003\n", + " B : 0.8573218484764051 2.4248723708682074 1.4849250000000003\n", + " C : 0.0 0.0 2.96985\n", + "Overall Charge: +1.5\n", + "PeriodicSite: Li+:0.250, Mn2+:0.250 (2.5720, 1.8187, 4.4548) [0.7500, 0.7500, 0.7500]\n", + "PeriodicSite: Li+:0.250, Mn2+:0.250 (0.8573, 0.6062, 1.4849) [0.2500, 0.2500, 0.2500]\n", + "PeriodicSite: Li+:0.200, Mn2+:0.200, Mn3+:0.200, Mn4+:0.200 (0.0000, 0.0000, 0.0000) [0.0000, 0.0000, 0.0000]\n", + "PeriodicSite: O2- (1.7146, 1.2124, 2.9699) [0.5000, 0.5000, 0.5000]" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "prim = loadfn(\"data/lmo_drx_prim.json\")\n", + "prim" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "f38abbe1-0c62-487f-81a3-4c93fb9078f9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Full Formula (Li0.7 Mn1.1 O1)\n", + "Reduced Formula: Li0.7Mn1.1O1\n", + "abc : 2.969850 2.969850 2.969850\n", + "angles: 60.000000 60.000000 60.000000\n", + "Overall Charge: +1.5\n", + "Sites (4)\n", + " # SP a b c\n", + "--- --------------------------------------------- ---- ---- ----\n", + " 0 Li+:0.250, Mn2+:0.250 0.75 0.75 0.75\n", + " 1 Li+:0.250, Mn2+:0.250 0.25 0.25 0.25\n", + " 2 Li+:0.200, Mn2+:0.200, Mn3+:0.200, Mn4+:0.200 0 0 0\n", + " 3 O2- 0.5 0.5 0.5\n" + ] + } + ], + "source": [ + "print(prim)" + ] + }, + { + "cell_type": "markdown", + "id": "fa3f0d95-197b-4438-8e49-60e6a4476321", + "metadata": {}, + "source": [ + "## 1) Create the cluster subspace" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "fa8bb81c-7c34-470b-941e-53d7aa8248d8", + "metadata": {}, + "outputs": [], + "source": [ + "from smol.cofe import ClusterSubspace\n", + "from smol.cofe.extern import EwaldTerm\n", + "\n", + "CLUSTERCUTOFFS = {2: 6, 3: 4, 4:2}\n", + "LTOL, STOL, ATOL = 0.15, 0.20, 15\n", + "BASIS = 'sinusoid'\n", + "\n", + "cs = ClusterSubspace.from_cutoffs(structure=prim,\n", + " cutoffs = CLUSTERCUTOFFS,\n", + " ltol = LTOL, \n", + " stol = STOL, \n", + " angle_tol = ATOL,\n", + " supercell_size = ('O2-'),\n", + " basis = BASIS, \n", + " orthonormal=False)\n", + "cs.add_external_term(EwaldTerm())" + ] + }, + { + "cell_type": "markdown", + "id": "ddba3fd6-456e-411f-a9fa-f67d52530a59", + "metadata": {}, + "source": [ + "## 2) Load data into a Structure Wrangler" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "c94afd75-be55-4f23-9113-b78920daff6f", + "metadata": {}, + "outputs": [], + "source": [ + "# load the training structures with oxidation state assigned\n", + "from monty.serialization import loadfn\n", + "\n", + "entries = loadfn(\"data/lmo_drx_entries.json\")" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "f4f94ca8-6660-4538-9f3d-f6461a3e09a9", + "metadata": {}, + "outputs": [], + "source": [ + "from smol.cofe import StructureWrangler\n", + "\n", + "sw = StructureWrangler(cs)\n", + "for entry in entries:\n", + " sw.add_entry(entry, verbose=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "028edcd6-ee20-49d4-9c22-ee6888285f8a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Our feature matrix has the following dimensions: (238, 387)\n" + ] + } + ], + "source": [ + "print ('Our feature matrix has the following dimensions:', \n", + " sw.feature_matrix.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "id": "699dcc41-339d-4cef-8f04-b15bec8b95aa", + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Basis/Orthogonal/Orthonormal : sinusoid/True/False\n", + " Unit Cell Composition : Li+0.7 Mn2+0.7 Mn3+0.2 Mn4+0.2 O2-1\n", + " Number of Orbits : 40\n", + "No. of Correlation Functions : 386\n", + " Cluster Cutoffs : 2: 5.94, 3: 3.64\n", + " External Terms : [EwaldTerm(total)]\n", + "Orbit Summary\n", + " ------------------------------------------------------------------------\n", + " | ID Degree Cluster Diameter Multiplicity No. Functions |\n", + " | 0 0 NA 0 1 |\n", + " | 1 1 0.0000 2 2 |\n", + " | 2 1 0.0000 1 4 |\n", + " | 3 2 1.8187 8 8 |\n", + " | 4 2 2.1000 6 3 |\n", + " | 5 2 2.9698 12 3 |\n", + " | 6 2 2.9699 6 10 |\n", + " | 7 2 3.4825 24 8 |\n", + " | 8 2 3.6373 4 3 |\n", + " | 9 2 3.6373 4 3 |\n", + " | 10 2 4.2000 6 3 |\n", + " | 11 2 4.2000 3 10 |\n", + " | 12 2 4.5768 24 8 |\n", + " | 13 2 4.6957 24 3 |\n", + " | 14 2 5.1439 24 4 |\n", + " | 15 2 5.1439 12 10 |\n", + " | 16 2 5.4560 24 8 |\n", + " | 17 2 5.4560 8 8 |\n", + " | 18 2 5.9397 12 3 |\n", + " | 19 2 5.9397 6 10 |\n", + " | 20 3 2.1000 12 12 |\n", + " | 21 3 2.9699 24 6 |\n", + " | 22 3 2.9699 12 12 |\n", + " | 23 3 2.9699 12 20 |\n", + " | 24 3 2.9699 8 4 |\n", + " | 25 3 2.9699 8 4 |\n", + " | 26 3 2.9699 8 20 |\n", + " | 27 3 3.4825 48 32 |\n", + " | 28 3 3.4825 48 16 |\n", + " | 29 3 3.4825 24 16 |\n", + " | 30 3 3.4825 24 12 |\n", + " | 31 3 3.4825 24 12 |\n", + " | 32 3 3.4825 24 20 |\n", + " | 33 3 3.4825 12 12 |\n", + " | 34 3 3.4825 12 20 |\n", + " | 35 3 3.6373 24 16 |\n", + " | 36 3 3.6373 24 8 |\n", + " | 37 3 3.6373 24 8 |\n", + " | 38 3 3.6373 24 12 |\n", + " | 39 3 3.6373 4 12 |\n", + " ------------------------------------------------------------------------\n" + ] + } + ], + "source": [ + "print(sw.cluster_subspace)" + ] + }, + { + "cell_type": "markdown", + "id": "03d5810d-3666-402a-ad34-6202b66b67c6", + "metadata": { + "tags": [] + }, + "source": [ + "## 3) Perform a \"piecewise fit\", with the first fit only using the Points and Ewald features." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "b16da32f-9fb3-47d4-a807-8ff331a5f12e", + "metadata": {}, + "outputs": [], + "source": [ + "from smol.cofe.wrangling.tools import unique_corr_vector_indices\n", + "unique_inds = unique_corr_vector_indices(sw, 'energy')" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "405984f4-78ba-4667-81ac-de61f879b37b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "There are 170 unique structure to train on.\n", + "The average energy is -20.41894778320028, while the std. dev. is 1.4573599233718875 eV/prim\n" + ] + } + ], + "source": [ + "unique_energies = sw.get_property_vector('energy')[unique_inds]\n", + "print(f'There are {len(unique_inds)} unique structure to train on.')\n", + "avg_en = np.average(unique_energies)\n", + "std_en = np.std(unique_energies)\n", + "print(f'The average energy is {avg_en}, while the std. dev. is {std_en} eV/prim')" + ] + }, + { + "cell_type": "markdown", + "id": "59c60e16-b76b-4262-b5d6-ff2745005e32", + "metadata": {}, + "source": [ + "#### Determine the feature matrix column indeces of Points and Ewald features" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "id": "0a6509aa-9dfc-408e-b5a8-d7afca5d9360", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The point indeces are [1, 2, 3, 4, 5, 6], while the Ewald index is 386\n" + ] + }, + { + "data": { + "text/plain": [ + "array([ 1, 2, 3, 4, 5, 6, 386])" + ] + }, + "execution_count": 104, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "point_inds = sw.cluster_subspace.function_inds_by_size[1]\n", + "ewald_ind = sw.feature_matrix.shape[1] - 1\n", + "print(f'The point indeces are {point_inds}, while the Ewald index is {ewald_ind}')\n", + "initial_fit_cols = np.concatenate([point_inds, [ewald_ind]])\n", + "initial_fit_cols" + ] + }, + { + "cell_type": "markdown", + "id": "ed9587fb-9add-45b8-ad5b-90f83b73321a", + "metadata": {}, + "source": [ + "### Perform initial fit with only Points and Ewald features, and determine the intercept." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "d7965706-dfb4-49d6-8449-3a3527413ff1", + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.linear_model import Lasso\n", + "from sklearn.model_selection import RepeatedKFold, GridSearchCV" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "id": "a6cf60fe-a939-4053-a1a6-8843869683c4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[-6.80864145 9.17087773 1.23408451 4.73489259 -3.1117202 -0.46576228\n", + " 0.05446231] -23.111363120607102\n" + ] + } + ], + "source": [ + "lasso = Lasso(alpha=1e-6, fit_intercept=True, max_iter=int(1e7))\n", + "lasso.fit(sw.feature_matrix[unique_inds][:, initial_fit_cols], unique_energies)\n", + "print(lasso.coef_, lasso.intercept_)" + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "id": "3fc8d80f-37a4-4f26-bb62-1750bdc106b1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[-23.11136312 -6.80864145 9.17087773 1.23408451 4.73489259\n", + " -3.1117202 -0.46576228 0.05446231]\n" + ] + } + ], + "source": [ + "initial_coefs = np.concatenate([[lasso.intercept_], lasso.coef_])\n", + "print(initial_coefs)" + ] + }, + { + "cell_type": "code", + "execution_count": 183, + "id": "070e6bad-64f6-4d6b-9486-a288c56aee47", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The effective dielectric constant is 18.361322767174926\n" + ] + } + ], + "source": [ + "print(f'The effective dielectric constant is {1 / initial_coefs[-1]}')" + ] + }, + { + "cell_type": "markdown", + "id": "74823281-ee56-45c3-a80e-e6fd89bb7f8a", + "metadata": {}, + "source": [ + "### Let's visualize the variance that these features can capture. To do so, we plot the \"centered energies\" by subtracting the DFT energies by the contributions from the fitted Point and Ewald features." + ] + }, + { + "cell_type": "code", + "execution_count": 197, + "id": "34ef357a-cdde-404f-912a-6d2e2bf6bfe1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 1.0, 'Centered energies')" + ] + }, + "execution_count": 197, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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+OY3v7lRcYwePZpp06YxduzYjWqnIao8ySqJjh07ctRRR3HFFVfQvHlz+vbtyy233MK3vvWtOlvf3nvvzT/+8Q9atPji32SfffbhySefrOZVZps2HymUwNVXX81ZZ53Feeedx+zZs/nkk0847bTTePzxx0sdGqtXry51CNV6++23Wbx4MS+88AL33HMPN99880a1d8cdd3DCCSdUufyGG25g8eLFuYcTgjV2TgoZW7BgARdccAG//e1vOfzww2nbti0tW7bkkEMO4YorrgBg7dq1/N///R/bbLMNXbt25cgjj+Szzz4D4OOPP0YSd955J3369KGsrIxLLrkEgGeeeYZLL72U+++/n3bt2jFw4MDcOn/4wx/Ss2dPevXqxS9/+UvWrFkDJDvFPfbYg7PPPpsuXbowevRoVqxYwc9+9jP69OlDjx49OOWUU1i2bFnuPVxxxRX07NmTLbbYgttuu63a91teXs6hhx5Kly5d6N+//zo78dGjR3PkkUfygx/8gPbt27PDDjvUeNbbAQMGsOeee/Luu+9y3HHH8cknn3DIIYfQrl07fv3rX7N8+XKOPfZYunbtSqdOndh1112ZPXt2DT+l9Rs6dCgPP/wwAK+88gqSeOqppwB4/vnnGTRoEADTp09n3333pWvXrpSVlTFixAjmz59ftM1ly5Zxwgkn0LlzZ7bffntef/31OovXrKacFDL26quvsnz5cg477LAq61x33XU89thjvPjii5SXl9O5c2d+/OMfr1PnlVde4f333+eFF15gzJgxTJ48mW9/+9ucd955HHXUUSxevJi3304mnj3++ONp0aIF06ZN48033+Qvf/kLt9xyS66t1157jX79+jFnzhxGjRrFL37xC6ZOncpbb73FtGnTmDVrFmPGjAGSxHPllVfy3HPP8cEHH1TZH17p6KOPZsstt6S8vJyHHnqI8847jxdeeCG3/IknnmD48OHMnz+fQw89lNNPP71G2/G9997j5ZdfZuedd+buu++mT58+PPnkkyxevJif//zn3HnnnSxYsICZM2cyb948fv/739fpMOWhQ4cyfvx4AF566SX69evHiy++mHs+dOhQILnYbOTIkZSXlzN58mRmzpzJ6NGji7Z50UUXMX36dKZPn86zzz7LnXfeWWfxmtWUk0LG5s2bR1lZ2Tr91IX+8Ic/cMkll7Dllluy+eabM3r0aB566KF1unYuvPBCWrduzcCBAxk4cGAuARSaPXs2Tz/9NL/5zW9o27Yt3bt35+yzz+a+++7L1dliiy0444wzaNGiBa1ateLmm2/mmmuuoUuXLrRv357zzjsvV/+BBx7gxBNPZMcdd6Rt27ZV7uAAZs6cySuvvMLll19Oq1atGDRoECeddBJ33313rs43v/lNDj74YJo3b85xxx1X5fuotMsuu9C5c2cOOeQQTjrpJE488cSi9Vq2bMm8efOYNm0azZs3Z/DgwRt0odeZZ55Jp06dco/zzz8fSJJCfhIYOXJk7vmLL76YSwr9+/dn//33Z/PNN6dbt2789Kc/zdUr9MADDzBq1Ci6dOlC7969OfPMM2sdr9nGajInmhuKrl27MnfuXFavXl1lYpgxYwaHHXYYzZp9kbObN2++TvfHV77yldzvbdq0YfHixVW2tWrVKnr27JkrW7t2Lb179849z/+9oqKCpUuXMnjw4FxZROS6m8rLy9dZttVWW1X5XsvLy3OJJb9+fhdR4ftYvnx5tdvmjTfeoH///lWus9Jxxx3HzJkzc0chxx57LJdccgktW7bktNNO45577gFg5cqVrF69msceewyAPn36MHHixFw71113HSeddNKX2t99992ZOnUqs2fP5q233uKJJ57gwgsvZO7cufzzn/9kr732ApKr688880xefvllFi1axNq1a+ncuXOV2yv/s6hu25rVFx8pZGz33XenVatWuZ1QMb179+bpp59m/vz5ucfy5cvp1avXetsvvKipd+/ebL755sydOzfX1sKFC5k0aVLR15SVldG6dWsmTZqUq79gwYJc0unZsyczZ87M1f/kk0+qjGWLLbbgs88+Y9GiRevUr8n7qK3C992yZUsuvPBC3nvvPf7+97/zpz/9ibvuuguAG2+8MffebrzxRo455pjc8/yEUJ02bdowePBgrr32WnbccUc222wzvvGNb3D11VezzTbbUFZWBsDIkSORxMSJE1m4cCFjx46lqlvg1mbbmtUXJ4WMdezYkTFjxvDjH/+Yxx57jKVLl7Jq1Sqefvppfv7znwNwyimnMGrUKGbMSO6YV1FRUeORST169ODjjz9m7dq1QLKjOeCAAzjnnHNYuHAha9euZfr06VV2YTRr1owf/ehHnH322cyZMweAWbNm8eyzzwJw5JFHcscdd/Dee++xdOlSLrrooipj6d27N9/4xjcYOXIky5cvZ+LEidx6662MGDGiZhurFnr06MGHH36Yez5u3Djeeecd1qxZQ4cOHWjZsiXNmzev03UOHTqUG264IddVtPfee6/zHGDRokW0a9eOTp06MWvWrNxggmKOPPJILrvsMj7//HM+/fRTrr/++jqN16xGImKTfQwePDiKee+994qWNyRjx46NwYMHR5s2baJHjx5x8MEHx9/+9reIiFizZk1cddVVse2220a7du2iX79+MXLkyIiI+OijjwKIVatW5doaOnRo3HzzzRERMXfu3Nhjjz2iU6dOsfPOO0dExPz58+OUU06JXr16RYcOHWLQoEFx7733RkTE7bffHnvsscc6sS1btixGjhwZW2+9dbRv3z4GDBgQ1157bW75ZZddFj169IiePXvGrbfeGkB88MEHRd/nzJkz4zvf+U507tw5+vXrF7/73e9yyy688MIYMWJE7nmx95avuvU89thj0bt37+jYsWNcccUVcc8998S2224bbdq0ie7du8cZZ5xRtN3bb789jj/++KJtDh06NDbffPNo27Zt7rHLLrvklj/zzDMBxPjx4yMi4p133gkg7rvvvlydd999N3bZZZdo27ZtDBw4MK688sro1atXbvlWW20Vzz33XERELFmyJI477rjo2LFjbLfddvHrX/96nbqFGtrf+dV/eT/3sIYNmBBV7FcVVRzKbgqGDBkSxYYwTp48me22264EEZllp6H9nXuai02HpH9FxJBiy9x9ZGZmOU4KZmaW46RgZmY5mSUFSYsLHmskXZ+3fD9JUyQtlTROkgdpm5llLLOkEBHtKh9AD2AZ8CCApDLgEeB8oAswAbg/q9jMzCxRqu6jI4A5wMvp88OBSRHxYEQsB0YDAyXVyT2bzcysZkqVFI4H7oovxsPuAOQmvYmIJcD0tNzMzDKSeVKQ1AcYCuRPAdkOWFBQdQHQvqAMSSdLmiBpQkVFRf0FambWBJXiSOEHwCsR8VFe2WKgcArLDsCigjIi4qaIGBIRQ7p161aPYVpN+XacZo1HKWZJ/QHwfwVlk0i6lACQ1BbYJi2vG+Muq7OmitpnZK2q+3ac1hjt9slNyS/juma74lr+/1nVMj1SkPQNoBfpqKM8jwI7ShomqRVwATAxIqZkGV9WfDtOM2uosu4+Oh54JCLW6RaKiApgGHAJ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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "centered_energies = unique_energies - np.dot(sw.feature_matrix[unique_inds][:, np.concatenate([[0], initial_fit_cols])], initial_coefs)\n", + "plt.hist(centered_energies, alpha=0.5, label='Centered on Pts+Ewald')\n", + "plt.hist(unique_energies - avg_en, alpha=0.5, label='Centered on avg')\n", + "plt.xlabel('Centered energy (eV/prim)', fontsize=14)\n", + "plt.xticks(fontsize=12)\n", + "plt.ylabel('Count', fontsize=14)\n", + "plt.yticks(fontsize=12)\n", + "plt.legend(fontsize=12)\n", + "plt.title('Centered energies', fontsize=18)" + ] + }, + { + "cell_type": "code", + "execution_count": 206, + "id": "cb02e492-e4fc-44d6-b786-931b4fc9293e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 1.0, 'A closer look at the centered energies')" + ] + }, + "execution_count": 206, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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iIhIJiUJERHJVKtPXItsjvXr1zN79mxWrFhR6lBEqlyTJk3o1KkTdeps3r6AkoRstRYuXIiZsdNOO232F0mkJlm/fj1z5sxh4cKFbLvttpW/oAL6ZshWa/HixbRv314JQrY4derUoX379ixZsqTyypW1VQXxiNRK69ato3799M9ni2wZ6tevz1dffVV5xUooSchWrfIfIRSpnapq2dY5CZHNNG/p6pzl7Zs3LHIkIlVPexIiUu3MjOnTp5c6jFqpW7duPPfcczmnjR8/nk6dOlXr/LUnIZJwzbPTCn7Nii9zH/dt0mDjr9e5B+yYd7v33HMPV199NVOnTqVZs2b07duXYcOGsffeexccY9Lw4cOZPn06Y8aM2ax2aiIzo3HjxpgZLVq04JhjjmHkyJHUrVuXbt26cdttt/HDH/6wyua333778eqrr1Kv3tef9fe//30ef7yin1ivXbQnIVIDXX311ZxzzjkMHTqUefPm8emnn3L66afz6KOPljq0KjkZWp0mTpzI8uXLef7557nnnnu49dZbN6u90aNHM2jQoMzpN9xwA8uXLy9/bEkJApQkRGqcJUuWcNFFF3HjjTdy5JFH0qRJE+rXr89hhx3GyJEjgTAO/k9/+hM9evSgTZs2HH300Xz++ecAfPLJJ5gZd955J126dKFt27aMGDECgKeffprLLruM+++/n6ZNm9KnT5/yeZ5yyil06NCBjh07csEFF7Bu3TogrCT32msvzj33XFq3bs3w4cP58ssvOe+88+jSpQvt27fntNNOY9WqVeXvYeTIkXTo0IHtttuO22+/vcL3O3fuXA4//HBat25Nz549N1ipDx8+nKOPPppf/OIXNGvWjF122SXvOz/36tWLffbZh/fee48TTzyRTz/9lMMOO4ymTZty5ZVXsnr1ak444QTatGlDy5Yt+c53vsO8efPy/JQqN2DAAP7xj38A8PLLL2Nm/POf/wTgueeeo2/fvgDMmDGDH/zgB7Rp04a2bdty/PHHs3jx4pxtrlq1ikGDBtGqVSu++c1v8sYbb1RZvFmUJERqmP/85z+sXr2aI444IrPOddddx9ixY3nhhReYO3curVq14owzztigzssvv8wHH3zA888/z6WXXsr777/PwQcfzNChQznmmGNYvnw5EydOBOCkk06iXr16TJ8+nbfffpv/+7//47bbbitv67XXXqN79+7Mnz+fYcOG8bvf/Y5p06bxzjvvMH36dObMmcOll14KhER01VVX8eyzz/Lhhx9mHk8v8/Of/5xOnToxd+5cHnroIYYOHcrzzz9fPv2xxx7j2GOPZfHixRx++OGceeaZefXjlClTeOmll9h11125++676dKlC48//jjLly/n/PPP584772TJkiXMmjWLRYsWcfPNN9OoUaPKG87TgAEDGD9+PAAvvvgi3bt354UXXih/PmDAAADcnSFDhjB37lzef/99Zs2axfDhw3O2eckllzBjxgxmzJjBM888w5133lll8WZRkhCpYRYtWkTbtm03OM6d9re//Y0RI0bQqVMnGjRowPDhw3nooYc2OBR08cUX06hRI/r06UOfPn3KE0LavHnzeOqpp/jLX/5CkyZN2HbbbTn33HO57777yutst912nHXWWdSrV4+GDRty6623cs0119C6dWuaNWvG0KFDy+s/8MADnHzyyfTu3ZsmTZpkrvAAZs2axcsvv8wVV1xBw4YN6du3L6eeeip33313eZ29996bQw89lLp163LiiSdmvo8yu+22G61ateKwww7j1FNP5eSTT85Zr379+ixatIjp06dTt25d+vXrR/PmzStsO5ezzz6bli1blj8uvPBCICSJZFIYMmRI+fMXXnihPEn07NmTAw44gAYNGtCuXTt+85vflNdLe+CBBxg2bBitW7emc+fOnH322QXHWyiduBapYdq0acPChQv56quvMhPFzJkzOeKIIza4Wrxu3bobHC75xje+Uf5/48aNWb58eWZba9eupUOHDuVl69evp3PnzuXPk/8vWLCAlStX0q9fv/Iydy8/PDV37twNpnXt2jXzvc6dO7c80STrJw8ppd/H6tWrK+ybt956i549e2bOs8yJJ57IrFmzyvdSTjjhBEaMGEH9+vU5/fTTueeeewBYs2YNX331FWPHjgWgS5cuTJo0qbyd6667jlNPPXWj9vfYYw+mTZvGvHnzeOedd3jssce4+OKLWbhwIa+//jr77rsvAPPnz+fss8/mpZdeYtmyZaxfv55WrVpl9lfys6iob6uK9iREapg99tiDhg0blq+UcuncuTNPPfUUixcvLn+sXr2ajh07Vtp++iKrzp0706BBAxYuXFje1tKlS5k8eXLO17Rt25ZGjRoxefLk8vpLliwpT0IdOnRg1qxZ5fU//fTTzFi22247Pv/8c5YtW7ZB/XzeR6HS77t+/fpcfPHFTJkyhVdeeYUnnniCu+66C4Cbbrqp/L3ddNNNHHfcceXPkwmiIo0bN6Zfv35ce+219O7dm2222YY999yTq6++mh49etC2bVsAhgwZgpkxadIkli5dypgxY3D3nG0W0rdVpehJwsyONbP3zWyFmc0ws31i+f5mNtXMVprZODOr/hQpUgO1aNGCSy+9lDPOOIOxY8eycuVK1q5dy1NPPcX5558PwGmnncawYcOYOTP8CuWCBQvyHvnUvn17PvnkE9avXw+EFc+BBx7Ib3/7W5YuXcr69euZMWNG5iGPOnXq8Mtf/pJzzz2X+fPnAzBnzhyeeeYZAI4++mhGjx7NlClTWLlyJZdccklmLJ07d2bPPfdkyJAhrF69mkmTJjFq1CiOP/74/DqrAO3bt+ejjz4qfz5u3Djeffdd1q1bR/Pmzalfvz5169at0nkOGDCAG264ofzQ0n777bfBc4Bly5bRtGlTWrZsyZw5c8oHJ+Ry9NFHc/nll/PFF18we/Zsrr/++iqNNyd3L9oDOACYCXyPkKA6xkdbYAnwM6AhMBJ4tbL2+vXr5yKbasqUKVXSzmdLVuV8bK4xY8Z4v379vHHjxt6+fXs/9NBD/d///re7u69bt87//Oc/+4477uhNmzb17t27+5AhQ9zd/eOPP3bA165dW97WgAED/NZbb3V394ULF/pee+3lLVu29F133dXd3RcvXuynnXaad+zY0Zs3b+59+/b1e++9193d77jjDt9rr702iG3VqlU+ZMgQ33777b1Zs2beq1cvv/baa8unX3755d6+fXvv0KGDjxo1ygH/8MMPc77PWbNm+Y9+9CNv1aqVd+/e3f/617+WT7v44ov9+OOPL3+e670lVTSfsWPHeufOnb1FixY+cuRIv+eee3zHHXf0xo0b+7bbbutnnXVWznbvuOMOP+mkk3K2OWDAAG/QoIE3adKk/LHbbruVT3/66acd8PHjx7u7+7vvvuuA33fffeV13nvvPd9tt928SZMm3qdPH7/qqqu8Y8eO5dO7du3qzz77rLu7r1ixwk888URv0aKF77zzzn7llVduUDctaxkHJnie623zjN2a6mBmrwCj3H1UqnwwMMjd94zPmwALgV3dfWpWe/379/d8h8OJpL3//vvsvPPOm92Obssh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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "bins = np.arange(-0.7, 0.71, 0.025)\n", + "plt.hist(centered_energies, bins=bins, alpha=0.5, label='Centered on Pts+Ewald')\n", + "plt.xlabel('Centered energy (eV/prim)', fontsize=14)\n", + "plt.xticks(fontsize=12)\n", + "plt.ylabel('Count', fontsize=14)\n", + "plt.yticks(fontsize=12)\n", + "plt.legend(fontsize=12)\n", + "plt.title('A closer look at the centered energies', fontsize=18)" + ] + }, + { + "cell_type": "code", + "execution_count": 207, + "id": "f48cbc40-086e-409f-bb21-d4ccf4413bd5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.07965979068909568\n" + ] + } + ], + "source": [ + "print(f'The variance of DFT energies is {np.std(unique_energies)}, while the variance of the centered energy is {np.std(centered_energies)} eV/prim')" + ] + }, + { + "cell_type": "markdown", + "id": "20596585-3de9-4c35-9d9a-b78cb57eef24", + "metadata": {}, + "source": [ + "## 4) Perform cross validation on the rest of features to train the L1 hyperparameter." + ] + }, + { + "cell_type": "code", + "execution_count": 131, + "id": "919cbcb2-8d63-4c29-b2d4-e58b48bea77a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 1, 2, 3, 4, 5, 6, 386])" + ] + }, + "execution_count": 131, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "initial_fit_cols" + ] + }, + { + "cell_type": "code", + "execution_count": 132, + "id": "3294d06a-50fc-4fa5-ac72-df5555a19485", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "high_order_cols = set(np.arange(sw.feature_matrix.shape[1])) - set(initial_fit_cols) - set([0])\n", + "high_order_cols = list(high_order_cols)" + ] + }, + { + "cell_type": "code", + "execution_count": 143, + "id": "4a230926-d120-49ed-be9d-99cb656e6203", + "metadata": {}, + "outputs": [], + "source": [ + "alpha_scan = np.logspace(-6, -3, 50) # range of L1 hyperparameters to scan\n", + "rkf = RepeatedKFold(n_repeats=1, n_splits=5)" + ] + }, + { + "cell_type": "code", + "execution_count": 144, + "id": "7e7f1584-9895-497a-a400-3a2f81b46b05", + "metadata": {}, + "outputs": [], + "source": [ + "test_inds = [test for train, test in rkf.split(sw.feature_matrix[unique_inds], unique_energies)]\n", + "train_inds = [train for train, test in rkf.split(sw.feature_matrix[unique_inds], unique_energies)]" + ] + }, + { + "cell_type": "code", + "execution_count": 145, + "id": "4955f15a-4ebc-43bc-8a79-f8547c950c9b", + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "For hyperparameter 1e-06\n", + "Average and std of test errors are 0.023563371828414968, 0.006944566676647027\n", + "Training error is 0.012781053174431387\n", + "For hyperparameter 1.151395399326448e-06\n", + "Average and std of test errors are 0.02293354971559951, 0.006704246228834625\n", + "Training error is 0.0128531409875664\n", + "For hyperparameter 1.325711365590108e-06\n", + "Average and std of test errors are 0.022491265306204898, 0.006497581056875485\n", + "Training error is 0.01294077039585756\n", + "For hyperparameter 1.5264179671752333e-06\n", + "Average and std of test errors are 0.02248162195120036, 0.006500252501135466\n", + "Training error is 0.013021795190002268\n", + "For hyperparameter 1.757510624854793e-06\n", + "Average and std of test errors are 0.022634686221190584, 0.0066889555610161735\n", + "Training error is 0.013116645073882102\n", + "For hyperparameter 2.0235896477251557e-06\n", + "Average and std of test errors are 0.022829775463764936, 0.006885748019031812\n", + "Training error is 0.01321298400262933\n", + "For hyperparameter 2.3299518105153717e-06\n", + "Average and std of test errors are 0.02302586169340968, 0.007052560663054212\n", + "Training error is 0.013334376209673437\n", + "For hyperparameter 2.6826957952797274e-06\n", + "Average and std of test errors are 0.023127485956180856, 0.007048511864002914\n", + "Training error is 0.013453278370306989\n", + "For hyperparameter 3.0888435964774785e-06\n", + "Average and std of test errors are 0.023229610753404323, 0.0070508067397400094\n", + "Training error is 0.013539253070672138\n", + "For hyperparameter 3.5564803062231285e-06\n", + "Average and std of test errors are 0.023266548535205104, 0.006998320489812751\n", + "Training error is 0.013661416589809298\n", + "For hyperparameter 4.094915062380427e-06\n", + "Average and std of test errors are 0.023127938635561163, 0.006845356410725053\n", + "Training error is 0.013831833143129644\n", + "For hyperparameter 4.71486636345739e-06\n", + "Average and std of test errors are 0.022975996645623418, 0.0067124300138268166\n", + "Training error is 0.014021180784567013\n", + "For hyperparameter 5.428675439323859e-06\n", + "Average and std of test errors are 0.02286207688677446, 0.0065994960089153865\n", + "Training error is 0.014135613031720942\n", + "For hyperparameter 6.250551925273976e-06\n", + "Average and std of test errors are 0.02272329846417087, 0.006499493073260053\n", + "Training error is 0.014275456967733703\n", + "For hyperparameter 7.196856730011514e-06\n", + "Average and std of test errors are 0.022638905620220702, 0.006421383474862832\n", + "Training error is 0.014459661603532932\n", + "For hyperparameter 8.286427728546843e-06\n", + "Average and std of test errors are 0.02256024189177423, 0.006350046455697075\n", + "Training error is 0.01456256369146573\n", + "For hyperparameter 9.540954763499944e-06\n", + "Average and std of test errors are 0.022525874910026788, 0.00630133774625521\n", + "Training error is 0.014704724323064826\n", + "For hyperparameter 1.0985411419875572e-05\n", + "Average and std of test errors are 0.022517269462737168, 0.006264379355591736\n", + "Training error is 0.014884560053339276\n", + "For hyperparameter 1.2648552168552958e-05\n", + "Average and std of test errors are 0.0225363963006239, 0.0062373016527011585\n", + "Training error is 0.015102734537071474\n", + "For hyperparameter 1.4563484775012445e-05\n", + "Average and std of test errors are 0.022585325313955216, 0.006208592861109417\n", + "Training error is 0.015331289463222698\n", + "For hyperparameter 1.67683293681101e-05\n", + "Average and std of test errors are 0.022659032766393705, 0.006198681583730133\n", + "Training error is 0.015574023285933172\n", + "For hyperparameter 1.9306977288832496e-05\n", + "Average and std of test errors are 0.02273938967855854, 0.006196976611711143\n", + "Training error is 0.015891823043952927\n", + "For hyperparameter 2.2229964825261955e-05\n", + "Average and std of test errors are 0.02282334286833011, 0.006208006421729415\n", + "Training error is 0.01625074849499329\n", + "For hyperparameter 2.559547922699533e-05\n", + "Average and std of test errors are 0.02290195669873721, 0.006219359339510926\n", + "Training error is 0.016667022971153543\n", + "For hyperparameter 2.94705170255181e-05\n", + "Average and std of test errors are 0.022979372375563415, 0.006225351297098623\n", + "Training error is 0.017159664176712473\n", + "For hyperparameter 3.39322177189533e-05\n", + "Average and std of test errors are 0.023058584468062065, 0.006228575474097494\n", + "Training error is 0.017671070555096275\n", + "For hyperparameter 3.906939937054621e-05\n", + "Average and std of test errors are 0.023152870284827785, 0.006221497223997023\n", + "Training error is 0.018137111480914948\n", + "For hyperparameter 4.498432668969444e-05\n", + "Average and std of test errors are 0.02324341764990014, 0.006209253785450864\n", + "Training error is 0.01857631558321177\n", + "For hyperparameter 5.1794746792312125e-05\n", + "Average and std of test errors are 0.023335748327581268, 0.0061983508781675075\n", + "Training error is 0.019168024905050835\n", + "For hyperparameter 5.9636233165946365e-05\n", + "Average and std of test errors are 0.02341146988765298, 0.0061842058029032134\n", + "Training error is 0.019694089981011093\n", + "For hyperparameter 6.866488450042999e-05\n", + "Average and std of test errors are 0.023497470981836455, 0.006183577039440269\n", + "Training error is 0.020062838572648012\n", + "For hyperparameter 7.906043210907701e-05\n", + "Average and std of test errors are 0.023592971323725353, 0.006191344248965314\n", + "Training error is 0.02044988250444743\n", + "For hyperparameter 9.102981779915228e-05\n", + "Average and std of test errors are 0.02369449184258536, 0.006211235254223621\n", + "Training error is 0.02087978920274022\n", + "For hyperparameter 0.00010481131341546853\n", + "Average and std of test errors are 0.02380808041275113, 0.006241961603255449\n", + "Training error is 0.021316314449583672\n", + "For hyperparameter 0.00012067926406393288\n", + "Average and std of test errors are 0.023913508582457277, 0.00626580840854926\n", + "Training error is 0.02184390751466224\n", + "For hyperparameter 0.00013894954943731373\n", + "Average and std of test errors are 0.024007659392349744, 0.006279333029944376\n", + "Training error is 0.022398251634560287\n", + "For hyperparameter 0.00015998587196060574\n", + "Average and std of test errors are 0.024096964518648845, 0.006290855065160285\n", + "Training error is 0.02304312715442914\n", + "For hyperparameter 0.00018420699693267163\n", + "Average and std of test errors are 0.02418839892736822, 0.006307534161273502\n", + "Training error is 0.023627867356248815\n", + "For hyperparameter 0.00021209508879201905\n", + "Average and std of test errors are 0.024284842734620983, 0.00633138313874674\n", + "Training error is 0.024394124171978372\n", + "For hyperparameter 0.000244205309454865\n", + "Average and std of test errors are 0.024387978405299764, 0.006364473270875421\n", + "Training error is 0.02531806451684958\n", + "For hyperparameter 0.0002811768697974231\n", + "Average and std of test errors are 0.024500235861041383, 0.0064098649041919665\n", + "Training error is 0.026225135409746095\n", + "For hyperparameter 0.00032374575428176434\n", + "Average and std of test errors are 0.024622946025895667, 0.006467066196726164\n", + "Training error is 0.02721734790890345\n", + "For hyperparameter 0.0003727593720314938\n", + "Average and std of test errors are 0.02475864214528502, 0.006539373045265627\n", + "Training error is 0.028285250913031214\n", + "For hyperparameter 0.00042919342601287783\n", + "Average and std of test errors are 0.024912077024803657, 0.0066348372458585585\n", + "Training error is 0.029628330694152882\n", + "For hyperparameter 0.0004941713361323833\n", + "Average and std of test errors are 0.025086626567395836, 0.006760399423012437\n", + "Training error is 0.03127620918841993\n", + "For hyperparameter 0.0005689866029018293\n", + "Average and std of test errors are 0.025281528143233558, 0.00691906946597457\n", + "Training error is 0.033243789980446053\n", + "For hyperparameter 0.0006551285568595509\n", + "Average and std of test errors are 0.02550183626107064, 0.007120544431204602\n", + "Training error is 0.03528676407311314\n", + "For hyperparameter 0.0007543120063354615\n", + "Average and std of test errors are 0.02575091487187798, 0.007378019855835754\n", + "Training error is 0.03783326122135027\n", + "For hyperparameter 0.000868511373751352\n", + "Average and std of test errors are 0.02603929652880666, 0.007718568474509255\n", + "Training error is 0.04091855754174897\n", + "For hyperparameter 0.001\n", + "Average and std of test errors are 0.026375837759087296, 0.008167339428906895\n", + "Training error is 0.04458871614448672\n" + ] + } + ], + "source": [ + "from sklearn.metrics import mean_squared_error\n", + "\n", + "test_errs = []\n", + "train_errs = []\n", + "\n", + "for alpha in alpha_scan:\n", + " print(f'Fkey= hyperparameter {alpha}')\n", + " lasso = Lasso(alpha=alpha,\n", + " fit_intercept=False,\n", + " max_iter=int(1e7)\n", + " )\n", + " test_rmses = []\n", + " \n", + " # Cross validation fits\n", + " for train_index, test_index in zip(train_inds, test_inds):\n", + " act_train_inds = [unique_inds[ind] for ind in train_index] # Adjust indices to reflect actual feature matrix rows\n", + " act_test_inds = [unique_inds[ind] for ind in test_index]\n", + " \n", + " lasso.fit(sw.feature_matrix[act_train_inds][:, high_order_cols], centered_energies[train_index]) # Fit high order terms on the centered energies\n", + " all_coefs = np.concatenate([initial_coefs[:-1], lasso.coef_, [initial_coefs[-1]]])\n", + " this_pred = np.dot(sw.feature_matrix[act_test_inds], all_coefs) # Predictions on test set\n", + " this_test = mean_squared_error(this_pred, sw.get_property_vector('energy')[act_test_inds], squared=False)\n", + " test_rmses.append(this_test)\n", + " test_errs.append(test_rmses)\n", + " print(f'Average and std of test errors are {np.average(test_errs)}, {np.std(test_errs)}')\n", + " \n", + " # Fit on entire training set\n", + " full_fit = Lasso(alpha=alpha, fit_intercept=False, max_iter=int(1e7))\n", + " full_fit.fit(sw.feature_matrix[unique_inds][:, high_order_cols], centered_energies)\n", + " all_coefs = np.concatenate([initial_coefs[:-1], full_fit.coef_, [initial_coefs[-1]]])\n", + " preds = np.dot(sw.feature_matrix[unique_inds], all_coefs)\n", + " train_rmse = mean_squared_error(preds, sw.get_property_vector('energy')[unique_inds], squared=False)\n", + " train_errs.append(train_rmse)\n", + " print(f'Training error is {train_rmse}')\n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "02d35772-176f-4fd2-af91-110ca8e37c66", + "metadata": {}, + "source": [ + "#### Plot the cross validation trials" + ] + }, + { + "cell_type": "code", + "execution_count": 184, + "id": "190d317e-c67d-4ee4-989d-fcb11441ce6c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 184, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "mean_cvs = 1000 * np.array([np.average(tests) for tests in test_errs])\n", + "std_cvs = 1000 * np.array([np.std(tests) for tests in test_errs])\n", + "plt.plot(alpha_scan, mean_cvs, label='CV')\n", + "plt.fill_between(alpha_scan,\n", + " mean_cvs + std_cvs,\n", + " mean_cvs - std_cvs,\n", + " alpha=0.6\n", + " )\n", + " \n", + "plt.plot(alpha_scan, 1000 * np.array(train_errs), label='Train')\n", + "plt.xscale('log')\n", + "plt.xlabel('L1 hyperparameter', fontsize=14)\n", + "plt.xticks(fontsize=12)\n", + "plt.ylabel('RMSE (meV/prim)', fontsize=14)\n", + "plt.yticks(fontsize=12)\n", + "plt.title('L1 Hyperparameter training curve', fontsize=16)\n", + "plt.legend(fontsize=12)" + ] + }, + { + "cell_type": "code", + "execution_count": 152, + "id": "30d02a2c-240d-4849-b5b0-9ada40461758", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[(13, 20.919178970324158),\n", + " (11, 21.304634756308214),\n", + " (15, 21.38028596507715),\n", + " (14, 21.45740580491836),\n", + " (12, 21.495039780587),\n", + " (2, 21.606696487415693),\n", + " (10, 21.741839639121704),\n", + " (16, 21.976003202067727),\n", + " (1, 22.30372760278405),\n", + " (17, 22.37097685881364)]" + ] + }, + "execution_count": 152, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Find the optimal hyperparameter that minimizes the CV score\n", + "sorted_mean_cvs = sorted([(i, cv) for (i, cv) in enumerate(mean_cvs)], key=lambda t: t[1])" + ] + }, + { + "cell_type": "code", + "execution_count": 160, + "id": "546a18ee-f16d-4079-883d-f10c8f0dda3e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The optimal hyperparameter is 6.250551925273976e-06\n" + ] + } + ], + "source": [ + "opt_alpha = alpha_scan[sorted_mean_cvs[0][0]]\n", + "print(f'The optimal hyperparameter is {opt_alpha}')" + ] + }, + { + "cell_type": "markdown", + "id": "e8df21e7-e562-4721-9f98-c9f80e74beda", + "metadata": {}, + "source": [ + "## 5) Obtain the cluster expansion model that minimizes CV" + ] + }, + { + "cell_type": "code", + "execution_count": 186, + "id": "592806b2-4768-4c0d-ba46-99588e78a39b", + "metadata": {}, + "outputs": [], + "source": [ + "final_fit = Lasso(alpha=opt_alpha, fit_intercept=False, max_iter=int(1e7))\n", + "final_fit.fit(sw.feature_matrix[unique_inds][:, high_order_cols], centered_energies)\n", + "all_coefs = np.concatenate([initial_coefs[:-1], final_fit.coef_, [initial_coefs[-1]]])" + ] + }, + { + "cell_type": "code", + "execution_count": 159, + "id": "5fb06574-2441-4e0a-9840-9c8b4e97c0a2", + "metadata": {}, + "outputs": [], + "source": [ + "reg_data = RegressionData.from_sklearn(\n", + " final_fit, sw.feature_matrix[unique_inds], unique_energies\n", + ")\n", + "\n", + "expansion = ClusterExpansion(\n", + " sw.cluster_subspace, coefficients=all_coefs, regression_data=reg_data\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "9780b31c-4cf5-4ce4-a470-6e150e94d9a7", + "metadata": {}, + "source": [ + "## 6) Get an idea of the predictive capabilities of this cluster expansion" + ] + }, + { + "cell_type": "code", + "execution_count": 165, + "id": "68874fc4-fbe6-42eb-9c92-91508090589e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[(1, 1), (2, 7), (3, 112)]" + ] + }, + "execution_count": 165, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "first_inds = [(size, inds[0]) for size, inds in sw.cluster_subspace.function_inds_by_size.items()]\n", + "first_inds" + ] + }, + { + "cell_type": "code", + "execution_count": 163, + "id": "86234fa6-02b2-487a-9ac4-4d9662bc7d7a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Out-of-sample RMSE is: 0.01142790133610809 eV/prim\n", + "In-sample RMSE is: 0.014902570493376914 eV/prim\n", + "Number of Features > 1E-5: 69/387\n", + "Point correlation coeficients: [-23.11136312 -6.80864145 9.17087773 1.23408451 4.73489259\n", + " -3.1117202 -0.46576228]\n" + ] + }, + { + "data": { + "text/plain": [ + "Text(0, 0.5, 'Magnitude |$w_i$| eV/prim')" + ] + }, + "execution_count": 163, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from sklearn.model_selection import train_test_split\n", + "X_train, X_test, y_train, y_test = train_test_split(\n", + " sw.feature_matrix[unique_inds], unique_energies,\n", + " test_size=0.2\n", + ")\n", + "\n", + "final_fit = Lasso(alpha=opt_alpha, fit_intercept=False, max_iter=int(1e7))\n", + "final_fit.fit(sw.feature_matrix[unique_inds][:, high_order_cols], centered_energies)\n", + "all_coefs = np.concatenate([initial_coefs[:-1], final_fit.coef_, [initial_coefs[-1]]])\n", + "\n", + "y_predict = np.dot(X_test, all_coefs)\n", + "y_train_predict = np.dot(X_train, all_coefs)\n", + "print(f'Out-of-sample RMSE is: {mean_squared_error(y_test, y_predict, squared=False)} eV/prim')\n", + "print(f'In-sample RMSE is: {mean_squared_error(y_train, y_train_predict, squared=False)} eV/prim')\n", + "print(f'Number of Features > 1E-5: {sum(np.abs(all_coefs) > 1E-5)}/{len(all_coefs)}')\n", + "\n", + "first_pair = sw.cluster_subspace.orbits_by_size[2][0].bit_id\n", + "print(f'Point correlation coeficients: {all_coefs[:first_pair]}')\n", + "# plot the coefficients (excluding those for points))\n", + "plt.stem(range(len(all_coefs) - first_pair), all_coefs[first_pair:],\n", + " linefmt='-', markerfmt=' ')#, basefmt=' ')\n", + "plt.xlabel('Coefficient index (i in $w_i$)')\n", + "plt.ylabel('Magnitude |$w_i$| eV/prim')" + ] + }, + { + "cell_type": "markdown", + "id": "c136017e-7ea6-47b2-b0e4-e254ab59c672", + "metadata": {}, + "source": [ + "## 7) Plot the ECI" + ] + }, + { + "cell_type": "code", + "execution_count": 167, + "id": "bbc01973-50ac-4d06-8d1b-71550fd9aff8", + "metadata": {}, + "outputs": [], + "source": [ + "reg_data = reg_data = RegressionData.from_sklearn(\n", + " final_fit, sw.feature_matrix[unique_inds], unique_energies\n", + ")\n", + "expansion = ClusterExpansion(cluster_subspace=sw.cluster_subspace,\n", + " coefficients=all_coefs,\n", + " regression_data=reg_data\n", + " )\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 189, + "id": "64fa2322-0f66-40ad-b81e-b85c9a6931a8", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(array([-60., -40., -20., 0., 20., 40., 60., 80., 100.]),\n", + " [Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, ''),\n", + " Text(0, 0, '')])" + ] + }, + "execution_count": 189, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZcAAAEOCAYAAABFD1qGAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAmDElEQVR4nO3de5zcdX3v8dc7F8iSCyEmUrISEhESbg0pKdQiokCNl1rTRBHl9GY9UKie0tpYOKfQiFrQtPXU4oVYKmgs5WKIFTyNBwE9RS4G1iQGEhRiwA3WDSQxl81t8zl//H4TZiczuzO7v5n5ze77+XjMI5nv77czn/3tzHzme1dEYGZmlqURzQ7AzMyGHicXMzPLnJOLmZllzsnFzMwy5+RiZmaZc3IxM7PMjWp2AI0wefLkmD59es0/91zXLgBeO2VsxhENX76mZq3jiSee2BIRUwbys7lMLpKmA58HXg/sBe4GroqIA5IuBD4HTAMeA/4wIjb19XjTp09n1apVNcfx3psfAeCOy19f889aeb6mZq1DUp+frX3Ja7PY54FfAMcBZwLnA1dKmgwsB64FJgGrgDuaFKOZmVWQ1+QyA7gzIvZExM+B/wBOAxYA6yLirojYAywGZkua1bxQzcysVF6Tyz8Cl0g6SlI78DZeSTCrCydFxC7g2bTczMxyIq/J5bskCeOXwM9Imr9WAOOA7SXnbgfGlz6ApMskrZK0qqurq77RmplZL7lLLpJGACtJ+lbGApOBY4BPATuBCSU/MgHYUfo4EbE0IuZGxNwpUwY02MHMzAYoj6PFJgHHAzdFxF5gr6QvA58APgv8QeFESWOBE4F1zQi0EVZ0dLJk5QY2b+tm6sQ2Fs2byfw57c0Oy8ysT7mruUTEFmAjcIWkUZImkiSU1cA9wOmSFkoaA1wHrImI9U0LuI5WdHRyzfK1dG7rJoDObd1cs3wtKzo6mx2amVmfcpdcUguAtwJdwE+AA8CfR0QXsBD4JLAVOAe4pFlB1tuSlRvo3t/Tq6x7fw9LVm5oUkRmZtXJY7MYEfFD4E0Vjt0PDIuhx5u3dddUbmaWF3mtuRgwdWJbTeVmZnnh5JJji+bNpG30yF5lbaNHsmjezCZFZGZWnVw2i1miMCrso3evYV/PQdo9WszMWoSTS87Nn9PO7Y8/D3ixRzNrHW4WMzOzzDm5mJlZ5pxczMwsc04uZmaWOScXMzPLnJOLmZllzsnFzMwy5+RiZmaZc3IxM7PMObmYmVnmnFzMzCxzTi5mZpY5JxczM8uck4uZmWXOycXMzDLn5GJmZplzcjEzs8w5uZiZWeZym1wkXSLpaUm7JD0r6by0/EJJ6yXtlvSgpBOaHauZmfWWy+Qi6beATwF/BIwH3gg8J2kysBy4FpgErALuaFacZmZW3qhmB1DBx4DrI+LR9H4ngKTLgHURcVd6fzGwRdKsiFjflEjNzOwwuau5SBoJzAWmSPqJpJ9JuklSG3AasLpwbkTsAp5Ny83MLCdyl1yAY4HRwLuB84AzgTnAXwPjgO0l528naTrrRdJlklZJWtXV1VXXgM3MrLc8Jpfu9N9/iogXI2IL8A/A24GdwISS8ycAO0ofJCKWRsTciJg7ZcqUugZsZma95S65RMRW4GdAlDm8DphduCNpLHBiWm5mZjmRu+SS+jLwYUmvlnQMcBVwL3APcLqkhZLGANcBa9yZb2aWL3lNLh8HfgA8AzwNdACfjIguYCHwSWArcA5wSbOCNDOz8nI5FDki9gNXprfSY/cDsxoelJmZVS2vNRczM2thTi5mZpY5JxczM8uck4uZmWXOycXMzDLn5GJmZplzcjEzs8w5uZiZWeacXMzMLHNOLmZmljknFzMzy5yTi5mZZc7JxczMMufkYmZmmXNyMTOzzDm5mJlZ5pxczMwsc04uZmaWOScXMzPLnJOLmZllzsnFzMwy5+RiZmaZy3VykXSSpD2SlhWVXShpvaTdkh6UdEIzYzQzs8PlOrkAnwN+ULgjaTKwHLgWmASsAu5oTmhmZlZJbpOLpEuAbcB3iooXAOsi4q6I2AMsBmZLmtX4CM3MrJJcJhdJE4DrgY+UHDoNWF24ExG7gGfTcjMzy4lcJhfg48AtEfFCSfk4YHtJ2XZgfOkDSLpM0ipJq7q6uuoUppmZlZO75CLpTOAi4DNlDu8EJpSUTQB2lJ4YEUsjYm5EzJ0yZUrmcZqZWWWjmh1AGW8CpgPPS4KktjJS0qnAF4E/KJwoaSxwIrCu4VGamVlFeUwuS4F/K7r/lyTJ5or0/hJJC4H7gOuANRGxvqERWl2s6OhkycoNbN7WzdSJbSyaN5P5c9qbHZaZDUDukktE7AZ2F+5L2gnsiYiu9P5C4CZgGfAYcEkz4rRsrejo5Jrla+ne3wNA57Zurlm+FsAJxqwF5S65lIqIxSX37wc89HiIWbJyw6HEUtC9v4clKzc4uZi1oNx16NvwtHlbd03lZpZvVdVcJI0g6Wg/n6T/ow3oAp4Evl1myLBZTaZObKOzTCKZOrGtCdGY2WD1WXOR1CbpfwEvkHSgv4Vk9NY+YAbwN8BGSd+S9Bv1DtaGrkXzZtI2emSvsrbRI1k0b+aAH3NFRyfn3vgAM66+j3NvfIAVHZ2DDdPMqtRfzeXHwCPAZSQ1lP2lJ6QLR74fuEPSJyLiS9mHaUNdoV/lo3evYV/PQdoHOVrMAwTMmqu/5PLWiPhRXydExCbgBkl/D3iFYhuw+XPauf3x5wG44/LXD+qxPEDArLn6TC4R8SNJr4uIn/T3QBGxj6SmYwPkeR7Z8QABs+aqpkP/GUnfA74EfD1djdgy1lczjtXOAwTMmquaoci/TTIy7F+AFyXdlK7/ZRnqqxnHalePAQJmVr1+k0tEfCsi3gO0k6xWfD7whKQnJV0h6eh6BzkcuBknW/PntHPDgjM4YmTyEm+f2MYNC85wM6NZg1Q9iTIitkTEP0TEGcBvkuwCeSOwWdJX6hXgcFGpucbNOAM3f047c6ZN5JwZk3j46gucWMwaaEAz9CPiMeBykiHKe4BLswxqOHIzjpkNJTUnF0mvk/S3JBMrlwGPAu/OOrDhxs04ZjaUVLv8SxtwMfAB4A3AT0n2VvlyRHjac0aynOdhZtZM/SYXSUuB9wJHACuAt0TEd+ocl5mZtbBqai7nANcCX42IrXWOx8zMhoB+k0tEzC4tk3Qs0BURB+sSlZmZtbSqO/QljZb0aUk7gE6SpfeR9ClJV9YpPjMza0G1jBb7G+CdwH8D9haVPw78YYYxmZlZi6tlm+P3AR+IiO9KKm4O+xFwcrZhmZlZK6ul5jIV2FSmfBS1JSkzMxviakku64A3lim/GHgim3DMzGwoqKXG8TFgmaTjgZHAeyTNItmF8h31CM7MzFpTLQtXfpOklvIW4CBJB/9JwDsj4v6sApJ0pKRbJG2StENSh6S3FR2/UNJ6SbslPZhuszyseG94M8u7mvpKImIlsLJOsRSMIlm37HzgeeDtwJ2SzgB2AsuBDwLfJNkC4A7gN+ocU254b3gzawUDWhVZ0hhJRxXfsgooInZFxOKI+GlEHIyIe4GNwFnAAmBdRNyV7oi5GJidNs8NC95UzMxaQS2TKE+Q9A1JvwR2ATtKbnWRrgZwMsmAgtOA1YVjEbELeDYtHxa8qZiZtYJamsWWAWOADwP/BURdIioiaTTwNeC2iFgvaRzJlsvFtgPjy/zsZST7zTBt2rR6h9ow3hvezFpBLcllDvDrEfF0vYIpJmkE8FVgH/ChtHgnMKHk1AmUqTlFxFJgKcDcuXPrnggbZdG8mb36XMCbiplZ/tTS57IamFKvQIpJEnALcCywMCL2p4fWAbOLzhsLnJiWDwveVMzMWkEtNZfLgM9K+izJki/7iw9GxPMZxvUF4BTgoogobgO6B1giaSFwH3AdsCYi1mf43LnnTcXMLO9qSS4jgFeTfMAXNzMpvT+y3A/VKp23cjnJ4pg/TyoxAFweEV9LE8tNJH1AjwGXZPG8ZmaWnVqSy20knenvpI4d+hGxiSRhVTp+PzBshh4PN1t27OWFrd3MuPo+pk5sY9G8mW7yM2tBtSSXWcCZEfFMvYKx4W1FRycbX9rFwfRriyeIlreio5MlKzeweVu3E7DlVi3J5XFgBuDkYlUr/SAcM3oEk8cdWfbcJSs3HEosBYUJov7wTHiFBmsVtYwW+wLwvyV9UNI5kn6t+FavAK11FT4IO7d1EyQfhM927eKJTVvLrofmCaL98woN1ipqqbncnv67tMyxzDr0rXWV1lJ27ztw2AchwIGDUfbbtieI9s8J2FpFLTWXGX3cXpt9aNZKytVStu7eX/H8ct+2F82byYiSoRyeINpbpUTrBGx5U8uS+5v6utUzSMu/cs01/Sn9tj1/TjszXjX20FBBTxA93KJ5M2kb3buRwAnY8qjPZjFJb4iI/6zmgdJ1v2ZExNpMIrN+bdmxl3NvfCAXo4YG0ixT7tv25PFH8oudezn1uAmeIFpG4e/70bvXsK/nIO0eLWY51V/N5RZJ35H0Pkmla3oBIOlXJX0a+AlFS7NYfW3ZsZeNL+3q1Qx1zfK1Tds4rFKzzMS20YwsM2tp9Aj52/YAzZ/TzpxpEzlnxiQevvoCJxbLpf6Sy2kkm3NdB7yc7gD5oKT/I+lRSVtJZsm3AxdExLI6x2upF7Z2Vxy22wyVmmsW/85pTC9q6jqk4jRZMxsK+kwuEXEgIj4XEaeQ7Pb4ReCHwCbgfpIdIdsj4tKIeKrewdor9vUcLFverFFDfS2o+cLW7sOWc9jfEx4+azaEVT0UOSJWAavqGIvVYNQIcaC06kL1o4bqMcu70oKaeUuEVl9eQcCgtnkulhMrOjrLJpbRI6vrx2j0LO8jRo4om2A8fHbo8QoCVlDLPBfLiUrNSWOPGFXVG7jRs7yPP6bN81eGCa8gYAVOLi2oUnPS9u7Kkxar+fl6NVNNHn9kr/krR4wc4fkrQ5RXELACN4u1oMEuk9KMZVYK81d27z3AnGkTnVhqUK4PI6+8hI8VuObSgga7TMqbZ005bCSwm6nyqdyyOtcsX8uWHXubHVpZXkHACvqtuVS74nFEPDn4cKwa8+e080/f+THPbdlFUFsz04qOTr7+ROdhW4kuPKvdtYlBqNcIqUp9GC9s7Wby+PJbFzSTVxCwgmqaxVaRrHrc17Q3r4rcYIVmJoBTj5tQ9Zu33IdVAA+u78o6xGGjniOkKvVVVBrenQeVhqTb8FJNcplR9yisYYZCh2ve5lH0NUJqsHFV6sMoTFa1xsrbay/P+k0uXvF4aGn1Dtdmz6Mo9+FSz4S9aN7MXr8vJH0YU48eM+jHttrU47U3lJNVNX0upwM3AJdGxC9Ljh0NLAM+GhFP1ydEy1KlD6tW6XCtZy2hLys6Oln87+vYVjTcu/DhMvGo0WX3rpk6sW3QHx6V+jAKzU6F2IbqB1SeZPHaK/5bHd02ml37DrC/J+kBHWoTTqupW38EWFOaWAAiYjvQASzKOjCrj9I1wFptzkkzmvUK31i3lZlH1L2/hwjKjpB686wpZUd61bpydV+rIFcaTdas1bGHssG+9kr/Vtu69x9KLAVDacJpNcnlXODrfRy/Bzgvm3CsEQofVuPHjGq5OSfN2Imxv43QtnfvL7to531rXqz7bHXPiG+cwb72qt1Qr5X6P/tSTXI5Hnipj+MvA6/JJpzqSJok6R5JuyRtkvT+Rj5/3hQ2DZtx9X2ce+MDQ/Zb64qOTnbtPXBYeb2b9fp7s0+d2HZY7QKouM1zlh8eQ2GARqsY7Byeav8mrdL/2R9FHL4AYq8TpBdJ+lseqHD8IuCrEXFcHeKrFNPtJInxj4EzgfuA34yIdeXOnzt3bqxaVfuCzmd/8n5+kZPJaqNGiEvOPp57V79YtnlmoEYKjhw1gt37k6GtR40ewf6eg+wf5EjXc0+cxLrNOzKN1cwG5pijRvM37zyt5lYKSU9ExNyBPGc1NZfvAlf1cfwq4HsDefKBkDQWWAhcGxE7022Y/x34vSyf569XrM1NYgE4cDBY9ujzmX9Y9wSHEgsk/x9sYgF4+NmXnVjMcmLr7v0sunt1Q1s1qpnnciPwqKR70v+vT8tPAa4GLgIaOVPqZKAnIp4pKlsNnJ/lk9z+2AsAHLdzC1d13JnlQw9rN5/xLgAuX/uNJkdiNjw8d3Q7N//quw5t0NeoPtZq5rn8UNK7gX8Bvl9y+CXg4ojoqEdwFYwDtpeUbQfGFxdIugy4DGDatGk1P0lPP82FZmatppF9cVWtihwR90o6AXgr8DqSpWCeAb4dEbvrGF85O4EJJWUTgB3FBRGxFFgKSZ9LrU8yUqInghfHTeavzrtyoLFaBb6mZo3XyMECtWxz3E0y7LjZngFGSTopIn6cls0GynbmD9T7zjmeZY8+3/+JZmYtoNqdarPSb4e+pO9Lmlh0/wZJk4ruT5bUsE/hiNgFLAeulzRW0rnAu4CvZvk8n5h/Bq/O2aqzI5Xcih01egRHjR74OlOlj1cvtT5No+IyGw6OOWo0S949u6Fz2qqpufwGcETR/T8FvkQyvwWS1ZAbPQvvSpI+oF+Q9PtcUWkY8mDMmDyWGZPHNn1l1/fe/AhPvZgskHDqcRMGHc97b34EgPedPY2P3r2Gnj5W2BWw8cZ3VP3Y5974QMW1yx6++oJDz93sazoQlX639oltvOaYpLnhfWdPO2yZmGJto0dWXBFhRUdnv0vVF5YP6dzWjYD+2ntr/fvVarB/z+Kfb+XXRjMVPh+y+GzI0kB2omz6d8qIeBmY3+w4WtmWHXu5Zvnafpdur7WNdihP6qu0LtubZ03hzh/8jH09B/nZ1m4W/85pAIeSQKH/rq+9TQpLgxT+HpXWmZo/55V9d4oTTSVDZUKeVbZlx1527jnAYxtf5twbH8jN2nLe5niYemFrd7+JZSAz31t91eW+FN6wxYtEvnnWFL7+ROdhSeGGBWccmqlfjYEsilhINCs6Oll012r2H+xdj2l0G7s13oqOTja+tOtQDTZPi19W01gfHF779jjdFtdXYhGvrI9V6wt0sFsw5938Oe08fPUFbLzxHTx89QU8uL4rk7W9BlPjmz+nnSXvmc3EttGHyprRxm6Nt2TlBkq+U+Rmbblqai4ClkkqTFcfA3xJUmEIcr56va0qR4wcUTbBjJT4+4sH/qFU2IK5UDNqtVWXa5VVM+Bga3zFzWU2fOS5Gbqa5HJbyf1lZc75SgaxWAMdf0wbm7fvOexbd0/EoKvVk8cf2Wt/96H8oZdVM2Cr77NjzZHnZuhqZuj/USMCscaaPP5IPnzhSXzkztWHrUbQiM23hoqskkK5/py8dMxafi2aN5O/uPOHvZrG8vKlxB36w9j8Oe38+R0/LHtsoNXqFR2ddDy/7VCT2PHHNP8bVD1lmRTctGW1Km6G3t9zMFdfSpxchrksq9Wlw2n39Rxk40u7WNHRmYsXe704KVgzFZqh8zTHBaobLWZD2GA3QCpWbjjtwSAXI1csfwq13ML8jC052uLCBs81l2Euy2adPI9csXwpN2m0dAi7tTYnF8usWSfPI1cse8X9a7XODK9Uy31hq7+IDBVuFrPMlGtiGyFyMXLFslVpuZpqdzqsVJvtb9UIax1OLpaZ+XPauWHBGbQX1VQKfS6N3F7V6q+v5WqqUak2e8RIfyQNFf5LDjOlnahZf+jPn9N+WA2m1m+1ln+D7V+rVMsd6kPXhxMnl2FksE0Z1Rrst1rLv0o1j1qWqynUcgtr2c141dheKztYa3NyGUYa9aHvUWNDXxZD2EsXAXViGVqcXIaRRn3oD/ZbreVfuZrHUF6g1GrnocjDSKOGCve13tbtjzdsR2yrM69MYH1xzWUYyXI2fl/8rdbMXHMZRhq58q6/1ZoNb04uw4w/9M2sEdwsZmZNV+/5V9Z4rrnkXPH6TQKvHGtDTqX5VzC0dzEd6nJTc5F0pKRbJG2StENSh6S3lZxzoaT1knZLelDSCc2KtxFK33QBh/ZHMRsqPOl2aMpNciGpRb0AnA8cDVwL3ClpOoCkycDytHwSsAq4oymRNoj3R7HhwJNuh6bcJJeI2BURiyPipxFxMCLuBTYCZ6WnLADWRcRdEbEHWAzMljSrSSHXnd90Nhx40u3QlJvkUkrSscDJwLq06DRgdeF4ROwCnk3LhyS/6Ww4aNT8K2usXCYXSaOBrwG3RcT6tHgcsL3k1O3A+AqPcZmkVZJWdXV11S/YOvL+KDYceNLt0NSw0WKSHiLpTynn4Yh4Q3reCOCrwD7gQ0Xn7AQmlPzcBGBHuQeMiKXAUoC5c+fGgANvouJJj53buhEw41Vj/aazIcfzr4aehtVcIuJNEaEKt0JiEXALcCywMCL2Fz3EOmB24Y6kscCJvNJsNiQVVo49Z8Ykxo0Z5ZVjzawl5K1Z7AvAKcA7I6K01/oe4HRJCyWNAa4D1hQ1m5mZWU7kJrmkc1YuB84Efi5pZ3q7FCAiuoCFwCeBrcA5wCVNCtfMzPqQmxn6EbEJUD/n3A8M2aHHZmZDRW5qLmZmVps8r8nm5GJm1oIqrcmWlwTj5GJm1oLyviabk4uZWQvK+/JQTi5mZi0o78tDObmYmbWgvK/JlpuhyGZmVr3i5aE2b+tm6sQ2Fs2bmZtldJxczMxaVJ7XZHOzmJmZZc7JxczMMufkYmZmmXNyMTOzzDm5mJlZ5pxczMwsc04uZmaWOScXMzPLnJOLmZllzsnFzMwy5+RiZmaZc3IxM7PMObmYmVnmnFzMzCxzuUwukk6StEfSspLyCyWtl7Rb0oOSTmhWjGZmVlkukwvwOeAHxQWSJgPLgWuBScAq4I7Gh2ZmZv3JXXKRdAmwDfhOyaEFwLqIuCsi9gCLgdmSZjU2wsZb0dFJx/Pb2LHnAB3Pb2NFR2ezQzIz61OukoukCcD1wEfKHD4NWF24ExG7gGfT8iFrRUcn1yxfy76egwDs6znINcvXOsGYWa7lKrkAHwduiYgXyhwbB2wvKdsOjC/3QJIuk7RK0qqurq6Mw2ycJSs30L2/p1dZ9/4elqzc0KSIzMz617DkIukhSVHh9p+SzgQuAj5T4SF2AhNKyiYAO8qdHBFLI2JuRMydMmVKZr9Ho23e1l1TuZlZHoxq1BNFxJv6Oi7pKmA68LwkSGoqIyWdGhG/BqwD/qDo/LHAiWn5kDV1YhudZRLJ1IltTYjGzKw6eWoWW0qSLM5Mb18E7gPmpcfvAU6XtFDSGOA6YE1ErG98qI2zaN5M2kaP7FXWNnoki+bNbFJEZmb9a1jNpT8RsRvYXbgvaSewJyK60uNdkhYCNwHLgMeAS5oRayPNn9MOJH0vndu6OWLkCG5YcMahcjOzPMpNcikVEYvLlN0PDPmhx6Xmz2ln/px23nvzI4fum5nlWZ6axczMbIhwcmkRhYmUj218mXNvfMDzXMws15xcWkDpRMrObd2eSGlmuebk0gI8kdLMWo2TSwvwREozazVOLi2g0oRJT6Q0s7xycmkBnkhpZq0mt/Nc7BXFEyk3b+tm6sQ2Fs2b6fkuZpZbTi4tojCR0sysFbhZzMzMMufkYmZmmXNyMTOzzDm5mJlZ5pxczMwsc4qIZsdQd5K6gE1VnDoZ2FLncAYj7/FB/mN0fIOT9/gg/zG2UnwnRMSA9okfFsmlWpJWRcTcZsdRSd7jg/zH6PgGJ+/xQf5jHC7xuVnMzMwy5+RiZmaZc3LpbWmzA+hH3uOD/Mfo+AYn7/FB/mMcFvG5z8XMzDLnmouZmWXOycXMzDLn5AJImiTpHkm7JG2S9P4cxPSQpD2Sdqa3DUXHLpS0XtJuSQ9KOqHOsXxI0ipJeyXdWnKsYixKfErSS+nt05LUyBglTZcURddxp6RrGx2jpCMl3ZK+vnZI6pD0tqLjTb2OfcWXo2u4TNKLkn4p6RlJHyw61vTXYaX48nL9ip7vJCWfLcuKyrK/fhEx7G/A7cAdwDjgDcB24LQmx/QQ8MEy5ZPT+N4DjAGWAI/WOZYFwHzgC8Ct1cYCXA5sAF4DtANPAX/S4BinAwGMqvBzDYkRGAssTuMZAfw2sCO93/Tr2E98ebmGpwFHpv+fBfwcOCsP16+f+HJx/Yqe79vA/wOWpffrcv3qEnwr3dI31T7g5KKyrwI3NjmuhyifXC4Dvl8SfzcwqwExfYLeH9x9xgJ8H7is6PgfU/9EWBpjf2/shsdY9FxrgIV5vI4l8eXuGgIzgReBi/N4/Uriy831Ay4B7iT5IlFILnW5fm4Wg5OBnoh4pqhsNcm3kGa7QdIWSQ9LelNadhpJfABExC7gWZoTb3+x9DpOc6/rJkk/k/RlSZOLypsSo6RjSV5760pjyMN1LImvoOnXUNLnJe0G1pN8eH+r9Pmbef0qxFfQ1OsnaQJwPfCRkkN1uX5OLklT2PaSsu3A+CbEUuyvgNeSVEOXAt+UdCL5ire/WEqPbwfG1bM9uYwtwK8DJ5A0UYwHvlZ0vOExShqdxnBbRKwvE0MhjqZcxzLx5eYaRsSV6fOfBywH9pZ5/kIMDb9+FeLLy/X7OHBLRLxQUl6X6+fkAjuBCSVlE0jam5smIh6LiB0RsTcibgMeBt5OvuLtL5bS4xOAnZHWrRshInZGxKqIOBAR/wV8CHhL+i2u4TFKGkHS7LovjaVcDIU4Gn4dy8WXt2sYET0R8Z8kfQBXlHn+QgxNeR2WxpeH6yfpTOAi4DNlDtfl+jm5wDPAKEknFZXNpndzQB4EIJK4ZhcKJY0FTqQ58fYXS6/j5OO6Ft4QhW9dDYsx/aZ3C3AssDAi9peLoVnXsY/4SjXtGpYYxSvXqenXr4/4SjXj+r2JpO/neUk/B/4SWCjpydLnz+z61bNTq1VuwL+RjBgbC5xLk0eLAROBeSQjN0YBlwK7SDoJp6TxLUyPf4r6d06OSp/rBpJvtYW4+owF+BPgaZKmvanpC7Jeo8UqxXhOet1GAK8iGRX4YJNi/CLwKDCupDwX17GP+Jp+DYFXk3RGjwNGpu+PXcC78nD9+okvD9fvKOBXim5/B9ydXru6XL/M30CteAMmASvSF8PzwPubHM8U4Ack1dJt6Rv+t4qOX0TSYdhNMqpsep3jWUzybav4tri/WEi+mX0aeDm9fZp0yaFGxQi8D9iY/m1fBL4C/EqjYyRpbw9gD0kzQ+F2aR6uY1/x5eEapu+J76bvh18Ca4H/Xs17otnx5eH6VXi/LKvn9fPaYmZmljn3uZiZWeacXMzMLHNOLmZmljknFzMzy5yTi5mZZc7JxczMMufkYgZIOkrS3ZK2p3tvTK9Q9pCkm6p8zMI+HnPrHX+F579V0r0ZPM6PJC3OICQbRkY1OwCzvqSr8/5Pkv1FXkOyCOAa4J8i4lt9/WyNPgC8kWQ/n670dkWZsgVApWVRSr0AHJfGnBlJDwE/iogP9XPqn/HKEiNmDeXkYrklaTrJgp07gGtIlvoeAVxIslTJtAyf7nXA0xGxtuj5DysjmaFclYjoIdkwqikionSlW7OGcbOY5dnnSb55z42IOyNiQ0Q8HRE30XuhvWlKtqnekd6WS3pN8QNJeqekJ9LtXTdK+qSkI9JjD5F8y39j2oz1ULmywrnFzWKSjpD0t0q2B94r6TlJ/yM9dlizmKRTJd2XxvkLSbdL+pWi47dKulfSn0nqlLQ13f/jqMJx4HzgT9PHjjQJH6a0WSyN/fNpvFvS5/+7dCXkwjmvlvQNSd3p7/SBMo97tKSl6c/vkPTdwu8oaUzajPYvRedPTZ/vL8v/mW0ocnKxXJI0CXgrcFNE7Cw9HhFb0/NEsi7cscAFwJtJFtdbUdhvQtI8kv0zbiLZ5OgDwLuBv00fbgHwZeARkmasBRXKyrkN+H3gL4BTSHbp21bhdzoO+B7wI+BskvWcxgH/XvwBT7IXyOnp8fcCv0uS6Ej/fSSN7bj0Vro/R18uBQ4Av0my9PtV6XMU3EpSi7uIZNvo3ydZTbfwOwi4j2QRw98G5qS/0wOSjouIPcD7gfdLek96/ldIap1/X0Oc1urquTiab74N9Eby4RvA7/Zz3m8BPfReaO+1wEHgovT+94BrS35uPsnCjIX19W4CHio5p1zZQyQJD+CkNMa3Vohtenp8bnr/euA7Jecck55zdnr/VpJkMaronC8B95eLoZ9rcytwb8nPPVJyzv8F/jn9/8lpLOcWHT8hvb6L0/sXpNetreRxfgh8tOj+VcBW4B+Al4D2Zr+mfGvszX0ullfVdkSfAmyOiJ8WCiLiOUmbgVOB+0l2/ztb0l8V/dwIoI1k+fEXBxjjHJIk9mCV559F0sx2WE2MZP+Mx9P/PxURB4qObSZZtj0La0rubyZZLh6Sa3mwKA4iYlN6LQvOIlm+vUu9NyIcQ++9S/4R+B3gz4GLI6Izk+itZTi5WF79mORb9CnAPX2cJ17ZfKlUoXwE8DHgrjLndA00QGofiTWCpEmpXN/DfxX9v3Q0WpBdE3Zfj13N7zOCJNbzyhz7ZdH/J5P87XpImtlsmHFysVyKiJclrQQ+JOmzUdLvImliRGwDngLaJU0v1F4kvZak3+Wp9PQngVkR8ZOMw3yS5MP2zcB/VHn+xcCmqLzLYzX2kWxIlbWnSX6fXwe+D8lgCZJrWfAkSf/WwYh4ro/H+mfgWZJ+ndslfTsinqhDzJZT7tC3PLuS5Nv0qrRzeKakWZKu4JXmnftJOou/JumsdNTS10g+BB9Iz7mepIP5ekmnp4/xbkmfHkxwEfFj4E7gnyUtlDRD0nmSfq/Cj3wOOBq4Q9I5kl4r6aJ05NX4Gp76pyTNfNMlTS4ZDDBgEbGBJEneLOn1SvZdv5VkA6mC+0mGh39D0tvS3/n1kj4m6TwASX9Csq3u70XE19PH+NfCiDcbHpxcLLciYiPwaySdzp8iSSgPkLTlX56eEySd810kHdYPkswtmZ8eIyJWAu8gqWE8nt6uJtl1dLB+H/hX4LMkO/ndSpJAyv0+m0m20T5I8iG+jiTh7E1v1fo7ktrLUyS/d5bzff6QZNfEB4BvkvxuPy0cTK/p29PjXwI2kCTYmcBmSTNJRoV9OP37QdK5H8BnMozTcs47UZqZWeZcczEzs8w5uZiZWeacXMzMLHNOLmZmljknFzMzy5yTi5mZZc7JxczMMufkYmZmmXNyMTOzzP1/7zLrexRJnF8AAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.stem(np.arange(7, len(expansion.eci)), 1000 * expansion.eci[7:]) # Plot ECI of pairs and triplets\n", + "for t in first_inds[1:]: # vertical lines denotes where points, pairs, and triplets cut off\n", + " plt.axvline(t[1]-0.5)\n", + "plt.xlabel('Coefficient index', fontsize=14)\n", + "plt.xticks(fontsize=12)\n", + "plt.ylabel('ECI (meV)', fontsize=14)\n", + "plt.yticks(fontsize=12)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "282ba835-e6aa-45c1-b55c-b92b71e46457", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}