Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save fumoboy007/14e5b8e7dc7f6168213f470797d185dd to your computer and use it in GitHub Desktop.
Save fumoboy007/14e5b8e7dc7f6168213f470797d185dd to your computer and use it in GitHub Desktop.
Does Factor Analysis resolve the singular covariance matrix problem?
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"id": "51799ab5-1d74-4168-9a05-da3ecc8471be",
"metadata": {},
"source": [
"# Does Factor Analysis resolve the singular covariance matrix problem?"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "30499e15-a51f-4d9b-95d8-94a1ab18a522",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": ""
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Requirement already satisfied: numpy~=1.26 in /Users/darrenmo/Library/jupyterlab-desktop/jlab_server/lib/python3.12/site-packages (1.26.4)\n",
"Requirement already satisfied: scikit-learn~=1.4 in /Users/darrenmo/Library/jupyterlab-desktop/jlab_server/lib/python3.12/site-packages (1.4.2)\n",
"Requirement already satisfied: scipy>=1.6.0 in /Users/darrenmo/Library/jupyterlab-desktop/jlab_server/lib/python3.12/site-packages (from scikit-learn~=1.4) (1.12.0)\n",
"Requirement already satisfied: joblib>=1.2.0 in /Users/darrenmo/Library/jupyterlab-desktop/jlab_server/lib/python3.12/site-packages (from scikit-learn~=1.4) (1.4.0)\n",
"Requirement already satisfied: threadpoolctl>=2.0.0 in /Users/darrenmo/Library/jupyterlab-desktop/jlab_server/lib/python3.12/site-packages (from scikit-learn~=1.4) (3.4.0)\n",
"Note: you may need to restart the kernel to use updated packages.\n"
]
}
],
"source": [
"%pip install -U \\\n",
" numpy~=1.26 \\\n",
" scikit-learn~=1.4"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "72c91fc8-0d4f-48eb-8acc-68d13f59b958",
"metadata": {},
"outputs": [],
"source": [
"import itertools\n",
"import numpy as np\n",
"from sklearn.decomposition import FactorAnalysis\n",
"\n",
"def covariance_of_factorized_model(observed_dimension_count, factor_count, training_set_size):\n",
" training_set = np.random.rand(training_set_size, observed_dimension_count)\n",
"\n",
" model = FactorAnalysis(n_components=factor_count,\n",
" svd_method='lapack')\n",
" model.fit(training_set)\n",
" \n",
" return model.get_covariance()\n",
"\n",
"def is_singular(matrix):\n",
" return np.any(np.isclose(np.linalg.eigvals(matrix), 0))\n",
"\n",
"def min_training_set_size_to_avoid_singularity(observed_dimension_count, factor_count):\n",
" for training_set_size in itertools.count(start=2):\n",
" covariance = covariance_of_factorized_model(observed_dimension_count=observed_dimension_count,\n",
" factor_count=factor_count,\n",
" training_set_size=training_set_size)\n",
" if not is_singular(covariance):\n",
" return training_set_size"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "607d0999-ea2f-43a1-a731-3f41e1a8d3eb",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"from IPython.display import clear_output, display\n",
"\n",
"observed_dimension_count = 41\n",
"\n",
"figure, axes = plt.subplots()\n",
"\n",
"axes.set_title(\"Relationship Between Factor Count and Minimum Training Set Size\")\n",
"\n",
"axes.set_xlabel(\"Number of Factors\")\n",
"axes.set_xlim(left=0, right=observed_dimension_count)\n",
"\n",
"axes.set_ylabel(\"Minimum Training Set Size to Avoid Singularity\")\n",
"axes.set_ylim(bottom=0, top=observed_dimension_count)\n",
"\n",
"line, = axes.plot([], [])\n",
"\n",
"display(figure)\n",
"clear_output(wait=True)\n",
"\n",
"factor_counts = []\n",
"min_training_set_sizes = []\n",
"\n",
"for factor_count in range(1, observed_dimension_count):\n",
" min_training_set_size = min_training_set_size_to_avoid_singularity(observed_dimension_count=observed_dimension_count,\n",
" factor_count=factor_count)\n",
"\n",
" factor_counts.append(factor_count)\n",
" min_training_set_sizes.append(min_training_set_size)\n",
"\n",
" line.set_data(factor_counts, min_training_set_sizes)\n",
"\n",
" display(figure)\n",
" clear_output(wait=True)"
]
},
{
"cell_type": "markdown",
"id": "66e82fa4-fa42-425d-8de4-2a25d5f146ba",
"metadata": {},
"source": [
"## Answer\n",
"\n",
"Not entirely! The training set size still needs to be greater than the number of factors to avoid the singular covariance matrix problem."
]
}
],
"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.12.2"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment