Skip to content

Commit

Permalink
algunos ejercicios de Markov
Browse files Browse the repository at this point in the history
  • Loading branch information
JoaquinPolonuer committed Sep 28, 2022
1 parent 9961054 commit 47c2807
Show file tree
Hide file tree
Showing 3 changed files with 574 additions and 10 deletions.
341 changes: 341 additions & 0 deletions Practica 3/Clase 10 - Markov.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,341 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"\n",
"# Acá les dejo un regalito. \n",
"# Para que todo lo que printeamos tenga 3 decimales y sin notación científica\n",
"np.set_printoptions(precision=3)\n",
"np.set_printoptions(suppress=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Defino algunas funciones que nos van a servir"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"def matriz_ruina_apostador(n,p):\n",
" \"\"\"Devuelve la matriz de transición de la ruina del apostador \n",
" de tamaño nxn, cuando se gana con probabilidad p\"\"\"\n",
" \n",
" A = np.zeros((n,n))\n",
" A[0,0] = 1\n",
" A[-1,-1] = 1\n",
" for j in range(1,n-1):\n",
" A[j-1,j] = 1-p\n",
" A[j+1,j] = p\n",
" return(A)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"def p_inf_v(P, v ,k , tol = 10**-6):\n",
" \"\"\"Itera v = P@v hasta que converja o se llegue a k iteraciones.\n",
" tol es como el espilón del límite, si la distancia entre dos iteraciones\n",
" consecutivas es menor a tol consideramos que llegamos al límite\"\"\"\n",
" \n",
" for i in range(k):\n",
" if np.linalg.norm(P @ v - v) < tol:\n",
" break\n",
" else:\n",
" v = P @ v\n",
" return(v)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"def canonico(n,j):\n",
" \"\"\"Devuelve el canoninco e_j de R^n\"\"\"\n",
"\n",
" v = np.zeros(n)\n",
" v[j] = 1\n",
" return(v)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Tenis"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[1. 0.333 0. 0. 0. ]\n",
" [0. 0. 0.333 0. 0. ]\n",
" [0. 0.667 0. 0.333 0. ]\n",
" [0. 0. 0.667 0. 0. ]\n",
" [0. 0. 0. 0.667 1. ]]\n"
]
}
],
"source": [
"#Armo la matriz de proceso\n",
"n=5\n",
"p=2/3\n",
"\n",
"P = matriz_ruina_apostador(n,p)\n",
"print(P)\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0. 0. 1. 0. 0.]\n"
]
}
],
"source": [
"# Estado inicial 40-40 (deuce), o sea el tercer canoninco\n",
"v = canonico(n,2) # Acuerdense que python cuenta desde 0\n",
"print(v)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0.2 0. 0. 0. 0.8]\n"
]
}
],
"source": [
"# Iteramos\n",
"v_inf = p_inf_v(P,v,1000)\n",
"print(v_inf)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0.2 , 0.8 , 1.275, 0.778, 0. ])"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Cómo se escribe v en base de autovectores?\n",
"\n",
"Cbe = np.linalg.eig(P)[1]\n",
"np.linalg.solve(Cbe,v)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[1. 0.467 0.2 0.067 0. ]\n",
" [0. 0. 0. 0. 0. ]\n",
" [0. 0. 0. 0. 0. ]\n",
" [0. 0. 0. 0. 0. ]\n",
" [0. 0.533 0.8 0.933 1. ]]\n"
]
}
],
"source": [
"# Cómo se ve P^inf\n",
"\n",
"P_inf = np.linalg.matrix_power(P,1000)\n",
"print(P_inf)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"¿Qué nos dicen las columnas de $ P^\\infty $ ?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Figuritas"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [],
"source": [
"def matriz_figuritas(n):\n",
" \"\"\"Devuelve la matriz de transición para el problema de n figuritas\"\"\"\n",
" \n",
" diag = np.linspace(0,1,n+1) # esto me arma la suc k/n con k de 0 hasta n\n",
" \n",
" # Armo una matriz diagonal con diag en la diagonal\n",
" P = np.diag(diag)\n",
"\n",
" # abajo de la diagonal recorro la suc k/n al revés desde n hasta 1\n",
" for i in range(1,n+1):\n",
" P[i,i-1] = diag[-i] \n",
" return(P)"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"P = matriz_figuritas(638)\n",
"v = canonico(639,0)"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[0. , 0. , 0. , ..., 0. , 0. , 0. ],\n",
" [1. , 0.002, 0. , ..., 0. , 0. , 0. ],\n",
" [0. , 0.998, 0.003, ..., 0. , 0. , 0. ],\n",
" ...,\n",
" [0. , 0. , 0. , ..., 0.997, 0. , 0. ],\n",
" [0. , 0. , 0. , ..., 0.003, 0.998, 0. ],\n",
" [0. , 0. , 0. , ..., 0. , 0.002, 1. ]])"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"P"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"5553\n",
"[0. 0. 0.005 0.095 0.9 ]\n"
]
}
],
"source": [
"# Itero hasta que la última coordeanda de v sea mayor o igual a 0.9\n",
"# y cuento cuantas figuritas compre\n",
"figus = 0\n",
"while v[-1] < 0.9:\n",
" v = P @ v\n",
" figus += 1 # esto equivale a figus = figus + 1\n",
"print(figus)\n",
"print(v[-5:])"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Neccesito comprar 1111 paquetes para tener un 90% de probabilidades de llenar el álbum\n"
]
}
],
"source": [
"# Suponiendo 5 figuritas por paquete:\n",
"print('Neccesito comprar', round(figus/5), 'paquetes para tener un 90% de probabilidades de llenar el álbum')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### ¿Se les ocurren otros juegos o problemas que se puedan modelar con procesos de Markov?"
]
}
],
"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.8.10"
},
"vscode": {
"interpreter": {
"hash": "369f2c481f4da34e4445cda3fffd2e751bd1c4d706f27375911949ba6bb62e1c"
}
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Loading

0 comments on commit 47c2807

Please sign in to comment.