Created
January 17, 2020 03:51
-
-
Save harpiechoise/6fcd89349a777a8758dd76e004f67e7f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"nbformat": 4, | |
"nbformat_minor": 0, | |
"metadata": { | |
"colab": { | |
"name": "Copia de Te damos la bienvenida a Colaboratory", | |
"provenance": [], | |
"collapsed_sections": [], | |
"include_colab_link": true | |
}, | |
"kernelspec": { | |
"display_name": "Python 3", | |
"name": "python3" | |
} | |
}, | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "view-in-github", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"<a href=\"https://colab.research.google.com/gist/harpiechoise/980702e834bb03c6e2828a8841cf6d1b/copia-de-te-damos-la-bienvenida-a-colaboratory.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "QgUlBuTYINjY", | |
"colab_type": "code", | |
"outputId": "8170a1a5-0e19-4ff4-b8a2-601fe218dbef", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 283 | |
} | |
}, | |
"source": [ | |
"import matplotlib.pyplot as plt\n", | |
"import matplotlib.lines as mlines\n", | |
"import matplotlib.patches as patches\n", | |
"ax = plt.gca()\n", | |
"ax.scatter(x=[50, 50,100, 100], y=[0, 100, 0, 100], c='white', edgecolors='black',s=20)\n", | |
"ax.scatter(x=[50], y=[50], s=5000, facecolors='none', edgecolors='r')\n", | |
"ax.scatter(x=[50], y=[50], s=300, c='w', edgecolors='blue')\n", | |
"ax.scatter(x=[100], y=[50], s=300,facecolors='none', marker='s' ,edgecolors='blue')\n", | |
"ax.scatter(x=[100], y=[50], s=300*10,facecolors='none', marker='s' ,edgecolors='blue')\n", | |
"ax.scatter(x=[80], y=[57], s=300,facecolors='none', c='green')\n", | |
"ax.axvline(x=50)\n", | |
"ax.plot([100, 80], [50, 57])" | |
], | |
"execution_count": 0, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"[<matplotlib.lines.Line2D at 0x7f3598eaf438>]" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
}, | |
"execution_count": 70 | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 432x288 with 1 Axes>" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "z8p5aXSRIwOw", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"import math\n", | |
"A = (80, 57)\n", | |
"B = (100, 50)" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "susEgkR7NM3o", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"from abc import ABCMeta, abstractmethod\n", | |
"import numpy as np\n", | |
"from scipy.special import expit" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "T6ioqJceQAKn", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"# 91,4 Cm\n", | |
"YARDA = 0.9144\n", | |
"REG = 10e-7\n", | |
"\n", | |
"def log_reg_dot(beta_dict, parametros_de_tiro):\n", | |
" \"\"\"\n", | |
" :param beta_dict: diccionario con los coeficientes beta\n", | |
" :param parametros_de_tiro: diccionario con los puntos de dato\n", | |
" :return: sigmoide del producto beta * punto de datos\n", | |
" >>> log_reg_dot({'1': 1, 'a': -1, 'b': -0.5, 'c': 1000}, {'a': 0.5, 'b': 1, 'foo': 2000})\n", | |
" 0.5\n", | |
" \"\"\"\n", | |
" res = 0.\n", | |
"\n", | |
" for k in beta_dict.keys():\n", | |
" if k in parametros_de_tiro:\n", | |
" res += beta_dict[k] * parametros_de_tiro[k]\n", | |
" elif isinstance(k, tuple):\n", | |
" arguments = []\n", | |
" for key in k:\n", | |
" if key in parametros_de_tiro:\n", | |
" arg = parametros_de_tiro[key]\n", | |
" elif key.startswith('inverse_'):\n", | |
" k_inv = key.replace('inverse_', '')\n", | |
" if k_inv in parametros_de_tiro:\n", | |
" arg = 1.0 / (parametros_de_tiro[k_inv] + REG)\n", | |
" else:\n", | |
" arg = 0.\n", | |
" else:\n", | |
" arg = 0.\n", | |
" arguments.append(arg)\n", | |
" res += beta_dict[k] * np.prod(arguments)\n", | |
" elif k.startswith('inverse_'):\n", | |
" k_inv = k.replace('inverse_', '')\n", | |
" if k_inv in parametros_de_tiro:\n", | |
" res += beta_dict[k] / (parametros_de_tiro[k_inv] + REG)\n", | |
" res += beta_dict['1']\n", | |
" # Player adjustment for Caley's XG\n", | |
" player_adjustment = parametros_de_tiro.get('player_adjustment', 1.)\n", | |
" if res < 0:\n", | |
" player_adjustment = 1. / player_adjustment\n", | |
" return expit(res * player_adjustment)\n", | |
"\n", | |
"\n" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "Joe5o5SybxzT", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"class XGCalculator(object):\n", | |
" __metaclass__ = ABCMeta\n", | |
"\n", | |
" def __init__(self):\n", | |
" \"\"\"\n", | |
" Trabajamos con coordenadas para saber donde esta ubicado el arco \n", | |
" La frontera del arco está entre los puntos 0 < x < 68, 0 < y < 105, con la posicion de gol situada (100, 50) \n", | |
" \"\"\"\n", | |
" self.palo_izquierdo = np.array([100, 20], np.float64) # Chequar\n", | |
" self.palo_derecho = np.array([101, 80], np.float64) # Chequar\n", | |
" self.centro_del_arco = np.array([100, 50], np.float64) # El centro del arco\n", | |
" self.ancho_de_accion = self.palo_derecho[0] - self.palo_izquierdo[0]\n", | |
"\n", | |
" @abstractmethod\n", | |
" def _angulo_relativo(self, x, y):\n", | |
" \"\"\"\n", | |
" Angulo de (x, y) hasta el palo mas cercano pi / 2 as descrito por Caley\n", | |
" >>> xg = CaleyXGCalculator()\n", | |
" >>> xg._angulo_relativo(x=44.948, y=1.392857)\n", | |
" 0.12021884320255356\n", | |
" \"\"\"\n", | |
" if self.palo_izquierdo[0] <= x <= self.palo_derecho[0]:\n", | |
" return 1.\n", | |
" elif x < self.palo_izquierdo[0]:\n", | |
" x_a_palo = self.palo_izquierdo[0] - x\n", | |
" else:\n", | |
" x_a_palo = x - self.palo_derecho[0]\n", | |
"\n", | |
" return 2 * np.arctan(y / x_a_palo) / np.pi\n", | |
"\n", | |
" @staticmethod\n", | |
" def _distancia(x, y, punto, yardas=False):\n", | |
" \"\"\"\n", | |
" Retorna la distancia (x, y) hacia el punto\n", | |
" :param yardas: Si quieres que devuelva el resultado en yardas\n", | |
" \"\"\"\n", | |
" return np.linalg.norm(np.asarray([x, y]) - np.asarray(punto)) / (YARDA if yardas else 1)\n", | |
"\n", | |
" def _angulo_entre_los_palos(self, x, y):\n", | |
" \"\"\"\n", | |
" Retorna el angulo hecho por la posicion de tiro\n", | |
" \"\"\"\n", | |
" dist_left = self._distance(x, y, self.palo_izquierdo)\n", | |
" dist_right = self._distance(x, y, self.palo_derecho)\n", | |
"\n", | |
" cos_angle = (dist_left ** 2 + dist_right ** 2 - self.goal_width ** 2) / (2 * dist_left * dist_right)\n", | |
" return np.arccos(cos_angle)\n", | |
"\n", | |
" def _esta_entre_las_zonas_altas_de_valor(self, x, y):\n", | |
" # POR FAVOR CHEQUEA LAS MEDIDAS DEL AREA CHICA\n", | |
" # y < 5.5 and (self.palo_izquierdo.x < x < centro_arco or (self.palo_izquierdo.x - 5.5 < x < palo_derecho.x + 5.5 and self._relative_angle(x, y) > 0.75))\n", | |
" return y < 5.5 and (100 < x < 100 or (100 - 5.5 < x < 101 + 5.5 and self._angulo_relativo(x, y) > 0.75))\n", | |
"\n", | |
"def tiro_en_el_area(x, y):\n", | |
" # DAME LAS MEDIDAS DEL AREA GRANDE\n", | |
" if not (0 <= x <= 68 and 0 <= y <= 105):\n", | |
" raise ValueError('Tiro fuera del area'.format((x, y)))\n", | |
"\n", | |
"class CaleyXGCalculator(XGCalculator):\n", | |
" \"\"\"\n", | |
" XG model introduced by Caley in\n", | |
" http://cartilagefreecaptain.sbnation.com/2015/10/19/9295905/premier-league-projections-and-new-expected-goals\n", | |
" \"\"\"\n", | |
" def __init__(self):\n", | |
" super(CaleyXGCalculator, self).__init__()\n", | |
"\n", | |
" @staticmethod\n", | |
" def _beta(driveo, patada_directa, cruzado, cabeza):\n", | |
" if driveo:\n", | |
" return {'1': -0.61, 'distance': -0.09, 'inverse_distance': 7.4, 'angle': 1.04, 'big_chance': 1.1,\n", | |
" 'following_error': 0.67, ('inverse_distance', 'inverse_angle'): -3.2}\n", | |
" elif patada_directa:\n", | |
" return {'1': -3.84, 'distance': -0.1, 'inverse_distance': 98.7, 'inverse_angle': 3.54,\n", | |
" ('inverse_distance', 'inverse_angle'): -91.1}\n", | |
" elif cruzado:\n", | |
" if cabeza:\n", | |
" return {'1': -2.88, 'distance': -0.21, 'angle': 2.13, 'inverse_assist_distance': 4.31,\n", | |
" 'assist_angle': 0.46, 'fastbreak': 0.2, 'counterattack': 0.11, 'set_piece': 0.12,\n", | |
" 'corner': -0.24, 'otherbodypart': -0.18, 'big_chance': 1.2, 'following_error': 1.1,\n", | |
" 'EPL': 0.18, 'LaLiga': 0.15}\n", | |
" else:\n", | |
" return {'1': -2.8, 'distance': -0.11, 'inverse_distance': 3.52, 'angle': 1.14,\n", | |
" 'assist_across_face': 0.14, 'inverse_assist_distance': 6.94, 'assist_angle': 0.59,\n", | |
" 'corner': -0.12, 'fastbreak': 0.24, 'counterattack': 0.11, 'big_chance': 1.25,\n", | |
" 'following_error': 1.1, 'EPL': -0.2}\n", | |
" elif cabeza:\n", | |
" return {'1': -3.85, 'distance': -0.1, 'inverse_distance': 2.56, 'angle': 1.94,\n", | |
" 'throughball_assist': 0.51, 'fastbreak': 0.44, 'counterattack': 0.26, 'rebound': 0.7,\n", | |
" 'established_possession': 0.44, 'otherbodypart': 1.14, 'big_chance': 1.3, 'following_error': 1.1,\n", | |
" 'EPL': -0.29, 'LaLiga': -0.24, 'SerieA': -0.26}\n", | |
" else:\n", | |
" # Tiro Regular\n", | |
" return {'1': -3.19, 'distance': -0.095, 'inverse_distance': 3.18, 'angle': 1.88,\n", | |
" 'inverse_angle': 0.24, ('inverse_distance', 'inverse_angle'): -2.09, 'throughball_assist': 0.45,\n", | |
" 'throughball_2nd_assist': 0.64, 'assist_across_face': 0.31, 'cutback_assist': -0.15,\n", | |
" 'inverse_assist_distance': 2.18, 'assist_angle': 0.12, 'fastbreak': 0.23, 'counterattack': 0.18,\n", | |
" 'established_possession': 0.09, 'following_corner': -0.18, 'big_chance': 1.2,\n", | |
" 'following_error': 1.1, 'following_dribble': 0.39, 'dribble_distance': 0.14, 'rebound': 0.37,\n", | |
" 'game_state_sgn': 0.03, 'Bundesliga': 0.07, 'EPL': 0.05, 'LaLiga': 0.05, 'SerieA': -0.07}\n", | |
"\n", | |
" def eval(self, **kwargs):\n", | |
" x = kwargs['x']\n", | |
" y = kwargs['y']\n", | |
" tiro_en_el_area(x, y) # Si el tiro no esta en el area dera error\n", | |
" # y < 5.5 and (self.palo_izquierdo.x < x < centro_arco or (self.palo_izquierdo.x - 5.5 < x < palo_derecho.x + 5.5 and self._relative_angle(x, y) > 0.75))\n", | |
" if not kwargs.get('dribble_goalkeeper', False) and y < 5.5 and 100 < x < 101:\n", | |
" y = max(0.5, y)\n", | |
" empieza_carrera_x, empieza_carrera_y = kwargs.pop('start_run_x', None), kwargs.pop('start_run_y', None)\n", | |
" assistencia_x, asistencia_y = kwargs.pop('assist_x', None), kwargs.pop('assist_y', None)\n", | |
" \n", | |
"\n", | |
" parte_del_cuerpo = kwargs.pop('body_part', 'RightFoot')\n", | |
" kwargs['header'] = parte_del_cuerpo == 'header' or body_part == 'otherbodypart'\n", | |
" kwargs['otherbodypart'] = parte_del_cuerpo == 'otherbodypart'\n", | |
"\n", | |
" kwargs['game_state_sgn'] = np.sign(kwargs.get('game_state', 0))\n", | |
" kwargs[kwargs.pop('league', None)] = True\n", | |
" kwargs[kwargs.pop('pass_type', None)] = True\n", | |
" kwargs[kwargs.pop('attack_type', 'open_play')] = True\n", | |
" kwargs['counterattack'] = kwargs.get('counterattack', False) or kwargs.get('fastbreak', False)\n", | |
"\n", | |
" cruzado_o_cabeza = kwargs.get('cross', False) or kwargs['header']\n", | |
"\n", | |
" shot_params = {k: (float(v) if not isinstance(v, tuple) else v) for k, v in kwargs.iteritems()}\n", | |
" if cruzado_o_cabeza:\n", | |
" shot_params['distance'] = self._distance(x, y, self.goal_center, yards=True)\n", | |
" else:\n", | |
" shot_params['distance'] = y / YARD\n", | |
"\n", | |
" shot_params['angle'] = self._relative_angle(x, y)\n", | |
"\n", | |
" if start_run_x is not None and start_run_y is not None and not cross_or_header:\n", | |
" start_distance = max(0.5, start_run_y) / YARD\n", | |
" shot_params['dribble_distance'] = (start_distance - shot_params['distance']) / start_distance\n", | |
"\n", | |
" if assist_x is not None and assist_y is not None:\n", | |
" assist_x = float(assist_x)\n", | |
" assist_y = float(assist_y)\n", | |
" shot_params['assist_distance'] = self._distance(assist_x, assist_y, self.goal_center, yards=True)\n", | |
" shot_params['assist_angle'] = self._relative_angle(assist_x, assist_y)\n", | |
"\n", | |
" return log_reg_dot(self._beta(kwargs.get('dribble_goalkeeper', False),\n", | |
" kwargs.get('direct_free_kick', False),\n", | |
" kwargs.get('cross', False),\n", | |
" kwargs.get('header', False)),\n", | |
" shot_params, verbose=verbose)" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "lLf894-_iDkf", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"import itertools\n", | |
"\n", | |
"import numpy as np\n", | |
"\n", | |
"INCREDIBLY_BIG_NUMBER_OF_GOALS = 10\n", | |
"\n", | |
"\n", | |
"def number_of_goals_probabilities(p_shots):\n", | |
" \"\"\"\n", | |
" :param p_shots: array or list: Probabilidades de que cada tiro sea gol\n", | |
" :return: array donde la posicion de k tiene siempre la probabilidad de hacer gol\n", | |
" >>> number_of_goals_probabilities([0.1, 0.1])\n", | |
" array([ 0.81, 0.18, 0.01])\n", | |
" >>> number_of_goals_probabilities([0.8, 0.2, 0.2])\n", | |
" array([ 0.128, 0.576, 0.264, 0.032])\n", | |
" >>> number_of_goals_probabilities([0.1] * 15).shape\n", | |
" (11,)\n", | |
" >>> p_shots = np.random.exponential(0.1, 10)\n", | |
" >>> np.sum(number_of_goals_probabilities(p_shots) * np.arange(11)) - p_shots.sum() < 1e-3\n", | |
" True\n", | |
" \"\"\"\n", | |
" p_shots = np.sort(np.asarray(p_shots, dtype=np.float64))\n", | |
" p_compl = 1.0 - p_shots\n", | |
"\n", | |
" all_idx = set(range(len(p_shots)))\n", | |
"\n", | |
" p_goals = np.zeros(min(len(p_shots), INCREDIBLY_BIG_NUMBER_OF_GOALS) + 1)\n", | |
"\n", | |
" for k in xrange(len(p_goals)):\n", | |
" if k > 5:\n", | |
" binom_nom = len(p_shots) - np.arange(k)\n", | |
" binom_den = k - np.arange(k)\n", | |
" max_proba = np.prod(binom_nom * p_shots[-k:] / binom_den) * np.prod(p_compl[:-k])\n", | |
" # Debemos suponer que la probabilidad maxima es 1.5 veces mas pequeña que la probabilidad actual\n", | |
" # Esto puede ser sobrescrito solo si muchos tiros tienen la probabilidad de Gol Esperado >= 0.5 \n", | |
" # Pero en ese caso el equipo tiene mucha mas probabilidad de ganar que el oponente\n", | |
" max_proba_for_greater_k = max_proba * 3\n", | |
"\n", | |
" if max_proba_for_greater_k < 1e-3:\n", | |
" return p_goals\n", | |
"\n", | |
" for idx_scored in itertools.combinations(range(len(p_shots)), k):\n", | |
" scored_proba = np.prod(p_shots[list(idx_scored)])\n", | |
" idx_missed = list(all_idx - set(idx_scored))\n", | |
" missed_proba = np.prod(p_compl[idx_missed])\n", | |
"\n", | |
" p_goals[k] += scored_proba * missed_proba\n", | |
"\n", | |
" return p_goals\n", | |
"\n", | |
"\n", | |
"def match_result_probabilities(p_shots_home, p_shots_away):\n", | |
" \"\"\"\n", | |
" :param p_shots_home:Lista de probabilidad que para todos los equipos que juegan en casa hagan gol\n", | |
" :param p_shots_away: array or list: probabilidad para que cada equipo de otra parte haga gol\n", | |
" :return: Da un arreglo con 3 probabilidades (gana la casa, empate, o gana el invitado)\n", | |
" >>> match_result_probabilities([0.4], [0.3])\n", | |
" array([ 0.28, 0.54, 0.18])\n", | |
" >>> match_result_probabilities([0.1, 0.1], [0.05, 0.15])\n", | |
" array([ 0.1553, 0.6875, 0.1573])\n", | |
" >>> match_result_probabilities([0.1, 0.1, 0.1], [0.2, 0.1])\n", | |
" array([ 0.2024, 0.5886, 0.209 ])\n", | |
" \"\"\"\n", | |
" p_home = number_of_goals_probabilities(p_shots_home)\n", | |
" p_away = number_of_goals_probabilities(p_shots_away)\n", | |
"\n", | |
" p_home_win = 0.\n", | |
" p_draw = 0.\n", | |
" p_away_win = 0.\n", | |
" for goals_home in xrange(len(p_home)):\n", | |
" for goals_away in xrange(len(p_away)):\n", | |
" p = p_home[goals_home] * p_away[goals_away]\n", | |
" if goals_home > goals_away:\n", | |
" p_home_win += p\n", | |
" elif goals_home < goals_away:\n", | |
" p_away_win += p\n", | |
" else:\n", | |
" p_draw += p\n", | |
"\n", | |
" return np.round([p_home_win, p_draw, p_away_win], 4)" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "4zAJGyA5kB-z", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "phfeQLrCkDIk", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"# SEGUNDO APROACH\n", | |
"\n", | |
"Explicacion:\n", | |
"- Calcular el modo en que fue lanzada la pelota\n", | |
" - corner\n", | |
" - cabeza\n", | |
" - tiro libre\n", | |
" - juego abierto\n", | |
" - cruzado\n", | |
" - etc.\n", | |
"\n", | |
"Este sera nuestro X y nuestro y sera\n", | |
" - y: fue o no gol\n", | |
"\n", | |
"NO TENGO DATOS ESO FUE " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "_xdmqFffkFve", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"import statsmodels.api as sm\n", | |
"X = dataset[['corner', 'cabeza', 'tiro libre', 'juego abierto', 'cruzado', 'angulo']]\n", | |
"y = dataset.fue_gol.values\n", | |
"logit_model = sm.Logi(y, X)\n", | |
"retult = logit_model.fit()\n", | |
"print(result.summary2()) # Analiza los p valores p > 0.05\n", | |
"\n", | |
"# APLICA REGRESION LOGISTICA\n", | |
"from sklearn.linear_model import LogisticRegression\n", | |
"from sklearn.cross_validation import train_test_split\n", | |
"X_train X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)\n", | |
"log_r,fit(X_train, y_train)\n", | |
"# Si lo hiciste bien tendras un accuracy del 90%\n", | |
"# Y simplemente lo pasas por el dataset y predices\n", | |
"\n", | |
"def funcion_sigmoide(scores):\n", | |
" return 1 / (1 + np.exp(-scores))\n", | |
"\n", | |
"def regresion_logistica(X, y, epocas, learning_rate, intercecsion = False):\n", | |
" if intercecsion:\n", | |
" intercept = np.ones((features.shape[0], 1))\n", | |
" features = np.hstack((intercept, features))\n", | |
" \n", | |
" weights = np.zeros(features.shape[1])\n", | |
" \n", | |
" for paso in xrange(epocas):\n", | |
" scores = np.dot(features, weights)\n", | |
" predictions = funcion_sigmoide(scores)\n", | |
"\n", | |
" output_error_signal = target - predictions\n", | |
" gradient = np.dot(features.T, output_error_signal)\n", | |
" weights += learning_rate * gradient\n", | |
" \n", | |
" if paso % 10000 == 0:\n", | |
" print log_likelihood(X, y, weights)\n", | |
" \n", | |
" return weights\n", | |
"\n", | |
"def log_likelihood(X, y, pesos):\n", | |
" scores = np.dot(X, pesos)\n", | |
" ll = np.sum( y*scores - np.log(1 + np.exp(scores)) )\n", | |
" return ll\n", | |
"\n", | |
"weights = regresion_logistica(X, y,\n", | |
" epocas = 300000, learning_rate = 5e-5, add_intercept=True)" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
} | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment