Initial Commit
This commit is contained in:
175
1-coordinate-descent.ipynb
Normal file
175
1-coordinate-descent.ipynb
Normal file
@@ -0,0 +1,175 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"id": "075806aa",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import numpy as np"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"id": "c9235b01",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"A l'itété 0, on trouve x=[-0.2 -0.42]\n",
|
||||
"A l'itété 1, on trouve x=[ 0.148 -0.2112]\n",
|
||||
"A l'itété 2, on trouve x=[ 0.27328 -0.136032]\n",
|
||||
"A l'itété 3, on trouve x=[ 0.3183808 -0.10897152]\n",
|
||||
"A l'itété 4, on trouve x=[ 0.33461709 -0.09922975]\n",
|
||||
"A l'itété 5, on trouve x=[ 0.34046215 -0.09572271]\n",
|
||||
"A l'itété 6, on trouve x=[ 0.34256637 -0.09446018]\n",
|
||||
"A l'itété 7, on trouve x=[ 0.34332389 -0.09400566]\n",
|
||||
"A l'itété 8, on trouve x=[ 0.3435966 -0.09384204]\n",
|
||||
"A l'itété 9, on trouve x=[ 0.34369478 -0.09378313]\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# Un premier exemple de descente par coordonnées\n",
|
||||
"\n",
|
||||
"# Itéré intial\n",
|
||||
"x = np.array([-1/2, -1])\n",
|
||||
"\n",
|
||||
"maxiter = 10\n",
|
||||
"for k in range(maxiter):\n",
|
||||
" #On mets (de façon optimale) x1\n",
|
||||
" x[0] = (6*x[1]+4)/10\n",
|
||||
" #On mets (de façon optimale) x2\n",
|
||||
" x[1] = (6*x[0]-3)/10\n",
|
||||
" print(f\"A l'itété {k}, on trouve x={x}\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"id": "999a5a80",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def CDquadratic(Q,c,p,x,maxiter=10**2):\n",
|
||||
" # Ce code applique la méthode de descente par coordonnées\n",
|
||||
" # au problème min_x 0.5 x'*Q*x-c'*x+p\n",
|
||||
" # Le x fournit en paramètre est l'itéré initial\n",
|
||||
" # Q nous est donnée sous forme symétrique\n",
|
||||
" n = len(x)\n",
|
||||
" # Une itération coûte O(n^2)\n",
|
||||
" for k in range(maxiter):\n",
|
||||
" # Dans cette boucle, on mets les variables à jour\n",
|
||||
" for i in range(n):\n",
|
||||
" somme = 0\n",
|
||||
" for j in range(n):\n",
|
||||
" if not j==i:\n",
|
||||
" somme += Q[i,j]*x[j]\n",
|
||||
" x[i] = (c[i]-somme)/Q[i,i]\n",
|
||||
" print(f\"A l'itété {k}, on trouve x={x}\")\n",
|
||||
" return x"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"id": "d7a850ff",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"A l'itété 0, on trouve x=[-0.2 -0.42]\n",
|
||||
"A l'itété 1, on trouve x=[ 0.148 -0.2112]\n",
|
||||
"A l'itété 2, on trouve x=[ 0.27328 -0.136032]\n",
|
||||
"A l'itété 3, on trouve x=[ 0.3183808 -0.10897152]\n",
|
||||
"A l'itété 4, on trouve x=[ 0.33461709 -0.09922975]\n",
|
||||
"A l'itété 5, on trouve x=[ 0.34046215 -0.09572271]\n",
|
||||
"A l'itété 6, on trouve x=[ 0.34256637 -0.09446018]\n",
|
||||
"A l'itété 7, on trouve x=[ 0.34332389 -0.09400566]\n",
|
||||
"A l'itété 8, on trouve x=[ 0.3435966 -0.09384204]\n",
|
||||
"A l'itété 9, on trouve x=[ 0.34369478 -0.09378313]\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"Q = np.array([[10, -6],[-6, 10]])\n",
|
||||
"c = np.array([4, -3])\n",
|
||||
"p = 0\n",
|
||||
"x = np.array([-1/2, -1])\n",
|
||||
"xopt = CDquadratic(Q,c,p,x,10)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"id": "960500d8",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def leastsquares(A,b,x,maxiter=10**2):\n",
|
||||
" Q = 2*A.T@A\n",
|
||||
" c = 2*A.T@b\n",
|
||||
" p = b.T@b\n",
|
||||
" x = CDquadratic(Q,c,p,x,maxiter)\n",
|
||||
" return x"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"id": "560043ef",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"A l'itété 0, on trouve x=[ 0. -0.5]\n",
|
||||
"A l'itété 1, on trouve x=[ 0.25 -0.625]\n",
|
||||
"A l'itété 2, on trouve x=[ 0.3125 -0.65625]\n",
|
||||
"A l'itété 3, on trouve x=[ 0.328125 -0.6640625]\n",
|
||||
"A l'itété 4, on trouve x=[ 0.33203125 -0.66601562]\n",
|
||||
"A l'itété 5, on trouve x=[ 0.33300781 -0.66650391]\n",
|
||||
"A l'itété 6, on trouve x=[ 0.33325195 -0.66662598]\n",
|
||||
"A l'itété 7, on trouve x=[ 0.33331299 -0.66665649]\n",
|
||||
"A l'itété 8, on trouve x=[ 0.33332825 -0.66666412]\n",
|
||||
"A l'itété 9, on trouve x=[ 0.33333206 -0.66666603]\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"A = np.array([[1,0], [0,1], [1,1]])\n",
|
||||
"b = np.array([3,2,-3])\n",
|
||||
"x = np.array([1.0, 0.0]) # Attention au entiers\n",
|
||||
"xopt = leastsquares(A,b,x,10)"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "optinonlin",
|
||||
"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.13.2"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
}
|
||||
Reference in New Issue
Block a user