Как перебрать класс матрицы 4 на 4 NumPy? - PullRequest
0 голосов
/ 24 апреля 2018

Я пытаюсь придумать модель, которая оптимизирует ожидаемое количество голов в футбольном матче.Я разделил матч на 4 части времени.Начальная вероятность того, что две команды (T1 и T2) забьют или не забьют гол, указана и остается неизменной в каждой временной части.Предполагается, что только один гол может быть забит за часть времени.Для каждой временной части мне нужно обработать и построить матрицу распределения для оценки (T1, T2 или Нет цели) до конца временной части.Вышеприведенные матрицы (v ^ 0 и v ^ 1) показывают изменение от временной части 0, заданную вероятность в начале совпадения, а v ^ 1 - распределение от начала до конца временной части 1 (v ^ 1),Полученные вероятности будут использоваться для сравнения коэффициентов, данных в начале матча со ставкой.

import pandas as pd
data = {'Score': ['Goal 0', 'Goal 1', 'Goal 2', 'Goal 3'],
             'Goal 0': [0.97,0.02,0,0], 'Goal 1': [0.01,0,0,0], 
             'Goal 2': [0,0,0,0], 'Goal 3': [0,0,0,0]}
df = pd.DataFrame(data, columns = ['Score', 'Goal 0', 'Goal 1', 'Goal 2', 'Goal 3']) 
v = df.drop('Score', axis=1).as_matrix()

В конце первой части времени моя матрица должна выглядеть следующим образом:

v^1 = ([0.9409, 0.0097, 0.0001, 0],
             [0.0194, 0.0005, 0, 0],
             [0.0004, 0, 0, 0],
             [0, 0, 0, 0]])

А вот код, который я использовал, но безрезультатно.

def sweep(v_1):
    for i in range(4):
            for j in range(4):
v_tmp = np.zeros_like(v_K)

                if i == 0: v_tmp[i,j] = v_k[i, j-1] * 0.02
                if j == 0: v_tmp[i,j] = v_k[i-1, j] * 0.01
            else:
                v_tmp[i,j] = (v_k[i-1, j]) * 0.02 + (v_k[i, j]) * 0.97 + (v_k[i, j-1]) * 0.01  

    for i in range(4):
        sweep(v_1)

1 Ответ

0 голосов
/ 24 апреля 2018

Не моя лучшая работа, но это должно делать то, что вы описали:

import numpy as np

def sweep(v_k, k):

    v_tmp = np.zeros_like(v_k)

    for i in range(4):
        for j in range(4):
            if i == 0 and j == 0:
                v_tmp[i,j] = v_k[i,j]**(k+1)
            elif i == 0 and j > 0:
                v_tmp[i,j] = v_k[i,j-1]*0.02
            elif j == 0 and i > 0:
                v_tmp[i,j] = v_k[i-1,j]*0.01
            elif i > 0 and j > 0:
                v_tmp[i,j] = v_k[i-1,j]*0.02 + v_k[i,j]*0.97 + v_k[i,j-1]*0.01

    return v_tmp

v_k = np.array([
    [0.97, 0.02, 0, 0],
    [0.01, 0.00, 0, 0],
    [0.00, 0.00, 0, 0],
    [0.00, 0.00, 0, 0]
    ])

for k in range(3):
    v_k[:,:] = sweep(v_k, k)[:,:]

print(v_k)

Результат:

[[8.32972005e-01 1.88180000e-02 3.88000000e-04 7.76000000e-06]
 [9.40900000e-03 1.42590000e-03 3.00700000e-05 2.90000000e-07]
 [9.70000000e-05 3.10400000e-05 3.70000000e-07 0.00000000e+00]
 [9.70000000e-07 2.30000000e-07 0.00000000e+00 0.00000000e+00]]

Обратите внимание, что результат транспонирован относительно вашего «ожидаемого» результата. Вы можете попробовать это самостоятельно, выполнив for k in range(1) вместо 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...